那么今天再說說SPI吧,通過前面的IIC其實我們知道,通訊協議,其實就是通過時序來傳輸數據,通過自定義不同的函數來實現數據的傳輸(具體就是按照時序,來讀寫寄存器的標志位,來完成數據傳輸的具體操作),所以可以通過再定義不同的函數來讀寫相應存儲傳輸數據的存儲空間,以完成對數據的處理,那我們前面提到的IIC主要應用到的地方就是讀寫EEPROM,那今天說的SPI,就以讀寫FLASH來講講它的通訊原理。
其實我們知道它與IIC不同的是,它是由4條線路控制的
片選:
選擇設備是根據片選線拉低電平來得到選中的,這就表示通訊開始了,通訊結束就拉高電平即可;其實很前面就說過它的通訊原理。
時鍾:
那再說說它的時鍾線,時鍾的極性和相位可以決定四種通訊方式,配置的時候,就要看你的從設備是使用那種方式,來進行配置的,還有就是不同的SPI所在的總線不一樣,不同的頻率也不一樣,但分頻系數都一樣,使用的時候具體查資料配置。
數據線:
還有即使兩條數據線,以數據的傳輸方向來區分,類似與串口的那兩條數據信號線路。
數據控制:
與IIC不同的是,這里引入了緩沖區,也就是在數據寄存器和移位寄存器之間加入了緩沖區,為什么要加入緩沖區?應該是SPI的傳輸速率較快,引入緩沖區來提高數據傳輸效率。
控制邏輯:
還是之前的那句話,通過讀取狀態寄存器相應位,來獲取工作狀態;當然還可以控制寄存器來配置工作模式,SPI信號中斷,DMA請求。
主模式收發流程:
- 控制片選線,產生開始信號
- 將要發送的數據寫入數據寄存器,改數據會被發往緩沖區
- 按照時鍾,MOSI會把數據一位一位發送出去(通過移位寄存器),MISO反之
- 發送完一幀數據,SR的TXE置1表示發送緩沖區已空;接收完一幀數據,RXNE置1表示接受緩沖區非空。
- 當TXE為1,若還要繼續發送數據,就向數據寄存器寫數據;當RXNE為1,讀取數據寄存器以獲取接受緩存區里的數據
如若使能了TXE或RXNE中斷,他們置1時會產生SPI中斷信號,當然只會進入同一個中斷服務函數,再里面檢查相應位可以判斷是那個事件觸發的中斷,以分別進行處理;也可以用DMA的方式來讀取數據寄存器里的數據。
FLASH:
其實操作FLASH和EEPROM差不多,只不過他們的頁大小不同,而且FLASH只能寫入頁或塊,擦除的最小單位是扇區,而EEPROM可以擦寫字節;FLASH寫的時候要先擦除原來的內容;FLASH自身定義了一些操作,通過發送指令來完成一些特殊操作(命令定義為一個字節的數據來發送給flash)。SPI-FLASH是NORFLASH,它具有統一編址,所以可以按地址讀寫。注意存儲代碼的是在芯片內部的FLASH,與這里說的不是一個概念。
