sd卡學習(sdio和spi模式)
* *sd卡的操作模式:sd卡模式(sdio)、spi模式(預設為sd模式)。
其中sd卡模式的訊號線有:clk、cmd、dat0-dat3,6根線。
spi模式的訊號線有:cs、clk、miso(dataout)、mosi(datain),4根線。
sd卡只能使用3.3v的i/o電平。spi模式下訊號線要加10-100k的上拉電阻。
sd卡有五個暫存器:總共有8個暫存器 名稱
寬度描述
cid128
卡標識暫存器
rca16
csd128
scr64
sd配置暫存器:sd卡特定資訊資料
ocr32
操作條件暫存器
sd卡的命令格式:
命令cmd0就是0,cmd16就是16,以此類推。
spi命令格式為6位元組構成,高位在前(msb)。
位元組1位元組2-5
位元組67
65-001
command
位元組1的最高2位固定是01,低6位為命令號(cmd0就是0,cmd16就是16,以此類推),位元組2-5為命令引數,有些命令是沒有引數的;位元組6的高7位為crc,最低位恒為1。
sd卡的命令總共有12類,下表為幾個比較重要的命令:
命令引數
回應描述
cmd0(0x00)
none
r1復位sd卡
cmd8(0x08)
vhs+check pattern
r7傳送介面狀態命令
cmd9(0x09)
none
r1讀取卡特定資料暫存器
cmd10(0x0a)
none
r1讀取卡標誌資料暫存器
cmd16(0x10)
塊大小r1
設定塊大小(位元組數)
cmd17(0x11)
位址r1
讀取乙個塊的資料
cmd24(0x18)
位址r1
寫入乙個塊的資料
cmd41(0x29)
none
r3傳送給主機容量支援資訊和啟用卡初始化過程
cmd55(0x37)
none
r1告訴sd卡,下乙個是特定應用命令
cmd58(0x3a)
none
r3讀取ocr暫存器
sd卡和微控制器的通訊採用傳送應答機制:
r1響應格式位含義
初始化sd卡過程:
spi操作模式下:在sd卡收到復位命令時,cs為有效電平(低電平),則spi模式被啟用,在傳送cmd之前要先傳送74個時鐘,64個為內部供電上公升時間,10個用於sd卡同步;之後才能開始cmd操作,在初始化時clk時鐘不能超過400khz。
接著我們看看sd卡的初始化,*sd卡的典型初始化過程如下:*
1、初始化與sd卡連線的硬體條件(mcu的spi配置,io口配置);
2、上電延時(>74個clk);
3、復位卡(cmd0),進入idle狀態;
4、傳送cmd8,檢查是否支援2.0協議;
5、根據不同協議檢查sd卡(命令包括:cmd55、cmd41、cmd58和cmd1等);
6、取消片選,發多8個clk,結束初始化
這樣我們就完成了對sd卡的初始化,注意末尾傳送的8個clk是提供sd卡額外的時鐘,完成某些操作。通過sd卡初始化,我們可以知道sd卡的型別(v1、v2、v2hc或者mmc),在完成了初始化之後,就可以開始讀寫資料了。
sd卡讀取資料,這裡通過cmd17來實現,具體過程如下:
1、傳送cmd17;
2、接收卡響應r1;
3、接收資料起始令牌0xfe;
4、接收資料;
5、接收2個位元組的crc,如果不使用crc,這兩個位元組在讀取後可以丟掉。
6、禁止片選之後,發多8個clk;
以上就是乙個典型的讀取sd卡資料過程,sd卡的寫於讀資料差不多,寫資料通過cmd24來實現,具體過程如下:
1、傳送cmd24;
2、接收卡響應r1;
3、傳送寫資料起始令牌0xfe;
4、傳送資料;
5、傳送2位元組的偽crc;
6、禁止片選之後,發多8個clk;
以上就是乙個典型的寫sd卡過程。關於sd卡的介紹,我們就介紹到這裡,更詳細的介紹請參考光碟sd卡的參考資料(sd卡2.0協議)。
SD卡學習(SDIO和SPI模式)
sd卡的操作模式 sd卡模式 sdio spi模式 預設為sd模式 其中sd卡模式的訊號線有 clk cmd dat0 dat3,6根線。spi模式的訊號線有 cs clk miso dataout mosi datain 4根線。clk 時鐘同步線 cmd 命令訊號線,主機發出的命令以及從機對命令...
SD卡的SDIO模式 SPI模式設計掃盲
sd卡 secure digital card 是sd卡協會開發的低成本,非易失性儲存卡格式 相比較於ram,sd卡掉電資料不丟失 隨著本世紀電子技術的高速發展,對於這種中等型號,節能 節省空間的儲存器裝置的需求一直在快速增長 sd卡還具有不同的尺寸或形狀因子,包括standard sd卡,mini...
STM32 SPI方式讀寫SD卡
前段時間在51上模擬spi實現了對sd卡的讀取,效果還算不錯,最近將其移植到stm32上,不過使用硬體spi和使用軟體spi還是有差別的。如下 void user spiinit void spi初始化以後就可以寫spi讀寫函式了,以下兩個函式參照了網上的資料,出處找不到了,但是這兩個函式幫了我大忙...