STM32 SPI方式讀寫SD卡

2021-06-09 13:24:03 字數 2158 閱讀 5613

前段時間在51上模擬spi實現了對sd卡的讀取,效果還算不錯,最近將其移植到stm32上,不過使用硬體spi和使用軟體spi還是有差別的。

**如下:

void user_spiinit(void)

spi初始化以後就可以寫spi讀寫函式了,以下兩個函式參照了網上的資料,出處找不到了,但是這兩個函式幫了我大忙,再次感謝提供資料的無名者

void sd_writebyte(unsigned char data)

unsigned char sd_readbyte(void)

有了上面兩個函式,問題就好解決了,下面實現傳送sd命令函式

unsigned char sd_sendcmd(unsigned char *cmd)  //cmd為unsigned char cmd[6]陣列,存放sd固定6位元組命令

while(temp==0xff);

return temp; 

}傳送命令函式完成後下面就該是sd_init()函式了

unsigned char sd_init(void)

while(temp!=0x01);     //不斷傳送cmd0,直到返回0x01,即sd卡的idle狀態(我設定的無論何時sd卡css始終為低電平)

temp=0x03;  //傳送指令cmd55和指令acmd41

cmd[5]=0xff;

dowhile(temp!=0x00);     //迴圈傳送cmd55和acmd41,直到sd卡返回0x00,即初始化完成且進入到spi模式,注意在整個所有的過程中,sd卡的css時鐘為低電平

return temp;  //當然,返回0x00則sd卡初始化成功

}既然sd卡初始化成功,下面就好說了,下面實現讀取乙個512位元組的塊和寫入512位元組的塊

void  sd_read_sigleblock(unsigned long addr,unsigned char *ptr)   //addr為4位元組位址,這裡必須為512的整數倍,ptr為大於512位元組的接受緩衝區指標,必須為byte

while(temp!=0x00);         //直到返回讀取單塊命令的正確應答位元組,即返回0x00,說明命令傳送成功,傳送成功後就要讀取sd傳送的資料了

dowhile(temp!=0xfe&&temp!=0xfc);    //讀取sd卡傳送的資料,不斷的讀取,直到讀到sd傳送的資料開始訊號,即0xfe或0xfc,再往下就是512位元組的正式資料

for(i=0;i<512;i++)

ptr[i]=sd_readbyte();       //讀取512位元組的正式資料

temp=sd_readbyte();        //下面還要讀取兩個位元組的crc校驗資料,sd的spi模式下除了cmd0的crc有效外,其他crc校驗都無效

temp=sd_readbyte();

}void sd_write_sigleblock(unsigned long addr,unsigned char *ptr)  //引數addr為寫入資料的位址,必須為512整數倍;ptr為512位元組的傳送緩衝區指標,必須為byte

while(temp!=0x00);   //迴圈傳送寫單塊命令,直到返回正確應答訊號0x00

sd_writebyte(0xfe);   //給sd卡傳送正式資料的開始位元組訊號0xfe或0xfc,這裡我選取0xfe

for(i=0;i<512;i++)

sd_writebyte(ptr[i]);   //給sd卡傳送要寫的512位元組的正式資料

sd_writebyte(0xff);   //傳送兩位元組的crc校驗資料,雖說沒有用,但形式上還是要傳送的

sd_writebyte(0xff);

}以上都完成後,我們就可以操作sd卡了

unsigned char data[512];

unsigned int i=0;

void mian()

for(i=0;i<512;i++)

data[i]=0xff;

sd_write_sigleblock(0x00000000,data);

for(i=0;i<512;i++)

data[i]=0;

sd_read_sigleblock(0x00000000,data);

//在這裡檢查data裡的內容是否都為0xff即可,如果為0xff,說明一切成功,否則,要檢查了

while(1);

STM32 SPI主從通訊

分享乙個大神的人工智慧教程。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到人工智慧的隊伍中來!我的 我的知乎 獲取更多資訊。主機 訪問密碼 7bb6 從機 訪問密碼 fd5a 訪問密碼 ca90 測試原理及現象 主機間隔500ms傳送10個字元 0 9 從機開啟spi中斷接收資料,接收滿10...

STM32 SPI傳送波形

三 實測波形總結 根據spi協議,stm32傳送的波形有四種可能,如圖所示,主要分為兩種時鐘相位 cpha 和時鐘極性 cpol 關於時鐘極性,也有很多人把它理解為第乙個邊沿,第二個邊沿 也有人覺得cpha 0時,時鐘是從第乙個邊沿啟動,這樣理解不是很準確。其實還有第二種理解方式,那就是它們都是 第...

stm32 spi 疑惑解疑 1

傳送時,可以通過檢測spi sr中的txe位,當資料暫存器裡有資料時,txe位是0,當資料全部從資料暫存器的傳送緩衝區傳輸到移位暫存器時txe位被置1,這時候可以再往資料暫存器裡寫入資料。可以通過 while spi i2s getflagstatus spi1,spi i2s flag txe r...