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