找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2599|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM32 SPI讀寫函數(shù)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:104126 發(fā)表于 2016-1-23 00:12 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
//SPIx 讀寫一個(gè)字節(jié)
//TxData:要寫入的字節(jié)
//返回值:讀取到的字節(jié)
u8 SPIx_ReadWriteByte(u8 TxData)
{                                                           
        while((SPI1->SR&(1<<1))==0);         
        SPI1->DR=TxData;          //發(fā)送一個(gè)byte        
        while((SPI1->SR&(1<<0))==0);                                                         
        returnSPI1->DR;         //返回收到的數(shù)據(jù)                                 
}


對(duì)于這樣的讀寫函數(shù)曾有這樣的疑惑,讀就是讀寫就寫為什么要放一起呢。這樣是不是很麻煩,查詢相關(guān)資料有如下解答。


a)寫一個(gè)字節(jié):
​while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) ==RESET);
//確保發(fā)生前Buffer為空,也就是說上一次已經(jīng)發(fā)生完成
​SPI_I2S_SendData(SPI1,Data);
//​往寄存器中寫入一個(gè)字節(jié)
​while (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE) == RESET);
//等待接受到一個(gè)字節(jié)數(shù)據(jù),
為什么要這么做?加這一句的原因是為了確保這個(gè)字節(jié)已經(jīng)發(fā)送出去,因?yàn)榘l(fā)生和接受是并行同步進(jìn)行,那就是說你發(fā)生出去一個(gè)字節(jié)意味著你收到一個(gè)字節(jié)。所以這樣判斷完全沒有問題,再說必要性,如果你不加這句你就會(huì)容易犯過早拉高CS信號(hào)的錯(cuò)誤(相當(dāng)于檢測到收到數(shù)據(jù),那么說明數(shù)據(jù)一定發(fā)完了),你想想如果在SPI_I2S_SendData(SPI1,Data)后面立即拉高CS是什么后果。SPI_I2S_ReceiveData(SPI1);//都會(huì)接收到的數(shù)據(jù),看起來沒什么必要,但以用stm32的經(jīng)驗(yàn)推薦這樣做,也許會(huì)有意想不到的收獲。
​SPI_Writebyte(u8data)
​{
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) ==RESET);
SPI_I2S_SendData(SPI1,Data);
​while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) ==RESET);
​SPI_I2S_ReceiveData(SPI1);
}
b)​讀一個(gè)字節(jié):讀的時(shí)候要注意一個(gè)問題,因?yàn)閺哪J绞菦]法提供時(shí)鐘的,所以主模式下必須要在接收的同時(shí)提供時(shí)鐘。辦法就是發(fā)送一個(gè)字節(jié)來實(shí)現(xiàn),因?yàn)檫是上面說的,發(fā)送一個(gè)字節(jié)就意味著收到一個(gè)字節(jié),代碼和寫完全一樣,只要把讀出來的字節(jié)保存即可。u8SPI_Readbyte(u8data){ while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) ==RESET);SPI_I2S_SendData(SPI1,Data); while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) ==RESET); returnSPI_I2S_ReceiveData(SPI1); }

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表