之前分享過的SPI通訊實例:STM32硬件SPI主從通信實例,是基于一塊STM32的兩個SPI通訊。如果要進行兩塊STM32之間的SPI通訊,需要注意一些什么呢?
兩塊STM32之間的SPI通訊平時用的比較少,之前我也沒有用過,網上也查了很多資料,沒有找到現成的,能直接用的例子(做軟件的不就是copy嗎=v=)。
所以只能自己來實現了,本以為與在同一片STM32上做SPI主、從機通信一樣,以為挺簡單的,但是實際做起來還是遇到了不少問題,比如出現數據移位、多出了一些數據等問題。下面簡單分享一下實現過程:
一、整體框圖及說明
這里使用STM32F429IGT6作為主機,STM32F103ZET6作為從機,都配置為全雙工。本例要實現的功能就是主、從機之間的數據互傳。
主機往從機發送的數據為:
從機往主機發送的數據為:
二、關鍵代碼
主機關鍵代碼:
從機關鍵代碼:
可見,主機與從機的代碼大多都一樣。只是從機多了一步啟動傳輸的操作,這一步很關鍵,少了這一步傳輸就不正常。這是為了制造主機發送的同時也要接收到數據的條件。這一點參考手冊里也有相關說明:
此處,要營造這樣的條件,必須先啟動從機,然后再啟動主機。只有保證主機發送的同時有接收到數據,才能保證其時序的正常,否則可能會產生數據錯位,或者會產生多余數據等情況。
三、調試
我們平時在做實際的開發時,一般很難做到把所有代碼寫完,跑一遍就能成功,都是需要進行各個子模塊的調試,一步一步來,確保各個子模塊都沒有問題之后,整體跑起來自然就比較穩定。
一些經驗豐富的軟件工程師常會教導一些年輕的軟件工程師:在接到一個開發任務之前,先不要急著碼代碼,首先需要明確你這項任務的需求是什么,把任務分解成各個模塊,然后在電腦上或紙上畫出整體框圖,確保框圖的正確性之后,再根據框圖來編寫代碼、調試。
此處,我們要調試SPI主從通信,自然也是這樣分模塊進行調試的:
確認主機是否能正確發送數據
確認從機是否能正確發送數據(返回數據給從機)
確認從機是否接收到主機發過來的數據
確認主機是否接收到從機發過來的數據
若這幾個點明確了,都沒問題之后。就可以明確我們的SPI主、從機的基本通訊沒有問題了,之后就可以進行我們的協議方面處理了(本例中沒有這一部分)。下面分別看一些這幾個點:
1、確認主機是否能正確發送數據
方法:使用邏輯分析儀捕捉主機的MOSI、SCK這兩條信號線,查看其波形。實際測得地結果如下:
其中,白色為SCK信號線波形,橙色為MOSI信號線波形。顯然,從MOSI波形可以看出其與我們主機發送的數據一致,自然就可以確認主機發送數據沒問題了。
此處,細心的朋友可能會發現時鐘線波形的兩個數據交互處的高電平總是寬一些,這里我們的SPI傳輸數據的位數設置為8bit,則每一個數據對應的第8位對應的時鐘信號的高電平總會長一些;若我們的SPI傳輸數據的位數配置為16位,則第16位對應的時鐘信號的高電平總會長一些。
出現這個現象其實與我們的代碼是有一定關系的。實際測試中發現是因為我們用while循環來做邏輯處理的問題,想辦法把while等待替換為if判斷,就可以改善這個問題。但是考慮到這并不會影響我們的數據,并且另一方面還有助于我們分析波形,所以使用while。
2、確認從機是否能正確發送數據(返回數據給從機)
使用邏輯分析儀來捕捉MISO的波形,其波形如下(此處只捕捉了數據波形):
顯然,我們的從機發送數據也是沒問題的。
3、確認從機是否接收到主機發過來的數據
這里使用在線調試的方法檢測從機的接收buf,結果如下:
顯然,從機收到的數據與主機發送的數據一致,說明從機接收也是沒有問題的。由于手頭里只有一個仿真器,所以也就沒有同時監測主機的接收buf,監視主機的接收buf與監視從機的方法是一樣的。
四、調試過程需要注意的問題
1、兩塊板子一定要共地。
2、兩塊板子的MOSI與MISO不需要交叉連接。
-
STM32
+關注
關注
2270文章
10895瀏覽量
355743 -
SPI
+關注
關注
17文章
1706瀏覽量
91507
發布評論請先 登錄
相關推薦
評論