STM32之SD卡驅(qū)動(dòng)
只需要4個(gè)IO口即可外擴(kuò)一個(gè)最大達(dá)32GB以上的外部存儲(chǔ)器,容量從幾十M到幾十G選擇尺度很大,更換也很方便,編程也簡(jiǎn)單,是單片機(jī)大容量外部存儲(chǔ)器的首選。
ALIENTKE 戰(zhàn)艦STM32開發(fā)板自帶了標(biāo)準(zhǔn)的SD卡接口,可使用STM32自帶的SPI/SDIO接口驅(qū)動(dòng)(通過(guò)跳線帽選擇驅(qū)動(dòng)方式),本章我們使用SPI驅(qū)動(dòng),最高通信速度可達(dá)18Mbps,每秒可傳輸數(shù)據(jù)2M字節(jié)以上,對(duì)于一般應(yīng)用足夠了。在本章中,我們將向大家介紹,如何在ALIENTEK戰(zhàn)艦STM32開發(fā)板上實(shí)現(xiàn)SD卡的讀取。本章分為如下幾個(gè)部分:
44.1 SD卡簡(jiǎn)介
44.2 硬件設(shè)計(jì)
44.3 軟件設(shè)計(jì)
44.4 下載驗(yàn)證
44.1 SD卡簡(jiǎn)介
SD卡(Secure Digital Memory Card)中文翻譯為安全數(shù)碼卡,它是在MMC的基礎(chǔ)上發(fā)展而來(lái),是一種基于半導(dǎo)體快閃記憶器的新一代記憶設(shè)備,它被廣泛地于便攜式裝置上使用,例如數(shù)碼相機(jī)、個(gè)人數(shù)碼助理(PDA)和多媒體播放器等。SD卡由日本松下、東芝及美國(guó)SanDisk公司于1999年8月共同開發(fā)研制。大小猶如一張郵票的SD記憶卡,重量只有2克,但卻擁有高記憶容量、快速數(shù)據(jù)傳輸率、極大的移動(dòng)靈活性以及很好的安全性。按容量分類,可以將SD卡分為3類:SD卡、SDHC卡、SDXC卡。如表44.1.1所示:
容量 | 命名 | 簡(jiǎn)稱 |
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卡(簡(jiǎn)稱SD卡)。
SD卡一般支持2種操作模式:
1,SD卡模式(通過(guò)SDIO通信);
2,SPI模式;
主機(jī)可以選擇以上任意一種模式同SD卡通信,SD卡模式允許4線的高速數(shù)據(jù)傳輸。SPI模式允許簡(jiǎn)單的通過(guò)SPI接口來(lái)和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個(gè)寄存器,如表45.1.3所示:
名稱 | 寬度 | 描述 |
CID | 128 | 卡標(biāo)識(shí)寄存器 |
RCA | 16 | 相對(duì)卡地址(Relative card address)寄存器:本地系統(tǒng)中卡的地址,動(dòng)態(tài)變化,在主機(jī)初始化的時(shí)候確定 *SPI模式中沒(méi)有 |
CSD | 128 | 卡描述數(shù)據(jù):卡操作條件相關(guān)的信息數(shù)據(jù) |
SCR | 64 | SD配置寄存器:SD卡特定信息數(shù)據(jù) |
OCR | 32 | 操作條件寄存器 |
表45.1.3 SD卡相關(guān)寄存器
關(guān)于這些寄存器的詳細(xì)描述,請(qǐng)參考光盤相關(guān)SD卡資料。我們?cè)谶@里就不描述了。接下來(lái),我們看看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個(gè)字節(jié)組成,字節(jié)1的最高2位固定為01,低6位為命令號(hào)(比如CMD16,為10000即16進(jìn)制的0X10,完整的CMD16,第一個(gè)字節(jié)為01010000,即0X10+0X40)。
字節(jié)2~5為命令參數(shù),有些命令是沒(méi)有參數(shù)的。
字節(jié)6的高七位為CRC值,最低位恒定為1。
SD卡的命令總共有12類,分為Class0~Class11,本章,我們僅介紹幾個(gè)比較重要的命令,如表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 | 讀取一個(gè)塊的數(shù)據(jù) |
CMD24(0X18) | 地址 | R1 | 寫入一個(gè)塊的數(shù)據(jù) |
CMD41(0X29) | NONE | R3 | 發(fā)送給主機(jī)容量支持信息和激活 卡初始化過(guò)程 |
CMD55(0X37) | NONE | R1 | 告訴SD卡,下一個(gè)是特定應(yīng)用命令 |
CMD58(0X3A) | NONE | R3 | 讀取OCR寄存器 |
表45.1.5 SD卡部分命令
上表中,大部分的命令是初始化的時(shí)候用的。表中的R1、R3和R7等是SD卡的回應(yīng),SD卡和單片機(jī)的通信采用發(fā)送應(yīng)答機(jī)制,如圖45.1.2所示:
圖45.1.2 SD卡命令傳輸過(guò)程
R1響應(yīng)格式 | ||||||||
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
含義 | 開始位 始終為0 | 參數(shù) 錯(cuò)誤 | 地址 錯(cuò)誤 | 擦除序列 錯(cuò)誤 | CRC錯(cuò)誤 | 非法 命令 | 擦除 復(fù)位 | 閑置 狀態(tài) |
表45.1.6 R1響應(yīng)各位描述
接著我們看看SD卡的初始化,SD卡的典型初始化過(guò)程如下:
1、初始化與SD卡連接的硬件條件(MCU的SPI配置,IO口配置);
2、上電延時(shí)(>74個(gè)CLK);
3、復(fù)位卡(CMD0),進(jìn)入IDLE狀態(tài);
4、發(fā)送CMD8,檢查是否支持2.0協(xié)議;
5、根據(jù)不同協(xié)議檢查SD卡(命令包括:CMD55、CMD41、CMD58和CMD1等);
6、取消片選,發(fā)多8個(gè)CLK,結(jié)束初始化
這樣我們就完成了對(duì)SD卡的初始化,注意末尾發(fā)送的8個(gè)CLK是提供SD卡額外的時(shí)鐘,完成某些操作。通過(guò)SD卡初始化,我們可以知道SD卡的類型(V1、V2、V2HC或者M(jìn)MC),在完成了初始化之后,就可以開始讀寫數(shù)據(jù)了。
SD卡讀取數(shù)據(jù),這里通過(guò)CMD17來(lái)實(shí)現(xiàn),具體過(guò)程如下:
1、發(fā)送CMD17;
2、接收卡響應(yīng)R1;
3、接收數(shù)據(jù)起始令牌0XFE;
4、接收數(shù)據(jù);
5、接收2個(gè)字節(jié)的CRC,如果不使用CRC,這兩個(gè)字節(jié)在讀取后可以丟掉。
6、禁止片選之后,發(fā)多8個(gè)CLK;
以上就是一個(gè)典型的讀取SD卡數(shù)據(jù)過(guò)程,SD卡的寫于讀數(shù)據(jù)差不多,寫數(shù)據(jù)通過(guò)CMD24來(lái)實(shí)現(xiàn),具體過(guò)程如下:
1、發(fā)送CMD24;
2、接收卡響應(yīng)R1;
3、發(fā)送寫數(shù)據(jù)起始令牌0XFE;
4、發(fā)送數(shù)據(jù);
5、發(fā)送2字節(jié)的偽CRC;
6、禁止片選之后,發(fā)多8個(gè)CLK;
以上就是一個(gè)典型的寫SD卡過(guò)程。關(guān)于SD卡的介紹,我們就介紹到這里,更詳細(xì)的介紹請(qǐng)參考光盤SD卡的參考資料(SD卡2.0協(xié)議)。
44.2 硬件設(shè)計(jì)
本章實(shí)驗(yàn)功能簡(jiǎn)介:開機(jī)的時(shí)候先初始化SD卡,如果SD卡初始化完成,則提示LCD初始化成功。按下KEY0,讀取SD卡扇區(qū)0的數(shù)據(jù),然后通過(guò)串口發(fā)送到電腦。如果沒(méi)初始化通過(guò),則在LCD上提示初始化失敗。 同樣用DS0來(lái)指示程序正在運(yùn)行。
本實(shí)驗(yàn)用到的硬件資源有:
1) 指示燈DS0
2) KEY0按鍵
3) 串口
4) TFTLCD模塊
5) SD卡
前面四部分,在之前的實(shí)例已經(jīng)介紹過(guò)了,這里我們介紹一下戰(zhàn)艦STM32開發(fā)板板載的SD卡接口和STM32的連接關(guān)系,如圖44.2.1所示:
圖44.2.2 SD卡SPI方式硬件連接示意圖
關(guān)鍵詞:
STM32SD卡驅(qū)
相關(guān)推薦
焦點(diǎn)
更多>>推薦視頻
更多>>技術(shù)專區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車電子
- 轉(zhuǎn)換器
- 電源管理
- 信號(hào)放大器
評(píng)論