亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? mci_lpc23xx.c

?? LPC23XX USB讀寫(xiě)SD卡 例程 來(lái)自MCU123開(kāi)發(fā)板配套光盤(pán)
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/*----------------------------------------------------------------------------
 *      R T L  -  F l a s h   F i l e   S y s t e m
 *----------------------------------------------------------------------------
 *      Name:    MCI_LPC23XX.C 
 *      Purpose: Multimedia Card Interface Driver for LPC23xx
 *      Rev.:    V3.05 / 22-mar-2007
 *----------------------------------------------------------------------------
 *      This code is part of the RealView Run-Time Library.
 *      Copyright (c) 2004-2007 KEIL - An ARM Company. All rights reserved. 
 *---------------------------------------------------------------------------*/

#include <File_Config.h>
#include <LPC23xx.h>                 /* LPC23xx/24xx definitions             */
#include "MCI_LPC23xx.h"

/* Local variables */
static U8  CardType;
static U16 CardRCA;
static MMCFG mmc_cfg;

/*----------------------------------------------------------------------------
 *      MMC Driver Functions
 *----------------------------------------------------------------------------
 *  Required functions for MMC driver module:
 *   - BOOL mci_init ()
 *   - BOOL mci_read_sect (U32 sect, U8 *buf)
 *   - BOOL mci_write_sect (U32 sect, U8 *buf)
 *   - BOOL mmc_read_config (MMCFG *cfg)
 *---------------------------------------------------------------------------*/

/* Local Function Prototypes */
static void mci_set_speed (U32 speed);
static void mci_bus_mode (U32 mode);
static BOOL mci_send_acmd (void);
static BOOL mci_set_address (void);
static BOOL mci_read_cid (void);
static BOOL mci_read_csd (void);
static BOOL mci_select_card (void);
static BOOL mci_set_bus_4bit (void);
static BOOL mci_set_block_len (void);
static BOOL mci_cmd_read_block (U32 block);
static BOOL mci_cmd_write_block (U32 block);
static U32  mci_read_status (void);
static BOOL mci_send_stop (void);
static U32  mci_command (U8 cmd, U32 arg, U32 resp,  U32 *rp);
static void mci_dma_start (U32 mode, U8 *buf);

/*--------------------------- mci_init --------------------------------------*/

BOOL mci_init (void) {
   /* Initialize and enable the Flash Card. */
   U32 i,rstat,rval[4];

   /* Power Up the MCI and DMA controller. */
   PCONP |= 0x30000000;

   /* Enable MCI Pins on P0,P2. */
   PINSEL1 &= ~0x00003FC0;
   PINSEL1 |=  0x00002A80;
   PINSEL4 &= ~0x0FC00000;
   PINSEL4 |=  0x0A800000;

   /* Clear all pending interrupts. */
   MCI_COMMAND   = 0;
   MCI_DATA_CTRL = 0;
   MCI_CLEAR     = 0x7FF;

   /* Power up, switch on VCC for the Flash Card. */
   MCI_POWER  = 0x02;
   for (i = 0; i < 50000; i++);

   mci_set_speed (LOW_SPEED);

   /* Power on the Flash Card. */
   MCI_POWER |= 0x01;
   for (i = 0; i < 50000; i++);

   /* Reset the card, send CMD0. */
   mci_command (GO_IDLE_STATE, 0, RESP_NONE, NULL);

   /* Set Open Drain output control for MMC */
   mci_bus_mode (OPEN_DRAIN_MODE);

   CardType = CARD_NONE;
   /* First try MMC, send CMD1. */
   for (i = 0; i < 100; i++) {
      rstat = mci_command (SEND_OP_COND, OCR_INDEX, RESP_SHORT, &rval[0]);
      if (!(rstat & MCI_CMD_TIMEOUT) && rval[0] & 0x80000000) {
         CardType = CARD_MMC;
         break;
      }
   }

   if (CardType == CARD_NONE) {
      /* Check for SD card, clear Open Drain output control. */
      mci_bus_mode (PUSH_PULL_MODE);
      for (i = 0; i < 500; i++) {
         if (mci_send_acmd () == __TRUE) {
            rstat = mci_command (SEND_APP_OP_COND, 
                                 OCR_INDEX, RESP_SHORT, &rval[0]);
            if (!(rstat & MCI_CMD_TIMEOUT) && rval[0] & 0x80000000) {
               /* OK, SD card initialized. */
               CardType = CARD_SD;
               break;
            }
         }
      }
   }
   if (CardType == CARD_NONE) {
      /* Failed, no card found. */
      goto fail;
   }

   /* Initialize the Card to SD/MMC mode. */
   if (mci_read_cid () == __FALSE) {
      goto fail;
   }
   if (mci_set_address () == __FALSE) {
      goto fail;
   }

   /* Disable Open Drain mode for MMC. */
   if (CardType == CARD_MMC) {
      mci_bus_mode (PUSH_PULL_MODE);
   }

   /* Data Transfer Mode, end of Card-Identification Mode. */
   mci_set_speed (HIGH_SPEED);

   if (mci_read_csd () == __FALSE) {
      goto fail;
   }
   if (mci_select_card () == __FALSE) {
      goto fail;
   }

   if (CardType == CARD_SD) {
      /* Use wide 4-bit bus for SD */
      MCI_CLOCK |= 0x0800;
      for (i = 0; i < 100; i++);
      if (mci_set_bus_4bit () == __FALSE) {
         /* Failed to enable 4-bit bus. */
         goto fail;
      }
   }
   /* Set block length to 512 bytes. */
   if (mci_set_block_len () == __FALSE) {
fail: MCI_POWER = 0x00;
      return (__FALSE);
   }

   /* Success, card initialized. */
   return (__TRUE);
}


