一、SDIO介紹
SD卡(Secure Digital Memory Card)在我們生活中已經非常普遍了,控制器對SD卡進行讀寫通信操作一般有兩種通信接口可選,一種是SPI 接口,另外一種就是SDIO接口。
SDIO全稱是安全數字輸入/輸出接口,多媒體卡(MMC)、SD卡、SD I/O卡都有SDIO接口。STM32F10x系列控制器有一個SDIO主機接口,它可以與MMC卡、SD卡、SD I/O卡以及CE-ATA設備進行數據傳輸。MMC卡可以說是SD卡的前身,現階段已經用得很少。SDI/O卡本身不是用於存儲的卡,它是指利用SDIO傳輸協議的一-種外設。比如Wi-Fi Card,它主要是提供Wi-Fi功能,有些Wi-Fi模塊是使用串口或者SPI接口進行通信的,但Wi-FiSDIO Card是使用SDIO接口進行通信的。並且一般設計SD I/O卡是可以插入到SD的插槽。CE-ATA是專為輕薄筆記本硬盤設計的硬盤高速通訊接口。
二、SD卡物理結構
SD卡總共有8個寄存器,用於設定或表示SD卡信息,參考表36-1。 這些寄存器只能通過對應的命令訪問,對SD卡進行控制操作並不是像操作控制器GPIO相關寄存器那樣一次讀寫一個寄存器的,它是通過命令來控制,SDIO 定義了64個命令,每個命令都有特殊意義,可以實現某一特定功能,SD卡接收到命令后,根據命令要求對SD卡內部寄存器進行修改,程序控制中只需要發送組合命令就可以實現SD卡的控制以及讀寫操作。
SD卡使用9-pin 接口通信,其中3根電源線、1 根時鍾線、1 根命令線和4根數據線, .
具體說明如”下:
- CLK:時鍾線,由SDIO主機產生,即由STM32控制器輸出;
- CMD:命令控制線,SDIO主機通過該線發送命令控制SD卡,如果命令要求SD卡提供應答(響應),SD卡也是通過該線傳輸應答信息;
- D0-3: 數據線,傳輸讀寫數據; SD卡可將D0拉低表示忙狀態;
- VDD、VSS1、 VSS2: 電源和地信號。
SDIO 不管是從主機控制器向SD卡傳輸,還是SD卡向主機控制器傳輸都只以CLK時鍾線的上升沿為有效。SD卡操作過程會使用兩種不同頻率的時鍾同步數據,一個是識別卡階段時鍾頻率FOD,最高為400kHz,另外一個是數據傳輸模式下時鍾頻率FPP,默認最高為25MHz,如果通過相關寄存器配置使SDIO工作在高速模式,此時數據傳輸模式最高頻率為50MHz。
三、總線協議
SD總線通信是基於命令和數據傳輸的。通訊由一個起始位(“0”), 由一個停止位(“1”)終止。SD通信一般是主機發送一個命令(Command),從設備在接收到命令后作出響
應(Response),如有需要會有數據(Data)傳輸參與。
SD總線的基本交互是命令與響應交互,見圖36-4。
SD數據是以塊(Black)形式傳輸的,SDHC 卡數據塊長度一般為512字節,數據可以從主機到卡,也可以是從卡到主機。數據塊需要CRC位來保證數據傳輸成功。CRC位由SD卡系統硬件生成。STM32控制器可以控制使用單線或4線傳輸,本開發板設計使用4線傳輸。
圖36-5為主機向SD卡寫入數據塊操作示意。
SD數據傳輸支持單塊和多塊讀寫,它們分別對應不同的操作命令,多塊寫入還需要使用命令來停止整個寫入操作。數據寫入前需要檢測SD卡忙狀態,因為SD卡在接收到數據編程到存儲區過程需要一 定操作時間。SD卡忙狀態通過把D0線拉低表示。數據塊讀操作與之類似,只是無需忙狀態檢測。
四、SD卡的操作模式
SD卡系統(包括主機和SD卡)定義了兩種操作模式:卡識別模式和數據傳輸模式。在系統復位后,主機處於卡識別模式,尋找總線上可用的SDIO設備;同時,SD卡也處於卡識別模式,直到被主機識別到,即當SD卡接收到SEND_ RCA(CMD3)命令后,SD卡就會進入數據傳輸模式,而主機在總線上所有卡被識別后也進入數據傳輸模式。在每個操作模式下,SD卡都有幾種狀態,參考表36-4,通過命令控制實現卡狀態的切換。
1、卡識別過程
- 主機會復位所有處於“卡識別模式”的SD卡,確認其工作電壓范圍。
- 識別SD卡類型,並且獲取SD卡的相對地址(卡相對地址較短,便於尋址)。
- 在卡識別過程中,要求SD卡工作在識別時鍾頻率FOD的狀態下。
卡識別模式下SD卡狀態轉換如圖36-9。
2、數據傳輸過程
只有SD卡系統處於數據傳輸模式下才可以進行數據讀寫操作。數據傳輸模式下可以將主機SD時鍾頻率設置為FPP,默認最高為25MHz,頻率切換可以通過CMD4命令來實現。
數據傳輸模式下,SD卡狀態轉換過程見圖36-10。
五、SDIO功能框圖
- SDIO使用兩個時鍾信號,一個是SDIO適配器時鍾(SDIOCLK=HCLK=72MHz),另外一個是AHB總線時鍾的二分頻(HCLK/2,一般為36MHz)。
- 適配器寄存器和FIFO 使用.AHB總線一側的時鍾(HCLK/2)。
- 控制單元、命令通道和數據通道使用SDIO適配器一側的時鍾(SDIOCLK)。.
SDIO_ CK是SDIO 接口與SD卡用於同步的時鍾信號。它使用SDIOCLK 作為SDIO_ CK的時鍾來源,可以通過設置BYPASS 模式直接得到,這時SDIO CK =SDIOCLK=HCLK。若禁止BYPASS模式,可以通過配置時鍾寄存器的CLKDIV位控制分頻因子,即SDIO_ CK=SDIOCLK/ (2+CLKDIV) = HCLK/ (2+CLKDIV)。配置時鍾時要注意,SD卡普遍要求SDIO_CK時鍾頻率不能超過25MHz。STM32控制器的SDIO是針對MMC卡和SD卡的主設備,所以預留有8根數據線,對於SD卡最多用四根數據線。
SDIO適配器是SD卡系統主機部分,是STM32控制器與SD卡數據通信中間設備。