目前為了程式移植方便,許多以spi介面的晶元所提供的參考**大多都使用的是軟體spi,比如筆者用過的儲存晶元w25q16,spi介面驅動的oled顯示屏,lora晶元sx1278等。
最近為了驅動彩色oled顯示屏,為了提高顯示重新整理率,需要對程式**進行優化。於是,將相關spi驅動從軟體模擬轉換為硬體控制,就勢在必行了。
然而,到底軟體模擬spi和硬體spi有多大的速度區別呢?
為了測試的公平性,選用同樣的arm(stm32l151c8t6)以及系統時鐘(32m),配置如下圖所示:
選用了最常用的軟體模擬spi進行寫操作,以單位元組寫指令為例,**如下:
void
spi_write_data
(u8 dat)
else
spi_sclk_set()
; dat<<=1;
}spi_cs_set()
;//spi選通管腳拉高
}
**也很簡單,在通訊前拉低 cs 管腳選通spi對應晶元,然後按高位到低位的順序傳送「dat」內8位資料。我們讓主程式無延時下迴圈傳送資料,用示波器觀測 sck 管腳(或稱scl)的輸出波形,就可以知道spi的傳輸速率了。(這裡需要說明,無論是硬體控制spi還是軟體模擬spi,都沒有用到dma,故而每個位元組傳送間由於程式語句判斷的延遲不在比較範圍內,只比較每個位元組傳送時的時間)
示波器抓取的sck波形如下:
這邊需要注意,每一位的取樣只在sck上公升沿(或下降沿)進行,故而sck每交變一次,傳輸一位資料。圖中可以看出,spi傳送速率在492.4khz左右,每個位元組需要用16.2us的時間來傳送。
硬體控制spi時,首先需要初始化spi介面,接著呼叫hal庫函式hal_spi_transmit即可方便的傳輸資料,基本**如下:
uint8_t tx_str=
"關老師的spi測試陣列\r\n"
;hal_init()
;systemclock_config()
;mx_gpio_init()
;mx_spi1_init()
;//以上皆為使用hal庫所需要做的初始化
hal_spi_transmit
(&hspi1, tx_str,
sizeof
(tx_str)-1
,10000);
//傳送陣列資料,由於只取樣sck管腳
//所以資料內容無所謂
硬體控制spi情況下示波器抓取的sck波形如下:
從波形上我們可以很明顯的看出,spi傳送速率在16mhz,每個位元組需要用0.5us的時間來傳送。
通過對比我們可以很明顯的看出,硬體控制spi比起軟體模擬spi,在相同系統時鐘的情況下,速度要快上32倍。故而,有spi匯流排高速需求的環境下,應當使用硬體控制方式來進行spi通訊。
高速spi固然讓人收益巨大,但也有一定弊端,比如電路走線易受干擾,以及部分晶元對spi匯流排速度有約束,不能設定得過高。在上公升時間與下降時間有特別要求的spi外設下,需要特別注意匯流排寄生容感。
為了提公升spi速率,在程式優化上需要下功夫,減少位元組間的傳輸延遲。
TI 硬體SPI除錯
這久在做乙個無線數傳模組的驅動,需要寫乙個cc2530的spi驅動,結果弄了兩個晚上,這個晶元有些地方實在是很有意思。它的datasheet裡面對於spi的極性和相位的解釋,很複雜。其實,這裡完全可以說的比較明了。cpol為0時,空閒的時候sck為低電平。當cpol為1時,空閒的時候sck為高電平。...
微控制器軟體模擬SPI介面 加深理解SPI匯流排協議
spi serial peripheral inte cer 序列外設介面 是摩托羅拉公司推出的一種同步序列通訊介面,用於微處理器臌控制器和外圍擴充套件晶元之間的序列連線,現已發展成為一種工業標準,目前,各半導體公司推出了大量的帶有spi介面的具有各種各樣功能的晶元,如ram,eeprom,flas...
微控制器軟體模擬SPI介面 加深理解SPI匯流排協議
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!spi serial peripheral inte cer 序列外設介面 是摩托羅拉公司推出的一種同步序列通訊介面,用於微處理器臌控制器和外圍擴充套件晶元之間的序列連線,現已發展成為一種工業標準,目前,各半導體公司推出了大量的帶有spi介面的具有...