TI 硬體SPI除錯

2021-07-24 01:14:01 字數 1635 閱讀 7034

這久在做乙個無線數傳模組的驅動,需要寫乙個cc2530的spi驅動,結果弄了兩個晚上,這個晶元有些地方實在是很有意思。

它的datasheet裡面對於spi的極性和相位的解釋,很複雜。

其實,這裡完全可以說的比較明了。

cpol為0時,空閒的時候sck為低電平。當cpol為1時,空閒的時候sck為高電平。

cpha呢,當等於1時,在第二個邊沿取樣,當它為0時,在第乙個邊沿取樣。

然後,對於spi速率的配置,給了個公式

不過,這公式我個人認為不太實用,畢竟spi通訊,盡量還是用那幾個經典的波特率,下面的這張表,這比上面這公式實用的多。

接著,引腳的選擇,datasheet裡面又給了張表,

這個ssn腳是從機可以把這個對映到外設,但是主機就不用拘於這個引腳,因為

它說主機需要自己選擇ssn腳,用gpio模式,軟體控制。所以任意gpio腳都行。

接著重頭戲來了。cc2530作為主機時候的傳送比較簡單,只用配置好後,像uxbuff裡面寫入資料,這時它就會自動傳送,這時,只用一直讀取uxcsr.tx_byte位就行,當它為1時就傳送完成了。

void spi_write(unsigned char command)  

//等待傳送完成

u1csr &= 0xfd;//復位 }

void spi_write(unsigned char command)

//等待傳送完成

u1csr &= 0xfd;//復位

}

但是cc2530作為主機時候的接收就比較奇葩。因為它的設計機制實在是天馬行空。它把uxbuff變成了乙個doublebuff,然後在傳送的同時,它就開啟了接收。

因為速率是匹配的,所以,傳送完成的時候,接收也就完成了。所以,為了和正常的外設聯調,當我們需要讀取資料時,我們需要先向uxbuff裡面灌進資料,這樣才能輸出時鐘,然後讀的標誌位是uxcsr.tx_byte,並不是uxcsr.rx_byte!!!

由上圖可以知道,rx_byte只有在從機模式的時候才有效,tx_byte則在主機模式的時候才有效。

下面附上接收**。

unsigned char spi_read(void)  

//等待傳送完成

u1csr &= 0xfd;//復位

unsigned char temp = u1dbuf;//讀取uxbuff時,硬體會自動清零

return temp;  }

spi除錯記錄

1.iwr1443作為spi主裝置,msp432p401r作為spi從裝置。為什麼選spi 本來選用的是uart,但是uart的速率比較低,115200是最穩定的,速率高了之後432接收就丟資料了。還有更重要的一點,uart的tx端預設是高電平,在1443已經斷電的情況下,還是能通過432的tx腳進...

CubeMX,HAL庫使用硬體SPI

分別是 全雙工stm32作為主機 全雙工stm32作為從機 半雙工stm32作為主機 半雙工stm32作為從機 stm32只作為主機接收 stm32只作為從機接收 stm32只作為主機傳送 stm32只作為從機傳送 cpol 時鐘極性選擇,為0時spi匯流排空閒為低電平,為1時spi匯流排空閒為高電...

硬體SPI與軟體模擬SPI速度區別實測

目前為了程式移植方便,許多以spi介面的晶元所提供的參考 大多都使用的是軟體spi,比如筆者用過的儲存晶元w25q16,spi介面驅動的oled顯示屏,lora晶元sx1278等。最近為了驅動彩色oled顯示屏,為了提高顯示重新整理率,需要對程式 進行優化。於是,將相關spi驅動從軟體模擬轉換為硬體...