SPI簡介
SCK:
和I2C中SCL的時鐘線一個作用,都是在高電平拿出數據,在低電平寫數據
MOSI:
主機輸出從機輸入
MISO:
主機輸入從機輸出,只有當對應從機的SS為低電平,從機的MISO引腳才能設置推挽輸出,當從機SS為高電平時,引腳為高阻態
SS:
從機選擇線,主機想選擇誰就把誰的SS線置低電平(起始條件),當主機想結束通信就把指定從機SS置高電平(終止條件)。SPI就可以不用像I2C一樣通過通信線找從機地址,
注:SPI不允許多主多從,只允許一主多從
當SCK高電平時主機和從機的移位寄存器的高位數據會移到數據線上(SPI是高位先行),移位數據寄存器的剩下7位會整體向高處平移,當SCK低電平時主機和從機都會獲取數據線上的數據進入移位數據寄存器的最低位,依次進行8次一個字節的數據就傳輸完成
如果只想接收不想發送,我們就隨便發送一個數據(從機不會看他,我們一般發0x00或0xff),再讀移位數據寄存器進行了
如果只想發送不想接收,我們不讀接收過來的數據進行了?
四種模式
模式0:
模式0:就是在SCK高電平時接收在數據線上的數據,在SCK低電平時將以移位寄存器上的數據發送到數據線上,因為SCK一開始就是低電平所以當SS置低電平時就要把數據發送到數據線上
模式一:
就是在SCK高電平時發送數據,在低電平時接收數據
模式一和模式三的區別就是SCK的極性取反,模式0和模式2的區別也是SCK的極性取反
注:CPHA決定的是第幾個時鐘沿采樣,并不能決定上升沿采樣或下降沿采樣,只有確定CPOL,CPHA才能決定是上升沿采樣或下降沿采樣
軟件控制SPI
發送指令
在SPI中第一個交換的字節是指令碼加讀寫模式,在從機中有相應的指令集,發送不同的指令碼會與從機中的指令集對應,來產生指令
指定地址寫
當發送完指令碼(0x02,這是指定地址寫的指令)后發送指定地址,不同的芯片地址大小不一樣(具體要發多少位字節的地址要看芯片手冊),由于SPI沒有應答機制,發送完一個字節就可以繼續發送下一個字節,
有些芯片可能會把地址融合到指令碼里面
指定地址讀
指定地址讀的指令碼是(0x03),再發送要指定的地址后,交換的發送字節我們發送0x00或0xFF
這時交換回來的字節就是我們想要的數據
注:這時軟件指定SPI,只要我們在軟件方面指定每個字節的作用就很容易控制SPI
硬件SPI
8/16位數據幀代表,發送一次發送一個字節還是兩個字節
時鐘頻率都是從外設時鐘線上分頻得的,硬件SPI有兩個資源SPI1,SPI2,SPI1搭載APB2時鐘線(72MHZ),SPI2搭載APB1時鐘線(32MHZ)
當發送緩沖區把數據發送到移位數據寄存器時會置標志位(TXE)為1,表示發送緩沖區空
當移位寄存器把數據發送到接收緩沖區后會置標志位(RXNE)為一,表示接收緩沖區非空
硬件SPI支持主機變從機,此時MOSI和MISO的電路會更換
硬件電路沒有配置SS設備,從機選擇需要我們用軟件實現