引言:上一篇博文介紹了SD卡的理論知識(shí),本文我們介紹如何利用FPGA實(shí)現(xiàn)SD卡的讀寫操作。
1.硬件電路
開發(fā)板上裝有一個(gè) Micro SD 卡座,F(xiàn)PGA 通過 SPI 數(shù)據(jù)總線訪問 Micro SD 卡, SD 卡座和 FPGA的硬件電路連接如圖1所示。
圖1:SD卡硬件原理圖設(shè)計(jì)
本文通過SD卡SPI模式進(jìn)行讀寫操作,SPI模式管腳定義如圖1所示。
2. SD卡協(xié)議簡介
SD卡的協(xié)議是一種簡單的命令/響應(yīng)的協(xié)議。全部命令由主機(jī)發(fā)起,SD卡接收到命令后并返回響應(yīng)數(shù)據(jù)。根據(jù)命令的不同,返回的數(shù)據(jù)內(nèi)容和長度也不同。
SD卡命令是一個(gè)6字節(jié)組成的命令包,其中第一個(gè)字節(jié)為命令號(hào),命令號(hào)高位bit7和bit6為固定的“01“,其它6個(gè)bit為具體的命令號(hào)。第2個(gè)字節(jié)到第5個(gè)字節(jié)為命令參數(shù)。第6個(gè)字節(jié)為7個(gè)bit的CRC校驗(yàn)加1個(gè)bit的結(jié)束位。如果在SPI模式的時(shí)候,CRC校驗(yàn)位為可選。如圖2所示,Command表示命令,通常使用十進(jìn)制表示名稱,例如CMD17,這個(gè)時(shí)候 Command就是十進(jìn)制的17。
圖2:SD卡命令格式
SD卡對(duì)每個(gè)命令會(huì)返回一個(gè)響應(yīng),每個(gè)命令有一定的響應(yīng)格式。響應(yīng)的格式跟給它的命令號(hào)有關(guān)。在 SPI 模式中,有三種響應(yīng)格式:R1,R2,R3。
圖3:SPI模式響應(yīng)R1格式
圖4:SPI模式響應(yīng)R2格式
圖5:SPI模式響應(yīng)R3格式
2.2.1 SD卡2.0版的初始化步驟
(1)上電后延時(shí)至少74clock,等待SD卡內(nèi)部操作完成;
(2) 片選CS低電平選中SD卡;
(3)發(fā)送CMD0,需要返回0x01,進(jìn)入Idle狀態(tài);
(4)為了區(qū)別SD卡是2.0還是1.0,或是MMC卡,這里根據(jù)協(xié)議向上兼容的,首先發(fā)送只有SD2.0才有的命令CMD8,如果CMD8返回?zé)o錯(cuò)誤,則初步判斷為2.0卡,進(jìn)一步循環(huán)發(fā)送命令CMD55+ACMD41,直到返回0x00,確定 SD2.0卡;
(5)如果CMD8返回錯(cuò)誤則判斷為1.0卡還是MMC卡,循環(huán)發(fā)送 CMD55+ACMD41,返回?zé)o錯(cuò)誤,則為SD1.0卡,到此SD1.0卡初始成功,如果在一定的循環(huán)次數(shù)下,返回為錯(cuò)誤,則進(jìn)一步發(fā)送CMD1進(jìn)行初始化,如果返回?zé)o錯(cuò)誤,則確定為MMC卡,如果在一定的次數(shù)下,返回為錯(cuò)誤,則不能識(shí)別該卡,初始化結(jié)束。(通過CMD16可以改變SD卡一次性讀寫的長度);
(6) CS 拉高。
2.2.2 SD卡的讀步驟
(1)發(fā)送 CMD17(單塊)或 CMD18(多塊)讀命令,返回 0X00;
(2)接收數(shù)據(jù)開始令牌fe(或fc)+正式數(shù)據(jù)512Bytes+CRC校驗(yàn)2Bytes,默認(rèn)正式傳輸?shù)臄?shù)據(jù)長度是 512Bytes。圖 6:單塊讀操作
2.2.3 SD卡的寫步驟
(1)發(fā)送 CMD24(單塊)或 CMD25(多塊)讀命令,返回 0X00;
(2)接收數(shù)據(jù)開始令牌fe(或fc)+正式數(shù)據(jù)512Bytes+CRC校驗(yàn)2Bytes。
圖 7:單塊寫操作
3.FPGA實(shí)現(xiàn)
(1)軟件實(shí)現(xiàn)
本文要利用FPGA通過SPI接口實(shí)現(xiàn)SD卡讀寫操作。具體功能如下:
(1)SD卡SPI接口驅(qū)動(dòng)設(shè)計(jì);
(2)SD卡讀寫操作;
(3)讀出數(shù)據(jù)顯示在LED燈上;
(4)按鍵消抖功能。
軟件功能模塊劃分如圖8所示。
圖8:軟件功能模塊框圖
各個(gè)模塊功能:
(1)sd_card_test.v模塊為頂層模塊,實(shí)現(xiàn)模塊間互聯(lián);(2)spi_master.v實(shí)現(xiàn)SPI總線接口對(duì)外通信功能;
(3)sd_card_cmd.v實(shí)現(xiàn)SD卡命令協(xié)議功能;
(4)sd_card_sec_read_write.v實(shí)現(xiàn)SD卡讀寫命令狀態(tài)機(jī)操作功能;
(5)sd_card_top.v實(shí)現(xiàn)SD卡讀寫功能頂層互聯(lián);
(6)KeyJitters.v實(shí)現(xiàn)按鍵操作消抖功能;
(7)sd_test_ctrl.v實(shí)現(xiàn)SD卡測(cè)試數(shù)據(jù)讀寫狀態(tài)機(jī)控制。
?(2)測(cè)試結(jié)果
軟件下載至電路板,SD卡讀出數(shù)據(jù)正常顯示在LED上,如圖9所示,顯示讀寫操作正確。
圖9:SD卡讀出數(shù)據(jù)
圖10:SD卡讀出數(shù)據(jù)顯示在LED燈上
感謝關(guān)注公眾號(hào),喜歡就多多轉(zhuǎn)發(fā)吧!