前段時間在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...