個(gè)人心得:
在做主從雙機(jī)通信時(shí),一定要理解好主機(jī)和從機(jī)的作用,做主機(jī)時(shí)會(huì)控制通信的時(shí)鐘,從機(jī)是不能產(chǎn)生時(shí)鐘的。如果從機(jī)要發(fā)送數(shù)據(jù),那可以在主機(jī)發(fā)送數(shù)據(jù) 的時(shí)鐘上發(fā)送數(shù)據(jù)。配置上差不多是一樣的,就設(shè)計(jì)主從就得了。我這里接收都是用中斷。
還有一點(diǎn)要注意的,做主機(jī)接收時(shí),不能和發(fā)送共用一個(gè)函數(shù)。這個(gè)為什么我自己現(xiàn)在也沒(méi)有清楚,只是在實(shí)驗(yàn)中測(cè)得。
糾錯(cuò):從機(jī)的接收函數(shù)改成,這時(shí)因?yàn)槲覝y(cè)試完成后有改動(dòng)就壓包,后來(lái)測(cè)試發(fā)現(xiàn)主機(jī)不能正常接收到數(shù)據(jù)
更正:我之前的兩個(gè)時(shí)鐘的理論是不合理的,因?yàn)槿p工收發(fā)是可以共用時(shí)鐘的,這個(gè)我在后面改進(jìn)的主機(jī)程序中有體現(xiàn)。
歡迎大家測(cè)試
u8 SPI1_ReadByte(u8 TxData)
{
u8 retry=0;
// while((SPI1->SR&1<<1)==0)//等待發(fā)送區(qū)空
// {
// retry++;
// if(retry>200)return 0;
// }
// SPI1->DR=TxData; //發(fā)送一個(gè)byte
retry=0;
while((SPI1->SR&1<<0)==0) //等待接收完一個(gè)byte
{
retry++;
if(retry>200)return 0;
}
return SPI1->DR; //返回收到的數(shù)據(jù)
}
工具:STM32 MINI板兩塊
注意:NSS軟件管理模式,主機(jī):SSM=1,SSI=1。
從機(jī):SSM=1,SSI=0;
連線(xiàn):主機(jī) SCK<-> SCK 從機(jī)
MISO <-> MISO
MOSI<-> MOSI
SPI主機(jī)通信程序部分截圖:
SPI從機(jī)通信程序部分截圖:
改進(jìn):把主機(jī)改成查詢(xún)接收也是可以的,這時(shí)只要一個(gè)發(fā)送,是真正意義上的全雙工了。
部分程序截圖:(詳見(jiàn)附件內(nèi)容)