20.1 概述
SD卡是嵌入式系統(tǒng)中最常見的存儲器,不僅容量可以做的很大,并且接口通用,支持SPI/SDIO驅(qū)動,尺寸可供選擇,能滿足不同應(yīng)用的要求。STM32F1系列自帶了標(biāo)準(zhǔn)的4位SDIO接口,最高通信速度可達(dá)24MHz,最高每秒能傳輸12M字節(jié)的數(shù)據(jù)。
20.1.1 SDIO框圖
STM32F1的SDIO控制器包括2部分,SDIO適配器模塊和AHB總線接口,功能框圖如下圖所示。
其中SDIO適配器模塊主要用于實(shí)現(xiàn)所有MMC/SD卡的相關(guān)功能,如時鐘的產(chǎn)生,命令和數(shù)據(jù)的傳輸,AHB總線接口則用于操作SDIO適配器模塊中的寄存器并產(chǎn)生中斷和DMA請求信號。復(fù)位后默認(rèn)情況下SDIO_D0用于數(shù)據(jù)傳輸。初始化后主機(jī)可以改變數(shù)據(jù)總線的寬度。
如果一個多媒體卡接到了總線上,則SDIO_D0、SDIO_D[3:0]或SDIO_D[7:0]可以用于數(shù)據(jù)傳輸。MMC版本V3.31和之前版本的協(xié)議只支持1位數(shù)據(jù)線,所以只能用SDIO_D0(為了通用性考慮,在程序里面我們只要檢測到是MMC卡就設(shè)置為1位總線數(shù)據(jù))。
如果一個SD卡接到了總線上,可以通過主機(jī)配置數(shù)據(jù)傳輸使用SDIO_D0或SDIO_D[3:0]。所有的數(shù)據(jù)線都工作在推挽模式。
SDIO_CMD有兩種操作模式:
(1)用于初始化時的開路模式(僅用于MMC版本V3.31或之前版本)
(2)用于命令傳輸?shù)耐仆炷J剑⊿D卡和MMCV4.2在初始化時也使用推挽驅(qū)動)
20.1.2 SDIO時鐘
從SDIO框圖我們可以看到SDIO總共有3個時鐘,分別是:
(1)卡時鐘SDIO_CK:每個時鐘周期在命令和數(shù)據(jù)線上傳輸1位命令或數(shù)據(jù)。對于多媒體卡V3.31協(xié)議,時鐘頻率可以在0MHz至20MHz間變化;對于多媒體卡V4.0/4.2協(xié)議,時鐘頻率可以在0MHz至48MHz間變化;對于SD卡,時鐘頻率可以在0MHz至25MHz間變化。
(2)SDIO適配器時鐘SDIOCLK:該時鐘用于驅(qū)動SDIO適配器,其頻率等于AHB總線頻率HCLK,并用于產(chǎn)生SDIO_CK時鐘
(3)AHB總線接口時鐘HCLK/2:該時鐘用于驅(qū)動SDIO的AHB總線接口,其頻率為HCLK/2。
我們的SD卡時鐘SDIO_CK,根據(jù)卡的不同,可能有好幾個區(qū)間,這就涉及到時鐘頻率的設(shè)置,SDIO_CK與SDIOCLK的關(guān)系為:
SDIO_CK=SDIOCLK/(2+CLKDIV)
其中,SDIOCLK為HCLK,一般是72MHz,而CLKDIV則是分配系數(shù),可以通過SDIO的SDIO_CLKCR寄存器進(jìn)行設(shè)置,確保SDIO_CK不超過卡的最大操作頻率。
注:在SD卡剛剛初始化的時候,其時鐘頻率SDIO_CK不能超過400KHz,否則可能無法完成初始化。在初始化以后,就可以設(shè)置時鐘頻率到最大了,但不可超過SD卡的最大操作時鐘頻率。
20.1.3 SDIO的命令與響應(yīng)
SDIO的命令分為應(yīng)用相關(guān)命令ACMD和通用命令CMD兩部分,應(yīng)用相關(guān)命令A(yù)CMD的發(fā)送,必須先發(fā)送通用命令CMD55,然后才能發(fā)送應(yīng)用相關(guān)命令A(yù)CMD。SDIO的所有命令和響應(yīng)都是通過SDIO_CMD引腳傳輸?shù)模魏蚊畹拈L度都是固定為48位,SDIO的命令格式如下表所示。
Bit位 | 寬度 | 值 | 說明 |
---|---|---|---|
47 | 1 | 0 | 起始位 |
46 | 1 | 1 | 傳輸位 |
45:40 | 6 | - | 命令索引 |
39:8 | 32 | - | 參數(shù) |
7:1 | 7 | - | CRC7 |
0 | 1 | 1 | 結(jié)束位 |
所有的命令都是由STM32F1發(fā)出,其中開始位、傳輸位、CRC7和結(jié)束位由SDIO硬件控制,我們需要設(shè)置的就只有命令索引和參數(shù)部分。其中命令索引在SDIO_CMD寄存器里面設(shè)置,命令參數(shù)則由寄存器SDIO_ARG設(shè)置。一般情況下,選中的SD卡在接收到命令之后,都會回復(fù)一個應(yīng)答(但是CMD0無應(yīng)答),這個應(yīng)答我們稱之為響應(yīng),響應(yīng)也是在CMD線上串行傳輸?shù)摹TM32F1的SDIO控制器支持2種響應(yīng)類型,48位的短響應(yīng)和136位的長響應(yīng),這兩種響應(yīng)類型都帶CRC錯誤檢測,不帶CRC的響應(yīng)應(yīng)該忽略CRC錯誤標(biāo)志,如CMD1的響應(yīng)。
短響應(yīng)的格式如下表所示。
Bit位 | 寬度 | 值 | 說明 |
---|---|---|---|
47 | 1 | 0 | 起始位 |
46 | 1 | 0 | 傳輸位 |
45:40 | 6 | - | 命令索引 |
39:8 | 32 | - | 參數(shù) |
7:1 | 7 | - | CRC7或者1111111 |
0 | 1 | 1 | 結(jié)束位 |
長響應(yīng)的格式如下表所示。
Bit位 | 寬度 | 值 | 說明 |
---|---|---|---|
135 | 1 | 0 | 起始位 |
134 | 1 | 0 | 傳輸位 |
133:128 | 6 | 111111 | 保留 |
127:1 | 127 | - | CID或CSD(包括內(nèi)部CRC7) |
0 | 1 | 1 | 結(jié)束位 |
硬件為我們?yōu)V除了開始位、傳輸位、CRC7以及結(jié)束位等信息,對于短響應(yīng),命令索引存放在SDIO_RESPCMD寄存器,參數(shù)則存放在SDIO_RESP1寄存器里面。對于長響應(yīng),則僅留CID/CSD位域,存放在SDIO_RESP1到SDIO_RESP4等4個寄存器。SD卡總共有5類響應(yīng)(R1、R2、R3、R6、R7),這里以R1為例簡單介紹一下。R1(普通響應(yīng)命令)響應(yīng)屬于短響應(yīng),其長度為48位,R1響應(yīng)的格式如下表所示。
Bit位 | 寬度 | 值 | 說明 |
---|---|---|---|
47 | 1 | 0 | 起始位 |
46 | 1 | 1 | 傳輸位 |
45:40 | 6 | X | 命令索引 |
39:8 | 32 | X | 參數(shù) |
7:1 | 7 | X | CRC7 |
0 | 1 | 1 | 結(jié)束位 |
在收到R1響應(yīng)后,我們可以從SDIO_RESPCMD寄存器和SDIO_RESP1寄存器分別讀出命令索引和卡狀態(tài)信息。
20.1.4 數(shù)據(jù)塊讀操作
對于SD卡,數(shù)據(jù)是以數(shù)據(jù)塊的形式傳輸?shù)模覀兂S玫目ň褪荢D卡,所以不考慮MMC形式的讀寫操作,因?yàn)镸MC卡數(shù)據(jù)以數(shù)據(jù)塊或者數(shù)據(jù)流的形式傳輸。
從機(jī)在收到主機(jī)相關(guān)命令后,開始發(fā)送數(shù)據(jù)塊給主機(jī),所有數(shù)據(jù)塊都帶有CRC校驗(yàn)值,CRC由SDIO硬件自動處理,單個數(shù)據(jù)塊讀的時候,在收到1個數(shù)據(jù)塊以后即可以停止了,不需要發(fā)送停止命令CMD12。但是多塊數(shù)據(jù)讀的時候,SD卡將一直發(fā)送數(shù)據(jù)給主機(jī),直到接到主機(jī)發(fā)送的STOP命令CMD12。
SDIO多數(shù)據(jù)塊的讀操作如下圖所示。
20.1.5 數(shù)據(jù)塊寫操作
數(shù)據(jù)塊寫操作同數(shù)據(jù)塊讀操作基本類似,只是數(shù)據(jù)塊寫的時候,多了一個忙判斷,新的數(shù)據(jù)塊必須在SD卡非忙的時候發(fā)送。這里的忙信號由SD卡拉低SDIO_D0,以表示忙,SDIO硬件自動控制,不需要我們軟件處理。
20.2 SDIO相關(guān)寄存器
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:電源關(guān)閉,卡的時鐘停止
01:保留
10:保留的上電狀態(tài)
11:上電狀態(tài),卡的時鐘開啟
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:關(guān)閉硬件流控制
1:使能硬件流控制
Bit 13:SDIO_CK相位選擇位
0:在主時鐘SDIOCLK的上升沿產(chǎn)生SDIO_CK
1:在主時鐘SDIOCLK的下降沿產(chǎn)生SDIO_CK
Bit 12~Bit 11:寬總線模式使能位
00:默認(rèn)總線模式,使用SDIO_D0
01:4位總線模式,使用SDIO_D[3:0]
10:8位總線模式,使用SDIO_D[7:0]
Bit 10:旁路時鐘分頻器
0:關(guān)閉旁路:驅(qū)動SDIO_CK輸出信號之前,依據(jù)CLKDIV數(shù)值對SDIOCLK分頻
1:使能旁路:SDIOCLK直接驅(qū)動SDIO_CK輸出信號
Bit 9:省電配置位(為了省電,當(dāng)總線為空閑時,設(shè)置PWRSAV位可以關(guān)閉SDIO_CK時鐘輸出)
0:始終輸出SDIO_CK
1:僅在有總線活動時才輸出SDIO_CK
Bit 8:時鐘使能位
0:SDIO_CK關(guān)閉
1:SDIO_CK使能
Bit 7~Bit 0:時鐘分頻系數(shù)
這個域定義了輸入時鐘(SDIOCLK)與輸出時鐘(SDIO_CK)間的分頻系數(shù):SDIO_CK頻率=SDIOCLK/[CLKDIV+2]
20.2.3 SDIO參數(shù)寄存器: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:命令參數(shù)
屬于發(fā)送到卡中命令的一部分,如果一個命令包含一個參數(shù),必須在寫命令到命令寄存器之前加載這個寄存器
20.2.4 SDIO命令響應(yīng)寄存器: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:響應(yīng)的命令索引
只讀位,包含最后收到的命令響應(yīng)中的命令索引
20.2.5 SDIO相應(yīng)寄存器組:SDIO_RESP1~SDIO_RESP4
寄存器 | 短響應(yīng) | 長響應(yīng) |
---|---|---|
SDIO_RESP1 | 卡狀態(tài)[31:0] | 卡狀態(tài)[127:96] |
SDIO_RESP2 | 未使用 | 卡狀態(tài)[95:64] |
SDIO_RESP3 | 未使用 | 卡狀態(tài)[31:0] |
SDIO_RESP4 | 未使用 | 卡狀態(tài)[31:0] |
注:總是先收到卡狀態(tài)的最高位,SDIO_RESP3寄存器的最低位始終為0。
-
單片機(jī)
+關(guān)注
關(guān)注
6063文章
44925瀏覽量
647084 -
存儲器
+關(guān)注
關(guān)注
38文章
7636瀏覽量
166445 -
SD卡
+關(guān)注
關(guān)注
2文章
575瀏覽量
65173 -
SDIO
+關(guān)注
關(guān)注
2文章
74瀏覽量
19767
發(fā)布評論請先 登錄
【紫光同創(chuàng)國產(chǎn)FPGA教程】【第八章】SD卡讀寫實(shí)驗(yàn)

【GD32F470紫藤派開發(fā)板使用手冊】第十二講 SDIO-SD卡讀寫實(shí)驗(yàn)

arduino學(xué)習(xí)筆記18 - SD卡讀寫實(shí)驗(yàn)
接觸式IC卡讀寫實(shí)驗(yàn)

ARM基礎(chǔ)應(yīng)用實(shí)驗(yàn)06_SD卡讀寫
ARM基礎(chǔ)應(yīng)用實(shí)驗(yàn)_SD卡讀寫
STM32CubeMX生成一個SD卡讀寫程序
SD卡基礎(chǔ)讀寫實(shí)驗(yàn)詳解

STM32入門學(xué)習(xí)筆記之SD卡基礎(chǔ)讀寫實(shí)驗(yàn)2

STM32入門學(xué)習(xí)筆記之SD卡基礎(chǔ)讀寫實(shí)驗(yàn)3
STM32入門學(xué)習(xí)筆記之SD卡基礎(chǔ)讀寫實(shí)驗(yàn)4
SD卡基礎(chǔ)讀寫實(shí)驗(yàn)

【GD32F303紅楓派開發(fā)板使用手冊】第二十三講 SDIO-SD卡讀寫實(shí)驗(yàn)

評論