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