/*--------------------------- mci_set_speed ---------------------------------*/

static void mci_set_speed (U32 speed) {
   /* Set a MCI clock speed to desired value. */
   U32 i,clkdiv;

   if (speed == HIGH_SPEED) {
      /* Max. 20 MBit used for Data Transfer. */
      clkdiv = 1;
   }
   else {
      /* Max. 400 kBit used in Card Initialization. */
      clkdiv = 120;
   }
   MCI_CLOCK = (MCI_CLOCK & ~0xFF) | 0x300 | clkdiv;

   /* delay 3MCLK + 2PCLK before next write */
   for ( i = 0; i < 100; i++ );
}


/*--------------------------- mci_bus_mode ----------------------------------*/

static void mci_bus_mode (U32 mode) {
   /* Set MCI Bus mode to Open Drain or Push Pull. */
   U32 i;

   if (mode == OPEN_DRAIN_MODE) {
      MCI_POWER |= 0x40;
   }
   else {
      MCI_POWER &= ~0x40;
   }
   /* A small delay after switching mode. */
   for (i = 0; i < 100; i++);
}


/*--------------------------- mci_send_acmd ---------------------------------*/

static BOOL mci_send_acmd (void) {
   /* Send CMD55 to enable ACMD */
   U32 arg,rstat,rval;

   arg = 0;
   if (CardType == CARD_SD) {
      /* Use address from SET_RELATIVE_ADDR. */
      arg = CardRCA << 16;
   }
   rstat = mci_command (APP_CMD, arg, RESP_SHORT, &rval);
   if (rstat == 0 && (rval & STAT_ACMD_ENABLE)) {
      return (__TRUE);
   }
   return (__FALSE);
}


/*--------------------------- mci_set_address -------------------------------*/

static BOOL mci_set_address (void) {
   /* Set Relative Address, send CMD3 after CMD2. */
   U32 i,arg,rstat,rval;

   arg = 0;
   if (CardType == CARD_MMC) {
      /* Fix the RCA address for MMC card. */
      arg = 0x00010000;
   }

   for (i = 0; i < 20; i++) {
      rstat = mci_command (SET_RELATIVE_ADDR, arg, RESP_SHORT, &rval);
      if (!(rstat & MCI_CMD_TIMEOUT) && (rval & 0x0F00) == 0x0500) {
         /* Response is back and correct. */
         CardRCA = rval >> 16;
         return (__TRUE);
      }
   }
   return (__FALSE);
}


/*--------------------------- mci_read_cid ----------------------------------*/

static BOOL mci_read_cid (void) {
   /* Check CID, send CMD2 after CMD1 (MMC) or ACMD41 (SD). */
   U32 i,rstat,v,rval[4];

   for (i = 0; i < 20; i++) {
      rstat = mci_command (ALL_SEND_CID, 0, RESP_LONG, &rval[0]);
      if (!(rstat & MCI_CMD_TIMEOUT)) {
         /* Response is back and correct. */
         if (CardType == CARD_SD) {
            /* Serial Number for SD Card. */
            v = (rval[2] << 8)  | (rval[3] >> 24);
         }
         else {
            /* Serial Number for MMC Card. */
            v = (rval[2] << 16) | (rval[3] >> 16);
         }
         mmc_cfg.sernum = v;
         return (__TRUE);
      }
   }
   mmc_cfg.sernum = 0;
   return (__FALSE);
}


