STM32之SD卡驅(qū)動
只需要4個IO口即可外擴一個最大達32GB以上的外部存儲器,容量從幾十M到幾十G選擇尺度很大,更換也很方便,編程也簡單,是單片機大容量外部存儲器的首選。
ALIENTKE 戰(zhàn)艦STM32開發(fā)板自帶了標(biāo)準(zhǔn)的SD卡接口,可使用STM32自帶的SPI/SDIO接口驅(qū)動(通過跳線帽選擇驅(qū)動方式),本章我們使用SPI驅(qū)動,最高通信速度可達18Mbps,每秒可傳輸數(shù)據(jù)2M字節(jié)以上,對于一般應(yīng)用足夠了。在本章中,我們將向大家介紹,如何在ALIENTEK戰(zhàn)艦STM32開發(fā)板上實現(xiàn)SD卡的讀取。本章分為如下幾個部分:
44.1 SD卡簡介
44.2 硬件設(shè)計
44.3 軟件設(shè)計
44.4 下載驗證
44.1 SD卡簡介
SD卡(Secure Digital Memory Card)中文翻譯為安全數(shù)碼卡,它是在MMC的基礎(chǔ)上發(fā)展而來,是一種基于半導(dǎo)體快閃記憶器的新一代記憶設(shè)備,它被廣泛地于便攜式裝置上使用,例如數(shù)碼相機、個人數(shù)碼助理(PDA)和多媒體播放器等。SD卡由日本松下、東芝及美國SanDisk公司于1999年8月共同開發(fā)研制。大小猶如一張郵票的SD記憶卡,重量只有2克,但卻擁有高記憶容量、快速數(shù)據(jù)傳輸率、極大的移動靈活性以及很好的安全性。按容量分類,可以將SD卡分為3類:SD卡、SDHC卡、SDXC卡。如表44.1.1所示:
容量 | 命名 | 簡稱 |
0~2G | Standard Capacity SD Memory Card | SDSC或SD |
2G~32G | High Capacity SD Memory Card | SDHC |
32G~2T | Extended Capacity SD Memory Card | SDXC |
表44.1.1 SD卡按容量分類
SD卡和SDHC卡協(xié)議基本兼容,但是SDXC卡,同這兩者區(qū)別就比較大了,本章我們討論的主要是SD/SDHC卡(簡稱SD卡)。
SD卡一般支持2種操作模式:
1,SD卡模式(通過SDIO通信);
2,SPI模式;
主機可以選擇以上任意一種模式同SD卡通信,SD卡模式允許4線的高速數(shù)據(jù)傳輸。SPI模式允許簡單的通過SPI接口來和SD卡通信,這種模式同SD卡模式相比就是喪失了速度。
SD卡的引腳排序如下圖44.1.1所示:
圖44.1.1 SD卡引腳排序圖
SD卡引腳功能描述如表45.1.2所示:
SD卡只能使用3.3V的IO電平,所以,MCU一定要能夠支持3.3V的IO端口輸出。注意:在SPI模式下,CS/MOSI/MISO/CLK都需要加10~100K左右的上拉電阻。
SD卡有5個寄存器,如表45.1.3所示:
名稱 | 寬度 | 描述 |
CID | 128 | 卡標(biāo)識寄存器 |
RCA | 16 | 相對卡地址(Relative card address)寄存器:本地系統(tǒng)中卡的地址,動態(tài)變化,在主機初始化的時候確定 *SPI模式中沒有 |
CSD | 128 | 卡描述數(shù)據(jù):卡操作條件相關(guān)的信息數(shù)據(jù) |
SCR | 64 | SD配置寄存器:SD卡特定信息數(shù)據(jù) |
OCR | 32 | 操作條件寄存器 |
表45.1.3 SD卡相關(guān)寄存器
關(guān)于這些寄存器的詳細描述,請參考光盤相關(guān)SD卡資料。我們在這里就不描述了。接下來,我們看看SD卡的命令格式,如表45.1.4所示:
字節(jié)1 | 字節(jié)2--5 | 字節(jié)6 | |||
7 | 6 | 5 | 31 | 7 | 0 |
0 | 1 | command | 命令參數(shù) | CRC | 1 |
表45.1.4 SD卡命令格式
SD卡的指令由6個字節(jié)組成,字節(jié)1的最高2位固定為01,低6位為命令號(比如CMD16,為10000即16進制的0X10,完整的CMD16,第一個字節(jié)為01010000,即0X10+0X40)。
字節(jié)2~5為命令參數(shù),有些命令是沒有參數(shù)的。
字節(jié)6的高七位為CRC值,最低位恒定為1。
SD卡的命令總共有12類,分為Class0~Class11,本章,我們僅介紹幾個比較重要的命令,如表45.1.5所示:
命令 | 參數(shù) | 回應(yīng) | 描述 |
CMD0(0X00) | NONE | R1 | 復(fù)位SD卡 |
CMD8(0X08) | VHS+Check pattern | R7 | 發(fā)送接口狀態(tài)命令 |
CMD9(0X09) | NONE | R1 | 讀取卡特定數(shù)據(jù)寄存器 |
CMD10(0X0A) | NONE | R1 | 讀取卡標(biāo)志數(shù)據(jù)寄存器 |
CMD16(0X10) | 塊大小 | R1 | 設(shè)置塊大?。ㄗ止?jié)數(shù)) |
CMD17(0X11) | 地址 | R1 | 讀取一個塊的數(shù)據(jù) |
CMD24(0X18) | 地址 | R1 | 寫入一個塊的數(shù)據(jù) |
CMD41(0X29) | NONE | R3 | 發(fā)送給主機容量支持信息和激活 卡初始化過程 |
CMD55(0X37) | NONE | R1 | 告訴SD卡,下一個是特定應(yīng)用命令 |
CMD58(0X3A) | NONE | R3 | 讀取OCR寄存器 |
表45.1.5 SD卡部分命令
上表中,大部分的命令是初始化的時候用的。表中的R1、R3和R7等是SD卡的回應(yīng),SD卡和單片機的通信采用發(fā)送應(yīng)答機制,如圖45.1.2所示:
圖45.1.2 SD卡命令傳輸過程
R1響應(yīng)格式 | ||||||||
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
含義 | 開始位 始終為0 | 參數(shù) 錯誤 | 地址 錯誤 | 擦除序列 錯誤 | CRC錯誤 | 非法 命令 | 擦除 復(fù)位 | 閑置 狀態(tài) |
表45.1.6 R1響應(yīng)各位描述
接著我們看看SD卡的初始化,SD卡的典型初始化過程如下:
1、初始化與SD卡連接的硬件條件(MCU的SPI配置,IO口配置);
2、上電延時(>74個CLK);
3、復(fù)位卡(CMD0),進入IDLE狀態(tài);
4、發(fā)送CMD8,檢查是否支持2.0協(xié)議;
5、根據(jù)不同協(xié)議檢查SD卡(命令包括:CMD55、CMD41、CMD58和CMD1等);
6、取消片選,發(fā)多8個CLK,結(jié)束初始化
這樣我們就完成了對SD卡的初始化,注意末尾發(fā)送的8個CLK是提供SD卡額外的時鐘,完成某些操作。通過SD卡初始化,我們可以知道SD卡的類型(V1、V2、V2HC或者MMC),在完成了初始化之后,就可以開始讀寫數(shù)據(jù)了。
SD卡讀取數(shù)據(jù),這里通過CMD17來實現(xiàn),具體過程如下:
1、發(fā)送CMD17;
2、接收卡響應(yīng)R1;
3、接收數(shù)據(jù)起始令牌0XFE;
4、接收數(shù)據(jù);
5、接收2個字節(jié)的CRC,如果不使用CRC,這兩個字節(jié)在讀取后可以丟掉。
6、禁止片選之后,發(fā)多8個CLK;
以上就是一個典型的讀取SD卡數(shù)據(jù)過程,SD卡的寫于讀數(shù)據(jù)差不多,寫數(shù)據(jù)通過CMD24來實現(xiàn),具體過程如下:
1、發(fā)送CMD24;
2、接收卡響應(yīng)R1;
3、發(fā)送寫數(shù)據(jù)起始令牌0XFE;
4、發(fā)送數(shù)據(jù);
5、發(fā)送2字節(jié)的偽CRC;
6、禁止片選之后,發(fā)多8個CLK;
以上就是一個典型的寫SD卡過程。關(guān)于SD卡的介紹,我們就介紹到這里,更詳細的介紹請參考光盤SD卡的參考資料(SD卡2.0協(xié)議)。
44.2 硬件設(shè)計
本章實驗功能簡介:開機的時候先初始化SD卡,如果SD卡初始化完成,則提示LCD初始化成功。按下KEY0,讀取SD卡扇區(qū)0的數(shù)據(jù),然后通過串口發(fā)送到電腦。如果沒初始化通過,則在LCD上提示初始化失敗。 同樣用DS0來指示程序正在運行。
本實驗用到的硬件資源有:
1) 指示燈DS0
2) KEY0按鍵
3) 串口
4) TFTLCD模塊
5) SD卡
前面四部分,在之前的實例已經(jīng)介紹過了,這里我們介紹一下戰(zhàn)艦STM32開發(fā)板板載的SD卡接口和STM32的連接關(guān)系,如圖44.2.1所示:
圖44.2.2 SD卡SPI方式硬件連接示意圖
關(guān)鍵詞:
STM32SD卡驅(qū)
評論