20.1 概述
SD卡是嵌入式系統中最常見的存儲器,不僅容量可以做的很大,并且接口通用,支持SPI/SDIO驅動,尺寸可供選擇,能滿足不同應用的要求。STM32F1系列自帶了標準的4位SDIO接口,最高通信速度可達24MHz,最高每秒能傳輸12M字節的數據。
20.1.1 SDIO框圖
STM32F1的SDIO控制器包括2部分,SDIO適配器模塊和AHB總線接口,功能框圖如下圖所示。
其中SDIO適配器模塊主要用于實現所有MMC/SD卡的相關功能,如時鐘的產生,命令和數據的傳輸,AHB總線接口則用于操作SDIO適配器模塊中的寄存器并產生中斷和DMA請求信號。復位后默認情況下SDIO_D0用于數據傳輸。初始化后主機可以改變數據總線的寬度。
如果一個多媒體卡接到了總線上,則SDIO_D0、SDIO_D[3:0]或SDIO_D[7:0]可以用于數據傳輸。MMC版本V3.31和之前版本的協議只支持1位數據線,所以只能用SDIO_D0(為了通用性考慮,在程序里面我們只要檢測到是MMC卡就設置為1位總線數據)。
如果一個SD卡接到了總線上,可以通過主機配置數據傳輸使用SDIO_D0或SDIO_D[3:0]。所有的數據線都工作在推挽模式。
SDIO_CMD有兩種操作模式:
(1)用于初始化時的開路模式(僅用于MMC版本V3.31或之前版本)
(2)用于命令傳輸的推挽模式(SD卡和MMCV4.2在初始化時也使用推挽驅動)
20.1.2 SDIO時鐘
從SDIO框圖我們可以看到SDIO總共有3個時鐘,分別是:
(1)卡時鐘SDIO_CK:每個時鐘周期在命令和數據線上傳輸1位命令或數據。對于多媒體卡V3.31協議,時鐘頻率可以在0MHz至20MHz間變化;對于多媒體卡V4.0/4.2協議,時鐘頻率可以在0MHz至48MHz間變化;對于SD卡,時鐘頻率可以在0MHz至25MHz間變化。
(2)SDIO適配器時鐘SDIOCLK:該時鐘用于驅動SDIO適配器,其頻率等于AHB總線頻率HCLK,并用于產生SDIO_CK時鐘
(3)AHB總線接口時鐘HCLK/2:該時鐘用于驅動SDIO的AHB總線接口,其頻率為HCLK/2。
我們的SD卡時鐘SDIO_CK,根據卡的不同,可能有好幾個區間,這就涉及到時鐘頻率的設置,SDIO_CK與SDIOCLK的關系為:
SDIO_CK=SDIOCLK/(2+CLKDIV)
其中,SDIOCLK為HCLK,一般是72MHz,而CLKDIV則是分配系數,可以通過SDIO的SDIO_CLKCR寄存器進行設置,確保SDIO_CK不超過卡的最大操作頻率。
注:在SD卡剛剛初始化的時候,其時鐘頻率SDIO_CK不能超過400KHz,否則可能無法完成初始化。在初始化以后,就可以設置時鐘頻率到最大了,但不可超過SD卡的最大操作時鐘頻率。
20.1.3 SDIO的命令與響應
SDIO的命令分為應用相關命令ACMD和通用命令CMD兩部分,應用相關命令ACMD的發送,必須先發送通用命令CMD55,然后才能發送應用相關命令ACMD。SDIO的所有命令和響應都是通過SDIO_CMD引腳傳輸的,任何命令的長度都是固定為48位,SDIO的命令格式如下表所示。
Bit位 | 寬度 | 值 | 說明 |
---|---|---|---|
47 | 1 | 0 | 起始位 |
46 | 1 | 1 | 傳輸位 |
45:40 | 6 | - | 命令索引 |
39:8 | 32 | - | 參數 |
7:1 | 7 | - | CRC7 |
0 | 1 | 1 | 結束位 |
所有的命令都是由STM32F1發出,其中開始位、傳輸位、CRC7和結束位由SDIO硬件控制,我們需要設置的就只有命令索引和參數部分。其中命令索引在SDIO_CMD寄存器里面設置,命令參數則由寄存器SDIO_ARG設置。一般情況下,選中的SD卡在接收到命令之后,都會回復一個應答(但是CMD0無應答),這個應答我們稱之為響應,響應也是在CMD線上串行傳輸的。STM32F1的SDIO控制器支持2種響應類型,48位的短響應和136位的長響應,這兩種響應類型都帶CRC錯誤檢測,不帶CRC的響應應該忽略CRC錯誤標志,如CMD1的響應。
短響應的格式如下表所示。
Bit位 | 寬度 | 值 | 說明 |
---|---|---|---|
47 | 1 | 0 | 起始位 |
46 | 1 | 0 | 傳輸位 |
45:40 | 6 | - | 命令索引 |
39:8 | 32 | - | 參數 |
7:1 | 7 | - | CRC7或者1111111 |
0 | 1 | 1 | 結束位 |
長響應的格式如下表所示。
Bit位 | 寬度 | 值 | 說明 |
---|---|---|---|
135 | 1 | 0 | 起始位 |
134 | 1 | 0 | 傳輸位 |
133:128 | 6 | 111111 | 保留 |
127:1 | 127 | - | CID或CSD(包括內部CRC7) |
0 | 1 | 1 | 結束位 |
硬件為我們濾除了開始位、傳輸位、CRC7以及結束位等信息,對于短響應,命令索引存放在SDIO_RESPCMD寄存器,參數則存放在SDIO_RESP1寄存器里面。對于長響應,則僅留CID/CSD位域,存放在SDIO_RESP1到SDIO_RESP4等4個寄存器。SD卡總共有5類響應(R1、R2、R3、R6、R7),這里以R1為例簡單介紹一下。R1(普通響應命令)響應屬于短響應,其長度為48位,R1響應的格式如下表所示。
Bit位 | 寬度 | 值 | 說明 |
---|---|---|---|
47 | 1 | 0 | 起始位 |
46 | 1 | 1 | 傳輸位 |
45:40 | 6 | X | 命令索引 |
39:8 | 32 | X | 參數 |
7:1 | 7 | X | CRC7 |
0 | 1 | 1 | 結束位 |
在收到R1響應后,我們可以從SDIO_RESPCMD寄存器和SDIO_RESP1寄存器分別讀出命令索引和卡狀態信息。
20.1.4 數據塊讀操作
對于SD卡,數據是以數據塊的形式傳輸的,我們常用的卡就是SD卡,所以不考慮MMC形式的讀寫操作,因為MMC卡數據以數據塊或者數據流的形式傳輸。
從機在收到主機相關命令后,開始發送數據塊給主機,所有數據塊都帶有CRC校驗值,CRC由SDIO硬件自動處理,單個數據塊讀的時候,在收到1個數據塊以后即可以停止了,不需要發送停止命令CMD12。但是多塊數據讀的時候,SD卡將一直發送數據給主機,直到接到主機發送的STOP命令CMD12。
SDIO多數據塊的讀操作如下圖所示。
20.1.5 數據塊寫操作
數據塊寫操作同數據塊讀操作基本類似,只是數據塊寫的時候,多了一個忙判斷,新的數據塊必須在SD卡非忙的時候發送。這里的忙信號由SD卡拉低SDIO_D0,以表示忙,SDIO硬件自動控制,不需要我們軟件處理。
20.2 SDIO相關寄存器
20.2.1 SDIO電源控制寄存器:SDIO_POWER
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
- | CTRL |
Bit 1~Bit 0:電源控制位
00:電源關閉,卡的時鐘停止
01:保留
10:保留的上電狀態
11:上電狀態,卡的時鐘開啟
20.2.2 SDIO時鐘控制寄存器:SDIO_CLKCR
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | |||||||||||||||
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
- | HWFC_EN | NEGEDGE | WIDBUS | BYPASS | PWRSAV | CLKEN | CLKDIV |
Bit 14:硬件流控制使能
0:關閉硬件流控制
1:使能硬件流控制
Bit 13:SDIO_CK相位選擇位
0:在主時鐘SDIOCLK的上升沿產生SDIO_CK
1:在主時鐘SDIOCLK的下降沿產生SDIO_CK
Bit 12~Bit 11:寬總線模式使能位
00:默認總線模式,使用SDIO_D0
01:4位總線模式,使用SDIO_D[3:0]
10:8位總線模式,使用SDIO_D[7:0]
Bit 10:旁路時鐘分頻器
0:關閉旁路:驅動SDIO_CK輸出信號之前,依據CLKDIV數值對SDIOCLK分頻
1:使能旁路:SDIOCLK直接驅動SDIO_CK輸出信號
Bit 9:省電配置位(為了省電,當總線為空閑時,設置PWRSAV位可以關閉SDIO_CK時鐘輸出)
0:始終輸出SDIO_CK
1:僅在有總線活動時才輸出SDIO_CK
Bit 8:時鐘使能位
0:SDIO_CK關閉
1:SDIO_CK使能
Bit 7~Bit 0:時鐘分頻系數
這個域定義了輸入時鐘(SDIOCLK)與輸出時鐘(SDIO_CK)間的分頻系數:SDIO_CK頻率=SDIOCLK/[CLKDIV+2]
20.2.3 SDIO參數寄存器:SDIO_ARG
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
CMDARG[31:16] | |||||||||||||||
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
CMDARG[16:0] |
Bit 31~Bit 0:命令參數
屬于發送到卡中命令的一部分,如果一個命令包含一個參數,必須在寫命令到命令寄存器之前加載這個寄存器
20.2.4 SDIO命令響應寄存器:SDIO_RESPCMD
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | |||||||||||||||
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
- | RESPCMD |
Bit 5~Bit 0:響應的命令索引
只讀位,包含最后收到的命令響應中的命令索引
20.2.5 SDIO相應寄存器組:SDIO_RESP1~SDIO_RESP4
寄存器 | 短響應 | 長響應 |
---|---|---|
SDIO_RESP1 | 卡狀態[31:0] | 卡狀態[127:96] |
SDIO_RESP2 | 未使用 | 卡狀態[95:64] |
SDIO_RESP3 | 未使用 | 卡狀態[31:0] |
SDIO_RESP4 | 未使用 | 卡狀態[31:0] |
注:總是先收到卡狀態的最高位,SDIO_RESP3寄存器的最低位始終為0。
-
單片機
+關注
關注
6032文章
44522瀏覽量
633217 -
存儲器
+關注
關注
38文章
7455瀏覽量
163616 -
SD卡
+關注
關注
2文章
560瀏覽量
63812 -
SDIO
+關注
關注
2文章
72瀏覽量
19294
發布評論請先 登錄
相關推薦
評論