/*--------------------------- mci_read_csd ----------------------------------*/

static BOOL mci_read_csd (void) {
   /* Send Card Specific Data, send CMD9 after CMD3. */
   U32 i,arg,rstat,v,m,rval[4];

   arg = 0x00010000;
   if (CardType == CARD_SD) {
      /* Use address from SET_RELATIVE_ADDR. */
      arg = CardRCA << 16;
   }

   for (i = 0; i < 20; i++) {
      rstat = mci_command (SEND_CSD, arg, RESP_LONG, &rval[0]);
      if (rstat == 0) {
         /* Response is back and correct, Read Block length */
         v = (rval[1] >> 16) & 0x0F;
         mmc_cfg.read_blen = 1 << v;

         /* Write Block length */
         v = (rval[3] >> 22) & 0x0F;
         mmc_cfg.write_blen = 1 << v;

         /* Total Number of blocks */
         v = ((rval[1] << 2) | (rval[2] >> 30)) & 0x0FFF;
         m =  (rval[2] >> 15) & 0x07;
         mmc_cfg.blocknr = (v + 1) << (m + 2);

         /* File Format information */
         v = (rval[3] >> 8) & 0x83;
         switch (v) {
            case 0x00:
            case 0x03:
               mmc_cfg.format = HDD_TYPE;
               break;
            case 0x01:
               mmc_cfg.format = FLOPPY_TYPE;
               break;
            default:
               mmc_cfg.format = UNKNOWN_TYPE;
               break;
         }
         return (__TRUE);
      }
   }
   return (__FALSE);
}


/*--------------------------- mci_select_card -------------------------------*/

