SDIO简介
SDIO,全稱: Secure Digital Input and Output ,即安全數字輸入輸出接口。它是在SD卡接口的基礎上發展而來,它可以兼容之前的SD卡,并可以連接SDIO接口設備,比如:藍牙、WIFI、照相機等。 ? ? ?
SDIO和SD卡規范間的一個重要區別是增加了低速標準。低速卡的目標應用是以最小的硬件開支支持低速I/ O能力。低速卡支持類似調制解調器、條碼掃描儀和GPS接收器等應用。 ? ? ?
STM32的SDIO控制器支持多媒體卡(MMC卡)、SD存儲卡、SD I/O卡和CE-ATA設備。
STM32 SDIO接口特點:
①與多媒體卡系統規格書版本4.2全兼容。支持三種不同的數據總線模式:1位(默認)、4位和8位。
②與較早的多媒體卡系統規格版本全兼容(向前兼容)。
③與SD存儲卡規格版本2.0全兼容。
④與SD I/O卡規格版本2.0全兼容:支持兩種不同的數據總線模式:1位(默認)和4位。
⑤完全支持CE-ATA功能(與CE-ATA數字協議版本1.1全兼容)。 ?8位總線模式下數據傳輸速率可達48MHz。
⑥數據和命令輸出使能信號,用于控制外部雙向驅動器。
SDIO框圖
復位后SDIO_D0用于數據傳輸。初始化后主機可以改變數據總線的寬度(通過ACMD6命令設置)。 ? ? ?
如果一個多媒體卡接到了總線上,則SDIO_D0、SDIO_D[3:0]或SDIO_D[7:0]可以用于數據傳輸。 ? ? ? ? ? ?
MMC版本V3.31和之前版本的協議只支持1位數據線,所以只能用SDIO_D0(為了通用性考慮,在程序里面我們只要檢測到是MMC卡就設置為1位總線數據)。
SDIO時鐘
卡時鐘(SDIO_CK):每個時鐘周期在命令和數據線上傳輸1位命令或數據。對于SD或SD I/O卡,時鐘頻率可以在0MHz至25MHz間變化。
SDIO適配器時鐘(SDIOCLK):該時鐘用于驅動SDIO適配器,可用于產生SDIO_CK時鐘。對F1來說,SDIOCLK來自HCLK(72Mhz);對F4來說,SDIOCLK來自PLL48CK(48Mhz)。
APB2總線接口時鐘(PCLK2):該時鐘用于驅動SDIO的APB2總線 ? ? ? ? 接口,其頻率為PCLK2=84Mhz。
SDIO_CK計算公式:SDIO_CK=SDIOCLK/(2+CLKDIV)
注意:在SD卡初始化時,SDIO_CK不可以超過400Khz,初始化完成后,可以設置為最大頻率(但不可以超過SD卡最大操作頻率)。
SDIO命令與響應
SDIO的命令分為:應用相關命令(ACMD)和通用命令(CMD)兩部分。發送ACMD時,需先發送CMD55。
SDIO所有的命令和響應都是在SDIO_CMD引腳上面傳輸的,命令長度固定為48位,SDIO命令格式如下表所示:
其中:除了命令索引和參數需要我們設置,其他都是由SDIO硬件自動控制。命令索引(如CMD0,CMD1之類)由SDIO_CMD寄存器設置,命令參數則由SDIO_ARG寄存器設置。?
一般SD卡在接收到命令行,都會有一個應答(CMD0例外),這個應答我們也稱之為響應。STM32的SDIO接口,支持2種響應類型:短響應(48位)和長響應(136位)。
STM32 SDIO短響應(48位)格式如下表所示:
STM32 SDIO長響應(136位)格式如下表所示:?
不論是短響應還是長響應,硬件都會自動濾除了起始位、傳輸位、CRC7以及結束位等信息,對于短響應,命令索引存放在SDIO_RESPCMD寄存器,參數則存放在SDIO_RESP1寄存器里面。對于長響應,則僅留CID/CSD位域,存放在SDIO_RESP1~SDIO_RESP4等4個寄存器。?
SD卡總共有6類響應(R1、R1b、R2、R3、R6、R7),我們這里以R1為例簡單介紹一下。R1(普通響應命令)響應屬于短響應,其長度為48位,如下表所示:
在收到R1響應后,我們可以從SDIO_RESPCMD寄存器和SDIO_RESP1寄存器分別讀出命令索引和卡狀態信息。
SDIO塊數據傳輸
SDIO與SD卡通信一般以數據塊的形式進行傳輸,SDIO(多)數據塊讀操作,如下圖所示:
從機在收到主機相關命令后,開始發送數據塊給主機,所有數據塊都帶CRC校驗(由硬件自動處理),單個數據塊讀的時候,在收到1個數據塊以后即可以停止了,不需要發送停止命令(CMD12)。但是多塊數據讀的時候,SD卡將一直發送數據給主機,直到接到主機發送的STOP命令(CMD12)。?
SDIO(多)數據塊寫操作,如下圖所示:
數據塊寫操作同數據塊讀操作基本類似,只是數據塊寫的時候,多了一個繁忙判斷,新的數據塊必須在SD卡非繁忙的時候發送。這里的繁忙信號由SD卡拉低SDIO_D0,以表示繁忙,SDIO硬件自動控制,不需要我們軟件處理。?
SDIO寄存器
SDIO電源控制寄存器(SDIO_POWER)
?該寄存器只有最低2位(PWRCTRL[1:0])有效,其他都是保留位,STM32復位以后,PWRCTRL=00,處于掉電狀態。所以,我們首先要給SDIO上電,設置這兩個位為:11。?
SDIO時鐘控制寄存器(SDIO_CLKCR)
注意:當SDIO_CK頻率過快時,可能導致SD卡通信失敗,此時,建議降低SDIO_CK試試。?
SDIO參數寄存器(SDIO_ARG)
該寄存器用于存儲命令參數。注意:參數必須先于命令寫入。?
SDIO命令寄存器(SDIO_CMD)
低6位為命令索引,即要發送的命令索引號(如發送CMD1,其值為1,索引就設置為1)。位[7:6],用于設置等待響應位,用于指示CPSM是否需要等待,以及等待類型等。CPSM:即命令通道狀態機,請參考《STM32中文參考手冊》相關章節。命令通道狀態機我們一般都是開啟的,所以位10要設置為1。?
SDIO命令響應寄存器(SDIO_RESPCMD)
該寄存器只有低6位有效,比較簡單,用于存儲最后收到的命令響應中的命令索引。如果傳輸的命令響應不包含命令索引,則該寄存器的內容不可預知。?
SDIO命令響應1~4寄存器(SDIO_RESPx,x=1~4)
命令響應寄存器組,總共包含4個32位寄存器組成,用于存放接收到的卡響應部分的信息。如果收到短響應,則數據存放在SDIO_RESP1寄存器里面,其他三個寄存器沒有用到。而如果收到長響應,則依次存放在SDIO_RESP1~ SDIO_RESP4里面?
SDIO數據定時器寄存器(SDIO_DTIMER)
該寄存器用于存儲以卡總線時鐘(SDIO_CK)為周期的數據超時時間,一個計數器將從SDIO_DTIMER寄存器加載數值,并在數據通道狀態機(DPSM)進入Wait_R或繁忙狀態時進行遞減計數,當DPSM處在這些狀態時,如果計數器減為0,則設置超時標志。DPSM:即數據通道狀態機,類似CPSM。 ? ? ? ?
注意:在寫入數據控制寄存器(SDIO_DCTRL),進行數據傳輸之前,須先寫入該寄存器(SDIO_DTIMER)和數據長度寄存器(SDIO_DLEN)!
SDIO數據長度寄存器(SDIO_DLEN)
該寄存器低25位有效,用于設置需要傳輸的數據字節長度。對于塊數據傳輸,該寄存器的數值,必須是數據塊長度(通過SDIO_DCTRL設置)的倍數。 ? ? ?
即:假定數據塊大小為512字節,那么SDIO_DLEN的設置,必須是512的整數倍,最大可以設置讀取65535個數據塊。
SDIO數據控制寄存器(SDIO_DCTRL)
該寄存器,用于控制數據通道狀態機(DPSM),包括數據傳輸使能、傳輸方向、傳輸模式、DMA使能、數據塊長度等信息的設置。 ? ?
我們需要根據自己的實際情況,來配置該寄存器,才可正常實現數據收發。?
SDIO狀態寄存器(SDIO_STA)
狀態寄存器可以用來查詢SDIO控制器的當前狀態,以便處理各種事務。比如SDIO_STA的位2表示命令響應超時,說明SDIO的命令響應出了問題。我們通過設置SDIO_ICR的位2則可以清除這個超時標志。另外,SDIO的清除中斷寄存器(SDIO_ICR)和中斷屏蔽寄存器(SDIO_MASK),這兩個寄存器和狀態寄存器(SDIO_STA)每個位的定義都相同,只是功能各有不同。?
SDIO數據FIFO寄存器(SDIO_FIFO)
數據FIFO寄存器包括接收和發送FIFO,他們由一組連續的32個地址上的32個寄存器組成,CPU可以使用FIFO讀寫多個操作數。例如我們要從SD卡讀數據,就必須讀SDIO_FIFO寄存器,要寫數據到SD卡,則要寫SDIO_FIFO寄存器。SDIO將這32個地址分為16個一組,發送接收各占一半。而我們每次讀寫的時候,最多就是讀取接收FIFO或寫入發送FIFO的一半大小的數據,也就是8個字(32個字節)。 注意:操作SDIO_FIFO必須是以4字節對齊的內存操作,否則可能出錯!?
?
總結
- 上一篇: Centos 安装 OpenLDAP
- 下一篇: 将ts视频文件转换为图片