![]() |
發(fā)布時間: 2022-10-19 00:35
正文摘要:HAL庫函數(shù)編程,同一塊板子里SPI1做主機,SPI2做從機,SPI和相關(guān)GPIO口配置完成后,主程序里用HAL_SPI_Receive_IT()準備接受數(shù)據(jù)。圖片里是main.c中發(fā)送數(shù)據(jù)的程序和中斷回調(diào)函數(shù)(片選NSS寫在SPI2下了,不過設(shè)置NSS ... |
yzwzfyz 發(fā)表于 2022-10-19 08:15 spi有主從關(guān)系,a機發(fā),b機收,需要確保b機狀態(tài),但b機返回時,不是考慮a機狀態(tài),時鐘控制在a機手里,所以此時應(yīng)當依然是a機考慮b機是否準備好了數(shù)據(jù),所以很多偽spi傳輸會有busy線,用來從b機通知a機數(shù)據(jù)是否可以回傳。 |
yzwzfyz 發(fā)表于 2022-10-20 16:53 學(xué)習(xí)了,感謝大佬相助,這就老老實實研究一下庫函數(shù) |
一個CPU在任何任何時刻只能做一件事!!! CPU發(fā)送時,不可能接收。 CPU接收時,不可能發(fā)送。 CPU發(fā)出一個字節(jié),這個字節(jié)就瞬間被寫入了嵌入式的串行模塊,由模塊進行移位,再從串口串出一位位地數(shù)據(jù),這個過程通常需要幾ms。優(yōu)秀的程序不會讓CPU在此死等這個字節(jié)串行發(fā)完,再發(fā)第二個數(shù)據(jù)。而是轉(zhuǎn)去干其它的活。模塊發(fā)完了一個字節(jié)會通知CPU,這時CPU再回來發(fā)下個字節(jié)。 同樣, 優(yōu)秀的接收程序也不會讓CPU死等RI信號,而是在模塊告訴CPU它收到了一個串來字節(jié)后,才轉(zhuǎn)來收這個字節(jié),收到后,通常先存放起來,就去辦別的事了,決不在此花更多的時間。待下次再收到模塊的通知后,才再過來收下另一個字節(jié)。如此,當CPU收到一定的數(shù)量數(shù)據(jù)后(一幀)再集中處理。 你調(diào)用的是別人的程序(函數(shù)),根本無法控制收、發(fā)過程,也不知道別人的程序是否合理。這就悲催了。 仔細研讀你調(diào)用的函數(shù)吧。 |
yzwzfyz 發(fā)表于 2022-10-19 08:15 感謝幫助 程序里是用receive_it準備在接受到數(shù)據(jù)的時候進入中斷,然后在中斷里發(fā)送數(shù)據(jù)回主機,此時兩者應(yīng)該都處于收發(fā)數(shù)據(jù)的狀態(tài)。 剛接觸單片機不久,stm32的標準庫還能看個大致,但是感覺hal庫對我來說太繞了,手上設(shè)備還只能支持hal,代碼確實是在網(wǎng)上找了例程照著大概寫的,因為我不是很能看懂hal庫怎么用 |
設(shè)有A,B二機。 1、A在發(fā)送時,必須保證B在接收。否則數(shù)據(jù)會丟失。 2、B在反回數(shù)據(jù)時,必須保證A在接收。同理。 想一想SPI的通訊過程序吧,假設(shè)A要發(fā)送1,2,3,4,5。程序是送一個數(shù)據(jù)等一等,還是一齊發(fā)完5個數(shù)。當A在發(fā)數(shù)據(jù)的時候CPU在干什么?是在進行B等待嗎?還是在A的發(fā)送中? B接收會在何時發(fā)產(chǎn)中斷,當B在返回數(shù)據(jù)時,CPU在干什么? 能理順、解決好時序關(guān)系,問題就解決了。 編程不是簡單地抄寫語句。 |
Powered by 單片機教程網(wǎng)