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