DSP28335的硬體SPI使用(無FIFO)總結

2021-10-09 23:55:29 字數 2323 閱讀 9104

這兩天折騰了乙個旋變器解算模組的使用,類似於這種器件一般都是使用通訊的方式寫入晶元對應的暫存器的資料從而初始化晶元或得到可程式設計的結果;反之,我們也需要讀取其模組、晶元內部經過解算得到的儲存內容在spi的sclk引導下傳輸到dsp的硬體spi內的接收暫存器中。

對於硬體spi的使用從成功啟動的角度來看並不麻煩,麻煩的是以下幾點:

如何在接收到自己想到的資料之後就停止接收,並進行相關處理;

如何寫入自己想要的長度的資料,例如暫存器是八位的位址,但我一次性只能寫入16位的,可以達到自己想要的目的嗎?

是否需要使用接收中斷或者傳送中斷,該如何使用?

對於這三個問題,我在這次的小專案實踐中都有了一定程度的理解。首先講一下這個專案對於spi的寫入讀取要求:寫入需要乙個八位位址和乙個八位資料,首先寫入乙個位址,至少間隔幾微秒後可以寫入該位址對應暫存器的資料,達到可程式設計的目的。寫入的時候需要在sclk的上公升沿寫入;讀取的時候讀取到的資料一共有24位,可以分成3個8位讀取,另外讀取的時候需要在下降沿讀取。

實質上28335的spi功能與其他處理器類似,但有點不同的就是它有個fifo操作。這裡不得不提的就是,fifo功能實質上是對標註年spi模式的覆蓋,fifo的功能裡包括了spi的功能,但相反的,你使用了fifo的功能後spi的一些功能就會被限制或者是無效。fifo的優勢就是它具有傳送和接收緩衝器,乙個緩衝器最多可以放16個字。其fifo功能的狀態位,比如txffint、rxffovfclr等都是針對它的傳送和接收緩衝器所設定的,這就形成了乙個問題,比如我想接收乙個位元組後或者傳送乙個位元組後,傳送和接收功能就暫停,這在fifo模式下是無法做到的,因為fifo的緩衝器最少最少是乙個字,即16位。那麼針對我們這個小專案的功能他就顯然不滿足了。因為我的專案中在傳送乙個位址的位元組後需要等待幾微秒,再傳送乙個資料位元組,但是fifo的傳送緩衝器最少的儲存大小為乙個字,所以fifo會等待傳送緩衝器裡放入了位址和資料兩個位元組後開始連續傳送,這就會造成從機無法識別的後果。所以在經過考慮之後,我選擇使用dsp28335的標準spi功能。

在進行spi初始化的過程中,最主要的就是spiccr(進行軟體復位和移位時鐘極性選擇)和spictl(控制資料傳送、中斷產生、sclk相位、以及主從模式)兩個暫存器的初始化,另外還需要進行初始化的暫存器就是spibbr,這個暫存器就是乙個波特率選擇的暫存器,使用上並沒有問題。值得一提的是spiccr的低四位的功能非常重要,稱為字元長度控制位,這四位就決定了在標準spi模式下,一次性傳送和接收資料的位數,這裡我選擇的就是8位,這樣每次我寫入乙個8位資料後就會自動傳送給從機,然後spi的時鐘線就會置高暫停傳送。

在初始化之後,我們要進行的就是spi資料什麼時候傳送完,以及什麼時候接收完,因為只有完成了傳送和接收,cpu才能做其他的事情,否則時鐘線就會被迫暫停,因為資料還沒發完,cpu就去做其他事情了。所以在選擇好了字元長度控制位為8位後,我還需要等它傳送完,spi的時鐘線才能正常置高。這裡就需要用到另乙個暫存器,也就是spists,該暫存器是乙個狀態暫存器,其中的第6位標誌位,也就是spi int flag,就可以用來完成我們剛所需要的操作,這是乙個唯讀標誌位,別看它叫中斷標誌位,但它跟我們所理解的中斷並不是一回事,無論是否開啟spi中斷,它在已完成傳送最後一位和接受最後一位的操作後都會硬體置1,除了一種情況,就是你開啟了fifo模式後,該標誌位就不會變化了。清除這個標誌位的操作,手冊上都有,我就不說了。另外需要指出的一點是,該標誌位在傳送或者接收最後一位剛剛開始就會置1,如果你馬上幹其他事兒,那麼在sclk的最後乙個脈衝就會被削成尖波,那樣的話,最後一位資料可能會傳送或者接收失敗。所以一般在後面加乙個延時操作,具體傳送的**示例如下:

spiaregs.spitxbuf=a;

while

(!spiaregs.spists.spi int flag)

delay_us(8

);

那麼我們有沒有必要開啟spi的中斷來傳送和讀取資料呢?我的回答是沒有的,至少對於這個專案是沒有的。如果開啟了中斷,那麼我們在傳送乙個資料或者接收乙個資料之後都會進入一次中斷,實質上對於cpu的損耗是很大的,並且將接收到的資料的處理放在程式序列結構之中也沒有過多的影響,整體結構清晰美觀,不會產生過多的跳躍閱讀的情況。

說在最後

對於這個專案,其實使用模擬spi更加方便,直接用io口模擬sclk的時序,在上公升沿的時候將輸出引腳的狀態改變以模擬資料傳送,在下降沿的時候讀取輸入引腳的高低電平狀態以模擬資料輸入。只不過傳送和接收的時候速度慢一些,但對於這個專案來說,傳送的資料並不多,且都是8位的,足夠了!

DSP28335之SPI配置與使用總結

現在簡單介紹一下,spi四種模式,已了解的同學可以跳過這一段 以下分別是spi模式0123 時序解釋 cpol 時鐘極性選擇,為0時spi匯流排空閒為低電平,為1時spi匯流排空閒為高電平 cpha 時鐘相位選擇,為0時在sck第乙個跳變沿取樣,為1時在sck第二個跳變沿取樣 言歸正傳,dsp283...

DSP28335 外設時鐘

tms320f28335通過外部時鐘訊號 osc和pll產生倍頻時鐘訊號clkin後,clkin經過cpu後產生時鐘sysclkout clkin和sysclkout頻率是一樣的 sysclkout給各個片內外設提供時鐘訊號。為了實現低功耗和提供高低頻率時鐘訊號,需要把sysclkout進一步分頻,...

DSP28335系統時鐘

鎖相環是一種控制晶振使其下你跟對於參考訊號保持恆定的電路。主要作用是通過軟體實時配置片上外設時鐘 譬如當30mhz的oscclk訊號經鎖相環倍頻後,倍頻倍數可通過pllcr div 設定,可設定為10,經過pll後的訊號變為300mhz,因為28335的時鐘頻率為150mhz,所以需要將pllsts...