一、概述
1.SDIO的定義 SDIO在SD標(biāo)準(zhǔn)上定義了一種外設(shè)接口。目前,SDIO主要有兩類應(yīng)用——可移動(dòng)和不可移動(dòng)。可移動(dòng)設(shè)備作為Palm和Windows Mobile的擴(kuò)展設(shè)備,用來(lái)增加藍(lán)牙、照相機(jī)、GPS和802.11b功能。不可移動(dòng)設(shè)備遵循相同的電氣標(biāo)準(zhǔn),但不要求符合物理標(biāo)準(zhǔn)。某些手機(jī)內(nèi)包含通過(guò)SDIO連接CPU的802.11芯片。此舉將“珍貴”的I/ O管腳資源用于更重要的功能。 藍(lán)牙、照相機(jī)、GPS和802.11b設(shè)備有專為它們定義的應(yīng)用規(guī)范。這些應(yīng)用規(guī)范與為PCI和USB設(shè)備定義的類規(guī)范很相像。它們?cè)试S任何宿主設(shè)備與任意外設(shè)“通話”,只要它們都支持應(yīng)用規(guī)范。
SDIO和SD卡規(guī)范間的一個(gè)重要區(qū)別是增加了低速標(biāo)準(zhǔn)。SDIO卡只需要SPI和1位SD傳輸模式。低速卡的目標(biāo)應(yīng)用是以最小的硬件開支支持低速I/ O能力。低速卡支持類似調(diào)制解調(diào)器、條碼掃描儀和GPS接受器等應(yīng)用。對(duì)“組合”卡(存儲(chǔ)器+ SDIO)而言,全速和4位操作對(duì)卡內(nèi)存儲(chǔ)器和SDIO部分都是強(qiáng)制要求的。
2.SDIO的功能 轉(zhuǎn)換設(shè)備的能力 SD標(biāo)準(zhǔn)有很大的彈性,比方說(shuō),SD插槽不僅能插入內(nèi)存卡。SDIO卡是一種界面,即由使用標(biāo)準(zhǔn)SD卡插槽來(lái)擴(kuò)展設(shè)備的功能,讓設(shè)備擁有新的功能。 新功能列舉如下:GPS 相機(jī) Wi-Fi 調(diào)頻廣播 以太網(wǎng) 條形碼讀卡器 藍(lán)牙; 將與SD memory card同樣的終端形狀的卡槽利用于擴(kuò)張卡的規(guī)格。把對(duì)應(yīng)SDIO卡槽(插口)稱為SDIO卡,擴(kuò)張卡稱為SDIO卡。 是為了在個(gè)人電腦和PDA等中添加功能而使用SD卡的規(guī)格,由于可以使用比PC卡形狀還小的卡和插槽,相比于筆記本電腦,更多采用于小巧的PDA中。主要銷售的產(chǎn)品有,面向PDA的PHS通訊卡和藍(lán)牙通訊卡,無(wú)線網(wǎng)卡,小型數(shù)碼相機(jī)等。 為了使用SDIO,必須要有對(duì)應(yīng)的插槽,數(shù)碼相機(jī)等memory card的專用縫兒插槽不對(duì)應(yīng)SDIO卡。SDIO插槽中能夠插入SD memory card來(lái)讀寫。 SD/SDIO MMC卡主機(jī)接口(SDIO)提供APB2外設(shè)總線與多媒體卡(MMC)、SD卡、SDIO卡以及CE-ATA設(shè)備之間的接口。 3.SDIO具有如下主要特性: 完全兼容多媒體卡系統(tǒng)規(guī)范版本4.2。卡支持三種不同數(shù)據(jù)總線模式:1位(默認(rèn))、4位和8位。 完全兼容先前版本的多媒體卡(向前兼容性)。 完全兼容SD存儲(chǔ)卡規(guī)范版本2.0。 完全兼容SDI/O卡規(guī)范版本2.0:卡支持兩種不同數(shù)據(jù)總線模式:1位(默認(rèn))和4位。 完全支持CE-ATA功能(完全符合CE-ATA數(shù)字協(xié)議版本1.1)。 對(duì)于8位模式,數(shù)據(jù)傳輸高達(dá)48MHz。 數(shù)據(jù)和命令輸出使能信號(hào),控制外部雙向驅(qū)動(dòng)程序。
4.SD卡識(shí)別過(guò)程: 多媒體卡和SD卡的卡識(shí)別過(guò)程有所不同。對(duì)于多媒體,識(shí)別過(guò)程是以時(shí)鐘速率開始。SDIO_CMD線輸出驅(qū)動(dòng)器是開樓引腳,在此識(shí)別過(guò)程中允許并行的卡操作。對(duì)準(zhǔn)過(guò)程以如下方式完成: (1)激活總線。 (2)SDIO卡主機(jī)廣播SEND_OP_COND(CMD1)以接收運(yùn)行條件。 (3)卡以其運(yùn)行條件寄存器的內(nèi)容進(jìn)行響應(yīng)。 (4)不兼容的卡將被置于無(wú)效狀態(tài)。 (5)SDIO卡主機(jī)向所有有效廣播ALL_SEND_CID(CMD2)。 (6)這些卡將發(fā)回其唯一的卡識(shí)別號(hào)(CID)并進(jìn)入識(shí)別狀態(tài)。 (7)SDIO卡主機(jī)向某個(gè)地址的有效卡發(fā)出SET_RELATIVE_ADDR(CMD3)。這一新地址稱為相對(duì)卡地址(RCA);它比CID更短,可對(duì)卡進(jìn)行尋址。分配的卡變?yōu)榇龣C(jī)狀態(tài)。SDIO卡主機(jī)可以重新發(fā)出此命令以更改RCA。卡的RCA是最后分配的值。 (8)SDIO卡主機(jī)對(duì)所有有效卡重復(fù)步驟5到7。 二、硬件電路 圖13_0 SD卡槽電路圖 三、實(shí)驗(yàn)原理 STM32F407上帶有SDIO控制器,iCore3核心板上將SDIO連接到TF卡座上。本實(shí)驗(yàn)將Micro SD卡插入TF卡座上即可。硬件連接示意圖如下: 圖13_1 實(shí)驗(yàn)原理圖 四、源代碼 1. 主函數(shù) - /*
- * Name : main
- * Description : ---
- * Author : ysloveivy.
- *
- * History
- * --------------------
- * Rev : 0.00
- * Date : 12/01/2015
- *
- * create.
- * --------------------
- */int main(void)
- {
- int i;
- led.initialize();
- usart4.initialize(115200);
- usart4.printf("\x0c"); //清屏
- usart4.printf("\033[1;32;40m"); //設(shè)置字體終端為綠色
- usart4.printf("\r\n\r\nhello! I am iCore3!\r\n\r\n\r\n");
- //判斷SD卡是否初始化
- if(SD_Init() != 0){
- usart4.printf("SD ERROR!\r\n");
- while(1){
- for(i = 0;i < 10000000;i++);
- LED_RED_ON;
- for(i = 0;i < 10000000;i++);
- LED_RED_OFF;
- }
- }
- //輸出SD卡的類型
- switch(SDCardInfo.CardType){
- case SDIO_STD_CAPACITY_SD_CARD_V1_1:
- usart4.printf("SDCardType\t\t:SDIO_STD_CAPACITY_SD_CARD_V1_1\r\n");
- break;
- case SDIO_STD_CAPACITY_SD_CARD_V2_0:
- usart4.printf("SDCardType\t\t:SDIO_STD_CAPACITY_SD_CARD_V2_0\r\n");
- break;
- case SDIO_HIGH_CAPACITY_SD_CARD:
- usart4.printf("SDCardType\t\t:SDIO_HIGH_CAPACITY_SD_CARD\r\n");
- break;
- case SDIO_MULTIMEDIA_CARD:
- usart4.printf("SD CardType\t:SDIO_MULTIMEDIA_CARD\r\n");
- break;
- }
- //輸出SD卡的參數(shù)
- usart4.printf("SD CardCapacity\t\t: %dMB\r\n",(unsigned long int)(SDCardInfo.CardCapacity >> 20));
- usart4.printf("SDCardBlockSize\t: %dByte\r\n",SDCardInfo.CardBlockSize);
- usart4.printf("SD RCA \t\t\t: %d\r\n",SDCardInfo.RCA);
- usart4.printf("SDManufacturerID\t: %d\r\n",SDCardInfo.SD_cid.ManufacturerID);
- while(1){
- for(i = 0;i < 10000000;i++);
- LED_GREEN_ON;
- for(i = 0;i < 10000000;i++);
- LED_GREEN_OFF;
- }
- }
復(fù)制代碼2.SDIO配置結(jié)構(gòu)體 - SDIO_InitStructure.SDIO_ClockDiv = SDIO_TRANSFER_CLK_DIV + 2;
- SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising;
- SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Disable;
- SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;
- SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b;
- SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;
- SDIO_Init(&SDIO_InitStructure);
復(fù)制代碼3.SD卡初始化程序 - SD_Error SD_Init(void)
- {
- __IO SD_Error errorstatus = SD_OK;
- NVIC_InitTypeDef NVIC_InitStructure;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
- // SDIO Interrupt ENABLE
- NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- // DMA2 STREAMx Interrupt ENABLE
- NVIC_InitStructure.NVIC_IRQChannel = SD_SDIO_DMA_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
- NVIC_Init(&NVIC_InitStructure);
- /* SDIO Peripheral Low Level Init */
- SD_LowLevel_Init();
- SDIO_DeInit();
- errorstatus = SD_PowerON();
- if (errorstatus != SD_OK)
- {
- /*!< CMD Response TimeOut (wait for CMDSENT flag) */
- return(errorstatus);
- }
- errorstatus = SD_InitializeCards();
- if (errorstatus != SD_OK)
- {
- /*!< CMD Response TimeOut (wait for CMDSENT flag) */
- return(errorstatus);
- }
復(fù)制代碼五、實(shí)驗(yàn)現(xiàn)象 在終端顯示屏上可以看到Micro SD卡的信息,如下圖: 圖13_2 實(shí)驗(yàn)現(xiàn)象顯示圖 六 、代碼包下載 網(wǎng)盤:http://pan.baidu.com/s/1hqM787E
|