簡介
AT32 MCU的主機模塊(SDIO)在AHB外設(shè)總線和多媒體卡(MMC)、SD存儲卡、SDIO卡間提供了操作接口。SD儲存卡和SDIO卡的系統(tǒng)規(guī)格書可以通過SD卡協(xié)議網(wǎng)站。多媒體卡系統(tǒng)規(guī)格書由MMCA技術(shù)委員會發(fā)布,可以在多媒體卡協(xié)會的網(wǎng)站上獲得。1、SD Card:SDSC/SDHC/SDXC,支持的卡最大容量不同,支持1bit或4bit傳輸,0-25MHz或0-50MHz的傳輸模式。2、MMC Card:支持1bit,4bit或8bit傳輸,0-20MHz,0-26MHz或0-52MHz的傳輸模式。3、SDIO Card:一種使用SD接口協(xié)議,支持多功能的卡,比如wifi卡,GPS卡,藍牙卡等等。
SDIO主要結(jié)構(gòu)
SDIO包含4個部分:1、SDIO適配器模塊:由控制單元、命令單元和數(shù)據(jù)單元所組成,實現(xiàn)所有MMC/SD/SDIO卡的相關(guān)功能,如時鐘的產(chǎn)生、命令和數(shù)據(jù)的傳送
- 控制單元:管理并產(chǎn)生時鐘信號
- 命令單元:管理命令的傳輸
- 數(shù)據(jù)單元:管理數(shù)據(jù)的傳輸
2、AHB接口:產(chǎn)生中斷和DMA請求信號3、適配器寄存器:SDIO寄存器4、BUF:用于數(shù)據(jù)傳輸校準(zhǔn)功能圖1. SDIO框圖
- 所有數(shù)據(jù)線配置為復(fù)用推挽模式。SDIO_CMD和SDIO_D[7:0]可雙向通信,應(yīng)外接上拉電阻或內(nèi)部上拉。
- SDIO使用一個時鐘信號:SDIO適配器時鐘(SDIOCLK=AHB總線時鐘(HCLK))。
- 復(fù)位后默認(rèn)情況下SDIO_D0用于數(shù)據(jù)傳輸。初始化后主機可以改變數(shù)據(jù)總線的寬度。可選1bit(SDIO_D0)、4bit(SDIO_D[3:0])、8bit(SDIO_D[7:0])三種數(shù)據(jù)總線的寬度。
表1. SDIO外部引腳說明
SDIO總線通信
總線上的通信是通過傳送命令和數(shù)據(jù)實現(xiàn)。
1、在多媒體卡/SD/SDIO總線上的基本操作是命令/響應(yīng)結(jié)構(gòu)。2、在SD/SDIO Card上傳送的數(shù)據(jù)是只能以數(shù)據(jù)塊的形式傳輸;在MMC Card上傳送的數(shù)據(jù)是以數(shù)據(jù)塊或數(shù)據(jù)流的形式傳輸。圖2. SDIO命令“無響應(yīng)”和“有響應(yīng)”操作圖3. SDIO(多)數(shù)據(jù)塊讀操作圖4. SDIO(多)數(shù)據(jù)塊寫操作注意:當(dāng)有Busy(繁忙)信號時,SDIO(SDIO_D0被拉低)將不會發(fā)送任何數(shù)據(jù)。圖5. SDIO MMC卡數(shù)據(jù)流讀操作圖6. SDIO MMC卡數(shù)據(jù)流寫操作
SDIO功能
SDIO時鐘
1)SDIO_CK是MCU端輸出到卡的時鐘:每個時鐘周期在命令和數(shù)據(jù)線上傳輸1bit命令或數(shù)據(jù)。2)SDIO_CK信號的兩下降沿之間為一個時鐘周期,硬件在上升沿捕獲數(shù)據(jù)。3)當(dāng)啟動了省電模式并且卡總線處于空閑狀態(tài)(命令通道和數(shù)據(jù)通道子單元進入空閑階段后的8個時鐘周期)。圖7. 開啟省電模式的命令/響應(yīng)波形圖4)支持多達10位分頻系數(shù),也就是1024級分頻,此時可得SDIO_CK頻率=SDIOCLK/[CLKPSC[9:0]+2]。5)可以使用bypass模式,輸出一個不分頻的時鐘,SDIO_CK頻率=SDIOCLK。6)硬件流控模式,可在數(shù)據(jù)傳輸即將發(fā)生上溢或者下溢的時候,通過停止SDIO_CK防止溢出。7)可以配置CLKEDG bit來選擇時鐘的產(chǎn)生。SDIO_CK可實現(xiàn)略微偏移(半個SDIOCLK)。8)應(yīng)用時,SD卡初始化的時候SDIO_CK不能大于400kHZ,之后的時鐘頻率由對應(yīng)卡型號限制。
SDIO時鐘配置相關(guān)函數(shù)
配置SDIO時鐘
使能省電模式
使能SDIO時鐘bypass模式使能硬件流控模式設(shè)置SDIO電源使能SDIO時鐘輸出SDIO時鐘初始化舉例:
命令通道
1)命令通道單元通過SDIO_CMD向卡發(fā)送命令并從卡接收響應(yīng)。2)命令超時,即等待卡響應(yīng)的時間,固定為64個SDIO_CK時鐘周期。這個由通信協(xié)議決定,固定不可配置。3)可以置位WAITPEND bit,命令只有在數(shù)據(jù)傳輸完之后才由硬件自動發(fā)出,而不是立刻發(fā)出。多用于流數(shù)據(jù)的傳輸模式,目的是保證中止命令可以精準(zhǔn)地停止卡的數(shù)據(jù)傳輸。表2. 命令格式4)根據(jù)該命令的需要,可配置等待響應(yīng)位(Wait for response bits)來指示CPSM是否需要等待響應(yīng)。具體可配置為:1、無響應(yīng);2、短響應(yīng);3、長響應(yīng)。表3. 短響應(yīng)格式表4. 長響應(yīng)格式5)當(dāng)設(shè)置SDIO_CMDCTRL寄存器的CCSMEN位,控制器開始發(fā)送命令。命令發(fā)送完成時,命令通道狀態(tài)機(CCSM)設(shè)置命令通道狀態(tài)標(biāo)志并在不需要響應(yīng)時進入空閑狀態(tài)。當(dāng)收到響應(yīng)后,接收到的CRC碼將會與內(nèi)部產(chǎn)生的CRC碼比較,然后設(shè)置相應(yīng)的狀態(tài)標(biāo)志。圖8. 命令通道狀態(tài)機(CCSM)6)當(dāng)CMDRSPCMPL、CMDFAIL、CMDCMPL、CMDTIMEOUT置位后,命令通道狀態(tài)機(CCSM)都會回到Idle狀態(tài)。而DOCMD置位時,CPSM處于除Idle以外的任何狀態(tài)。表5. 命令通道標(biāo)志命令通道配置相關(guān)函數(shù)配置命令通道狀態(tài)機使能命令通道狀態(tài)機
命令通道初始化舉例:
數(shù)據(jù)通道
1)數(shù)據(jù)通道單元通過SDIO_D[7:0]在主機與卡之間傳輸數(shù)據(jù)。圖9. 數(shù)據(jù)通道狀態(tài)機(DCSM)2)數(shù)據(jù)BUF(先進先出)子單元是一個具有發(fā)送和接收單元的數(shù)據(jù)緩沖區(qū)。3)BUF包含一個每字32位寬、共32個字的數(shù)據(jù)緩沖區(qū),共128Byte。表6. 數(shù)據(jù)令牌格式4)DOTX和DORX由數(shù)據(jù)通道單元設(shè)置而且是互斥的:
- 當(dāng)DOTX標(biāo)志有效時,BUF代表發(fā)送數(shù)據(jù)緩沖區(qū)。(DPSM處于Wait_R或者Receive狀態(tài))
- 當(dāng)DORX標(biāo)志有效時,BUF代表接收數(shù)據(jù)緩沖區(qū)。(DPSM處于Wait_S或者Send狀態(tài))
表7. 發(fā)送BUF狀態(tài)標(biāo)志表8. 接收BUF狀態(tài)標(biāo)志
SDIO_D[7:0]時序1)在塊模式下,發(fā)送完數(shù)據(jù)后,卡會返回一個確認(rèn)CRC的序列,數(shù)據(jù)通道狀態(tài)機(DCSM)在等待“這個序列和Busy結(jié)束”時有超時控制,超時時間由SDIO數(shù)據(jù)定時器寄存器(SDIO_DTTMR)設(shè)置。2)卡端返回的CRC status(5bit)只會發(fā)送在SDIO_D0上,卡端收到正確的數(shù)據(jù)(CRC正確)后發(fā)出的序列為“00101”,若是錯誤的數(shù)據(jù)(CRC錯誤)的序列為“01011”。3)數(shù)據(jù)通道狀態(tài)機(DCSM)在WAIT_R等待接收數(shù)據(jù)時也有超時控制,超時時間也由SDIO數(shù)據(jù)定時器寄存器(SDIO_DTTMR)設(shè)置。4)在塊模式下的數(shù)據(jù)傳輸總個數(shù)一定要是block size的整數(shù)倍。當(dāng)一個塊發(fā)送完后需要收到“CRC序列和Busy結(jié)束”時,硬件才會發(fā)送下一個數(shù)據(jù)塊。在流模式下不需設(shè)定blocksize的大小。圖10. 1bit數(shù)據(jù)傳輸方式圖11. 4bit數(shù)據(jù)傳輸方式圖12. 8bit數(shù)據(jù)傳輸方式數(shù)據(jù)通道配置相關(guān)函數(shù)配置數(shù)據(jù)通道狀態(tài)機使能數(shù)據(jù)通道狀態(tài)機設(shè)置數(shù)據(jù)總線寬度
數(shù)據(jù)通道初始化舉例:
SDIO AHB接口
1)AHB接口產(chǎn)生中斷和DMA請求,并訪問SDIO接口寄存器和數(shù)據(jù)BUF。它包含一個數(shù)據(jù)通道、寄存器譯碼器和中斷/DMA控制邏輯。2)SDIO中斷:當(dāng)至少有一個選中的狀態(tài)標(biāo)志為高時,中斷控制邏輯產(chǎn)生中斷請求。中斷屏蔽寄存器用于選擇可以產(chǎn)生中斷的條件,如果設(shè)置了相應(yīng)的屏蔽標(biāo)志位,則對應(yīng)的狀態(tài)標(biāo)志可以產(chǎn)生中斷。表9. SDIO中斷屏蔽寄存器3)DMA接口:DMA主要用于在SDIO BUF和Memory之間傳輸數(shù)據(jù)。
- BUF在接收數(shù)據(jù)時,RXBUFH標(biāo)志作為DMA接收請求。
- BUF在發(fā)送數(shù)據(jù)時,TXBUFH標(biāo)志作為DMA發(fā)送請求。
SDIO中斷/DMA配置相關(guān)函數(shù)
SDIO中斷配置函數(shù)
SDIO DMA使能函數(shù)使能SDIO DMA接收數(shù)據(jù)舉例:
數(shù)據(jù)傳輸模式
當(dāng)SD/MMC卡需要讀/寫數(shù)據(jù)時,可以配置、使能SDIO主機的數(shù)據(jù)通道后,通過PIO模式或DMA模式來讀/寫SDIO的數(shù)據(jù)BUF的方式實現(xiàn)。
PIO模式
SDIO的數(shù)據(jù)BUF共128字節(jié),讀/寫數(shù)據(jù)共用。根據(jù)SDIO主機數(shù)據(jù)通道所配置的傳送方向來判斷讀或?qū)憯?shù)據(jù)BUF。在讀取數(shù)據(jù)BUF接收數(shù)據(jù)時,用戶查詢SDIO_STS寄存器的RXBUFH標(biāo)志位,如置位可讀取8字節(jié)的數(shù)據(jù),最后再查詢RXBUF標(biāo)志位,以讀完剩余小于8字節(jié)的未讀數(shù)據(jù)。在寫入數(shù)據(jù)BUF發(fā)送數(shù)據(jù)時,用戶查詢SDIO_STS寄存器的TXBUFH標(biāo)志位,如置位可寫入最多8字節(jié)的數(shù)據(jù),直至寫完所有待發(fā)送的數(shù)據(jù)。當(dāng)在PIO模式下運行時,用戶都必須確保輪詢狀態(tài)。
DMA模式
DMA模式是訪問數(shù)據(jù)BUF的另一種選擇。使用DMA控制器來代替CPU對數(shù)據(jù)BUF的訪問,可以節(jié)省CPU運行的時間。使用DMA控制器之前,要先使能SDIO的DMA模式,再去設(shè)置DMA控制器的功能,最后使能與數(shù)據(jù)BUF讀或?qū)懴嚓P(guān)的中斷,用以判斷數(shù)據(jù)BUF讀/寫是否完成,是否有數(shù)據(jù)校驗錯誤等。控制方式和范例可以參照BSP里的demo。SDIO用DMA模式讀或?qū)憯?shù)據(jù)BUF時,只能以WORD為最小傳輸單位。DMA的長度需換算成WORD單位,數(shù)據(jù)寬度也必須選擇WORD。DMA模式相關(guān)配置函數(shù)SDIO的DMA模式使能SDIO的中斷使能
SDIO主機接口初始化
初始化SDIO主機
這部分介紹了如何去初始化SD/MMC主機接口來建立命令通道和數(shù)據(jù)通道去初始化 SD/MMC卡。圖13. 初始化SD/MMC主機接口流程圖時鐘配置SDIO使用一個時鐘信號:SDIO適配器時鐘(SDIOCLK=AHB總線時鐘(HCLK))。SDIO_CK的時鐘配置對于SD/MMC卡初始化配置時,該時鐘范圍在100到400KHz。
SD卡初始化
SD卡上電和初始化的流程可參考協(xié)議”SD Physical Layer Specification Version 2.00”來實現(xiàn),并由此來配置命令通道和數(shù)據(jù)通道去識別和初始化SD卡。圖14. SD卡識別和初始化流程圖SD卡的上電和初始化發(fā)送CMD0:軟件復(fù)位命令,將卡置于空閑狀態(tài)。發(fā)送CMD8:根據(jù)卡端的響應(yīng)識別SD卡的版本型號和支持的電壓范圍。
- 如果卡端回復(fù)了響應(yīng),這說明是V2.00或更新的SD卡。再判斷響應(yīng)是否有效,如響應(yīng)無效,則支持的電壓范圍不兼容;如有效,則支持的電壓范圍是兼容的。
- 如果卡端沒有回復(fù)響應(yīng)。則說明是V2.00或更新的SD卡(沒有匹配支持的電壓),或是V1.X的SD卡,或是沒有連接SD卡。
發(fā)送ACMD41:獲取SD卡的OCR(Operation Conditions Register)。
- 讀取OCR中的Busy(Card power up status)bit,判斷SD卡的上電過程是否完成,直到該位置1說明上電完成。
- 讀取OCR中的CCS(Card Capacity Status)bit,判斷該卡是高容量或是標(biāo)準(zhǔn)容量的V2.00的SD卡。
SD卡的識別過程發(fā)送CMD2:獲取SD卡的CID(Card IDentification)Register。發(fā)送CMD3:獲取SD卡的相對地址。發(fā)送CMD9:獲取SD卡的CSD(Card Specific Data)Register。配置SD卡的數(shù)據(jù)總線寬度1)發(fā)送ACMD6:改變SD卡的數(shù)據(jù)總線寬度(可支持1-bit或4-bit線寬)2)配置SDIO主機的數(shù)據(jù)總線寬度線寬。總線寬度設(shè)置函數(shù)
配置SD卡數(shù)據(jù)總線寬度舉例:
MMC卡初始化
MMC卡上電和初始化的流程可參考協(xié)議”MultiMediaCard (MMC) Electrical Standard(MMCA, 4.2)”來實現(xiàn),并由此來配置命令通道和數(shù)據(jù)通道去識別和初始化MMC卡。圖15. MMC卡識別和初始化流程圖MMC卡的上電和初始化發(fā)送CMD0:軟件復(fù)位命令,將卡置于空閑狀態(tài)。發(fā)送CMD1:獲取MMC卡的OCR(Operation Conditions Register)。
- 讀取OCR中的Busy(Card power up status)bit,判斷MMC卡的上電過程是否完成,直到該位置1說明上電完成。
MMC卡的識別過程發(fā)送CMD2:獲取MMC卡的CID(Card IDentification)Register。發(fā)送CMD3:設(shè)置MMC卡的相對地址。發(fā)送CMD9:獲取MMC卡的CSD(Card Specific Data)Register。配置MMC卡的數(shù)據(jù)總線寬度1)發(fā)送CMD6:改變MMC卡的數(shù)據(jù)總線寬度(可支持1-bit或4-bit或8-bit線寬)2)配置SDIO主機的數(shù)據(jù)總線寬度線寬。總線寬度設(shè)置函數(shù)
配置MMC卡數(shù)據(jù)總線寬度舉例:
SDIO主機接口讀/寫 SD/MMC卡
s
讀/寫SD卡
在讀/寫SD卡時,只能以數(shù)據(jù)塊的方式進行讀/寫。當(dāng)SD卡上電并初始化完成,由空閑狀態(tài)進入傳輸狀態(tài)后,就可以進行SD卡的讀/寫操作。圖16. SD卡狀態(tài)圖(數(shù)據(jù)傳輸模式)在初始化完成后,SD卡進入Stand-by狀態(tài),需發(fā)送CMD7根據(jù)相對地址去選中SD卡,此時可進入到transfer狀態(tài),便可以進行SD卡的讀/寫操作。
發(fā)送CMD13:獲取SD卡狀態(tài)。
發(fā)送CMD16:設(shè)置SD卡單塊的大小。下面的命令是用于讀/寫單塊或多塊的數(shù)據(jù):
- CMD1:讀單塊數(shù)據(jù)。
- CMD18:讀多塊數(shù)據(jù)。
- CMD23:寫單塊數(shù)據(jù)。
- CMD24:寫多塊數(shù)據(jù)。
讀/寫MMC卡
在讀/寫MMC卡時,可以以數(shù)據(jù)塊或數(shù)據(jù)流的方式進行讀/寫。當(dāng)MMC卡上電并初始化完成,由空閑狀態(tài)進入傳輸狀態(tài)后,就可以進行MMC卡的讀/寫操作。圖17. MMC卡狀態(tài)圖(數(shù)據(jù)傳輸模式)在初始化完成后,MMC卡進入Stand-by狀態(tài),需發(fā)送CMD7根據(jù)相對地址去選中MMC卡,此時可進入到transfer狀態(tài),便可以進行MMC卡的讀/寫操作。發(fā)送CMD13:獲取MMC卡狀態(tài)。發(fā)送CMD16:設(shè)置MMC卡單塊的大小。
下面的命令是用于讀/寫單塊或多塊的數(shù)據(jù):
- CMD1:讀單塊數(shù)據(jù)。
- CMD18:讀多塊數(shù)據(jù)。
- CMD23:寫單塊數(shù)據(jù)。
- CMD24:寫多塊數(shù)據(jù)。
下面的命令是用于讀/寫數(shù)據(jù)流:
- CMD11:讀數(shù)據(jù)流。
- CMD20:寫數(shù)據(jù)流。
讀/寫 SD/MMC卡 案例
下圖展示了讀/寫SD/MMC卡案例的流程圖。圖18. 讀/寫SD/MMC卡案例
SDIO主機讀寫基于 SD/MMC卡的FATFS文件
s在SD/MMC卡上裝載FATFS文件系統(tǒng),文件能被傳送,可使用PIO或DMA的傳輸模式。后面有案例會具體描述如何去創(chuàng)建、寫入然后讀取一個文件在SD/MMC卡上。
將文件系統(tǒng)導(dǎo)入工程文件
在案例中,我們需要導(dǎo)入FATFS文件系統(tǒng)的API層和硬件層,并根據(jù)具體的存儲介質(zhì)來修改硬件層。通過”ffconf.h”配置FatFs的相關(guān)功能(可裁剪),以滿足應(yīng)用的需要。圖19. FATFS文件系統(tǒng)相關(guān)文件
FATFS文件系統(tǒng)案例
下圖展示了FATFS文件系統(tǒng)案例的流程圖。圖20. FATFS文件系統(tǒng)案例PS.
-
mcu
+關(guān)注
關(guān)注
146文章
17301瀏覽量
352130 -
AT32
+關(guān)注
關(guān)注
1文章
118瀏覽量
2120
發(fā)布評論請先 登錄
相關(guān)推薦
評論