快速 SPI 端口可通過 GPIO 引腳進行位沖擊,并作為具有 SPI 端口的 8051 兼容微控制器的低成本替代方案。本應用筆記所示的代碼利用8051特有的特性,使用最少的額外代碼創(chuàng)建快速SPI端口。
雖然可以使用帶有SPI端口的8051兼容微控制器,但具有SPI端口通過GPIO引腳位敲擊的低成本器件通常足以滿足許多應用的需求。此處顯示的代碼利用特定于 8051 內核的功能,以最小的工作量創(chuàng)建快速 SPI 端口。#define語句中的 CPHA、CPOL 和CS_TOGGLE_BETWEEN_BYTES常量初始化宏,這些宏根據正在實現的 SPI 端口類型定制代碼。 預處理器在編譯時而不是運行時執(zhí)行此代碼定制,從而節(jié)省了寶貴的時鐘周期,如果使用決策結構(即常規(guī)的 if-else 語句),這些周期將被浪費。
下面的代碼包括利用 8051 內核功能所需的特定于 8051 的 C 命令。盡管這些命令是特定于編譯器的(在本例中為 8051 的 Keil μVision v2 開發(fā)工具),但所有適用于 8051 兼容設備的“好”C 編譯器都包含類似的命令。
檢查代碼,PORT_0定義為 sfr 類型,它提醒編譯器此標簽是 8051 特殊功能寄存器 (SFR)。由于此 SFR 是位可尋址的,因此 sbit 類型定義引用特定 SFR 位以充當 SPI 端口引腳的標識符。spiTmp 聲明中使用的 bdata 類型允許將此變量放置在 8051 內核的直接可尋址 RAM 內的特殊位可尋址內存中。同樣,sbit 類型定義了將引用 spiTmp 變量中特定位的標識符。
要通過 SPI 端口發(fā)送的字節(jié)將加載到全局字節(jié)數組 spiData 中。將此變量聲明為全局變量允許 SPI 發(fā)送/接收函數訪問 spiData,而無需將其作為參數傳遞。使用數據標識符聲明它強制編譯器將數組存儲在 8051 內核內最快的可訪問內存(直接可尋址內存)中。
spiReadWriteBlock 函數包含位撞擊 SPI 端口的代碼。它使用此 SPI 端口有效地傳輸 spiData 數組中的每個字節(jié),從數組中的最后一個元素到第一個元素。使用此反向順序訪問數組允許與零進行比較(請參閱代碼),由于 8051 指令集,這意味著更快的組裝。當 spiReadWriteBlock 函數完成時,使用 SPI 端口讀取的字節(jié)將替換 spiData 數組中的原始數據,再次從數組中的最后一個元素開始到第一個元素。
請注意,代碼經過優(yōu)化,可以發(fā)送和接收大于一個字節(jié)的數據塊。對于單字節(jié)傳輸,應刪除 spiReadWriteBlock 中的循環(huán)結構和局部變量。(這可以使用預處理器完成。
當針對Maxim DS89C430/450系列8051兼容微控制器進行編譯時,該位撞擊式SPI端口的運行速度略高于2Mbps,如圖1所示。此外,該代碼只需要兩個字節(jié)的可直接尋址RAM和139字節(jié)的閃存用于代碼空間(包括SPI端口初始化和主程序循環(huán))。
圖1.這些波形表示當CPHA、CPOL和CS_TOGGLE_BETWEEN_BYTES常數設置為1時,位撞擊SPI端口的輸出。此固件使用 8051 內核中的位可尋址存儲器來提高 SPI 端口的速度。
審核編輯:郭婷
-
微控制器
+關注
關注
48文章
7454瀏覽量
150853 -
寄存器
+關注
關注
31文章
5294瀏覽量
119816 -
GPIO
+關注
關注
16文章
1188瀏覽量
51836
發(fā)布評論請先 登錄
相關推薦
評論