static BOOL mci_select_card (void) {
   /* Select the Card, send CMD7 after CMD9, inter-change state */
   /* between STBY and TRANS after this command. */
   U32 i,arg,rstat,rval;

   arg = 0x00010000;
   if (CardType == CARD_SD) {
      /* Use address from SET_RELATIVE_ADDR. */
      arg = CardRCA << 16;

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产91精品一区二区麻豆网站 | 国产精品麻豆99久久久久久| 成人免费高清视频在线观看| 亚洲精品亚洲人成人网在线播放| 欧美日韩不卡在线| 粉嫩av一区二区三区| 亚洲成人动漫在线观看| 日本一区二区三区在线不卡| 欧美吞精做爰啪啪高潮| 国产经典欧美精品| 婷婷开心激情综合| 中文字幕一区不卡| 日韩视频永久免费| 欧美综合久久久| 成a人片国产精品| 精品在线一区二区三区| 亚洲午夜久久久| 成人欧美一区二区三区白人| 精品久久久久久综合日本欧美 | 经典三级在线一区| 亚瑟在线精品视频| 亚洲人成人一区二区在线观看 | 精品国产乱码久久| 欧美日韩成人在线| 在线免费观看日本一区| av在线这里只有精品| 国产乱淫av一区二区三区| 午夜精品福利一区二区蜜股av| 国产精品电影院| 中文字幕免费一区| 久久综合色婷婷| 日韩欧美国产三级| 337p亚洲精品色噜噜| 欧美色精品在线视频| 日本二三区不卡| av爱爱亚洲一区| 不卡电影免费在线播放一区| 国产传媒久久文化传媒| 国产制服丝袜一区| 久久99精品一区二区三区| 日韩综合小视频| 亚洲国产精品视频| 亚洲综合在线免费观看| 中文字幕一区在线| 亚洲欧美日韩国产中文在线| 国产精品黄色在线观看| 中文字幕中文字幕一区| 国产精品久久久久久久久晋中| 国产日韩视频一区二区三区| 国产日韩欧美一区二区三区综合| 久久精品人人做| 国产欧美一区二区精品忘忧草 | av在线播放不卡| 波多野结衣视频一区| 97久久超碰国产精品| 一本色道**综合亚洲精品蜜桃冫| 99re成人精品视频| 91福利国产成人精品照片| 在线观看日韩毛片| 欧美日韩二区三区| 日韩欧美国产三级| 久久亚洲综合色| 国产精品三级av| 亚洲精品一二三区| 丝袜诱惑制服诱惑色一区在线观看| 婷婷综合久久一区二区三区| 蜜桃视频一区二区三区在线观看| 精品一区二区精品| 成人免费视频视频在线观看免费| 成人高清免费在线播放| 在线精品视频免费播放| 91麻豆精品91久久久久久清纯| 日韩欧美一级片| 中文久久乱码一区二区| 樱桃视频在线观看一区| 日本va欧美va精品发布| 国产精品自产自拍| 一本色道久久加勒比精品| 在线电影欧美成精品| 精品对白一区国产伦| 亚洲欧美激情插 | 精品国产一区二区亚洲人成毛片| 国产午夜久久久久| 一区二区免费在线播放| 久久国产尿小便嘘嘘尿| av午夜精品一区二区三区| 欧美色视频在线| 久久久久国产精品免费免费搜索| 亚洲色图欧美激情| 久久精品国产精品亚洲红杏| 丁香网亚洲国际| 欧美老人xxxx18| 国产精品人人做人人爽人人添 | 丝袜脚交一区二区| 国产成人无遮挡在线视频| 在线视频欧美区| 久久蜜桃一区二区| 亚洲成av人**亚洲成av**| 国产精品伊人色| 欧美日韩免费电影| 中文字幕一区二区三| 免费观看一级欧美片| 99re6这里只有精品视频在线观看| 91精品国产91久久久久久一区二区 | 99r精品视频| 日韩欧美一区二区视频| 亚洲男同性恋视频| 国产精品综合久久| 91精品国产一区二区三区香蕉| 国产精品情趣视频| 蜜桃av噜噜一区| 色久综合一二码| 中文字幕 久热精品 视频在线 | 国产精品亚洲视频| 91精品国产综合久久福利软件| 亚洲视频香蕉人妖| 国产成人av福利| 日韩一区二区免费在线电影| 夜夜爽夜夜爽精品视频| 顶级嫩模精品视频在线看| 日韩欧美卡一卡二| 午夜av电影一区| 在线影视一区二区三区| 国产精品免费丝袜| 国产精品一区在线观看你懂的| 在线播放亚洲一区| 夜夜爽夜夜爽精品视频| www.久久精品| 国产精品污www在线观看| 国产曰批免费观看久久久| 欧美一级爆毛片| 日韩福利电影在线| 欧美精品乱码久久久久久按摩| 《视频一区视频二区| 成人免费高清在线| 国产精品毛片久久久久久久| 国产精品一区免费在线观看| 精品国偷自产国产一区| 日韩成人午夜精品| 欧美日韩一区三区四区| 亚洲午夜免费视频| 欧美色中文字幕| 午夜免费久久看| 欧美欧美欧美欧美| 日韩国产欧美三级| 日韩一区二区不卡| 美女免费视频一区二区| 日韩精品一区二区三区视频在线观看| 午夜久久电影网| 欧美一区二区私人影院日本| 欧美二区三区的天堂| 一区二区久久久久| 欧美色国产精品| 日本欧美一区二区| 精品国产乱码久久久久久免费 | 7777女厕盗摄久久久| 日本美女视频一区二区| 欧美一二三区在线观看| 久久精品国产亚洲a| 欧美精品一区二区久久婷婷| 国产电影一区在线| 国产精品国产三级国产普通话三级| 99精品视频一区| 一卡二卡欧美日韩| 777色狠狠一区二区三区| 久久精品国产99久久6| 国产亚洲欧美日韩俺去了| 成人高清视频在线观看| 亚洲与欧洲av电影| 日韩一区二区三区电影| 精品国产91久久久久久久妲己| 精品在线一区二区三区| 国产精品乱人伦中文| 色视频成人在线观看免| 欧美aaaaaa午夜精品| 久久蜜桃av一区精品变态类天堂| 成人h动漫精品| 亚洲bt欧美bt精品| 国产亚洲一区二区三区四区| 91美女片黄在线观看91美女| 午夜视频在线观看一区二区 | 丰满白嫩尤物一区二区| 一区二区三区四区亚洲| 欧美一区二区三区免费| 波多野结衣在线aⅴ中文字幕不卡| 亚洲午夜视频在线观看| 欧美精品一区二区三区蜜桃| 91丨porny丨国产| 九九国产精品视频| 亚洲天堂a在线| 日韩精品一区在线观看| 99视频热这里只有精品免费| 日韩av在线播放中文字幕| 中文字幕av免费专区久久| 51精品秘密在线观看| 本田岬高潮一区二区三区| 婷婷开心激情综合| 自拍偷拍国产亚洲| 欧美aⅴ一区二区三区视频| 日韩美女精品在线|