本文檔是移植SPI總線驅動到NUC970平臺過程的總結,提供一些SylixOS SPI驅動相關的框架理解和移植心得。框架
NUC970平臺上SPI總線驅動框架如圖 21所示,SPI總線框架可分爲兩個部分,函數
總線相關初始化和數據傳輸流程。測試
圖21 SPI驅動流程圖ui
SPI總線驅動可分爲兩個部分:總線相關初始化和數據傳輸,下面對這兩個部分的流程和代碼編寫作詳細介紹。spa
SPI總線初始化主要有:SPI管腳複用、SPI控制器初始化、建立SPI操做函數集和建立SPI總線適配器。開發
SPI管腳複用是將SPI總線相關的管腳使能,如:SPI片選引腳CS、SPI時鐘引腳SCLK、SPI數據輸出引腳MOSI和數據輸入引腳MISO。如圖 31所示,經過通道號uiChannel判斷是初始化SPI0總線仍是初始化SPI1總線的管腳複用。文檔
圖 31 SPI管腳複用配置
SPI控制器初始化主要工做是對SPI數據傳輸的方式和頻率的設置,如圖 32所示。循環
圖 32 SPI控制器初始化函數im
建立包含SPI操做函數集的結構體,如圖 33所示。
圖 33 SPI總線函數集
如圖 34所示,建立SPI總線適配器是將SPI總線加入系統的總線層。pSpiFuncs是LW_SPI_FUNCS(SPI操做函數結構體)類型,每一個SPI設備經過掛載在一個SPI總線適配器上,得到SPI總線操做函數。
圖 34 建立SPI總線適配器
如圖 35所示,數據傳輸時,先將數據寫到SPI_Tx寄存器中,經過調用__spiStartTx函數開始數據傳輸,等待傳輸完成後調用__spiStartRx函數將接收到的數據從SPI_Rx寄存器中讀取出來。循環這一過程直到數據發送完成。
圖 35 數據傳輸流程
NUC970開發板的SPI總線,能夠經過配置SPI_CNTRL寄存器,設置單次傳輸的數據的字節數。這裏以單個字節傳輸爲例。如圖 36所示。
圖 36 __trySpiTransfer函數實現
如圖 37所示,將SPI_CNTRL寄存器的"Go_Busy位"置1,數據傳輸開始,等到傳輸完成,"Go_Busy位"會被清零。因此每次數據傳輸,都要將"Go_Busy位"置1,等到"Go_Busy位"被清零後,再進行下一步操做。
圖 37 __spiStartTx函數實現
如圖 38所示,當調用__spiStartTx函數數據傳輸完成後,會調用__spiStartRx函數將接收到的數據從SPI_Rx寄存器中讀取出來,到這一步SPI的一次數據傳輸就完成了。
圖 38 __spiStartRx函數實現
SPI驅動正常啓動和加載的狀況下,調用SPI傳輸函數,用示波器測量時鐘和數據管腳的波形,若是傳輸的數據和時鐘能正確匹配,說明基本完成移植。