重點是說SPI通信協定,,,,
不要害怕協定因為協定是人規定的,,剛好我也是人......規定的協定既然能成為規範讓所有人所接受,那麼必然有它的優勢和優點,必然值得學習,,
害怕協定的人是因為當初碰到了不懂的老師,他隻會告訴你這很難............其實是他不會........

CS : Chip Selection 片選引腳,多個裝置時可以用這個引腳選擇和哪個裝置通信
MOSI : Master Out Slave In 主機輸出資料引腳,,,,從機接收資料引腳
MISO : Master In Slave Out 主機接收資料引腳....從機輸出資料引腳
CLK : 時鐘
還有兩個參數----假設有的單片機自帶硬體SPI,一定會提供設定下面兩個參數,,,當然有的支援SPI通信的晶片也可能涉及這兩個參數
CPOL :表示時鐘信号(CLK引腳)在空閑時是高電平還是低電平
CPHA :表示資料在時鐘信号(CLK)的第幾個沿開始資料傳輸
現在假如說
CPOL = 0 ;//時鐘信号(CLK引腳)在空閑時是低電平
CPHA = 0;//資料在時鐘信号(CLK)的第1個沿開始資料傳輸
通信的時候先傳輸高位
假如說 主機發給從機 10101010 從機發給主機 01010101
再假如 主機接收資料存到 MasterData 裡面
從機接收資料存到 SlaveData 裡面
第一個上升沿 主機的10101010 最高位是 1 是以主機會讓MOSI引腳輸出高電平
從機的01010101最高位是 0 是以從機會讓MISO引腳為低電平
第一個下降沿 主機接收MISO引腳的資料,因為是低電平是以 MasterData= 0000 0000;
從機接收MOSI引腳的資料,因為是高電平是以從機SlaveData = 0000 0001;
第二個上升沿 主機左移一位 0101010X 最高位是 0 是以主機會讓MOSI引腳輸出低電平
從機左移一位 1010101X 最高位是 1 是以從機會讓MISO引腳為高電平
第二個下降沿 主機接收MISO引腳的資料,因為是高電平是以 MasterData= 0000 0001;
從機接收MOSI引腳的資料,因為是低電平是以從機SlaveData = 0000 0010;
就這樣8個上升和8個下降沿之後
MasterData = 01010101
SlaveData = 10101010
CPHA = 1;//資料在時鐘信号(CLK)的第2個沿開始資料傳輸
第一個下降沿 主機的10101010 最高位是 1 是以主機會讓MOSI引腳輸出高電平
第一個上升沿 (注意是标号為1的那個,,,實際上是第二個上升沿)
主機接收MISO引腳的資料,因為是低電平是以 MasterData= 0000 0000;
第二個下降沿 主機左移一位 0101010X 最高位是 0 是以主機會讓MOSI引腳輸出低電平
第二個上升沿 主機接收MISO引腳的資料,因為是高電平是以 MasterData= 0000 0001;
第八個下降沿 主機把最後一位0放在了 MOSI引腳輸出低電平
從機把最後一位1放在了 MISO引腳輸出高電平
其實作在我也有疑惑,,,這樣就完了嗎??????隻把資料放在引腳上就行了嗎????然後内部硬體就自動接收了嗎????
看一下摩托羅拉的資料手冊
難道最後一位會自動的接收?????搞不懂咧咧.....改天自己測試一下,,,讓主機工作在
然後讓主機發一個位元組的資料看看CLK怎樣變化的..............然後再嘗試手寫從機接收....然後知道結果了再來修改這個地方....
其餘的兩種就不說了
其實說白了就是
CPOL控制在空閑狀态下CLK是高電平還是低電平
CPHA控制資料是在第一個沿就開始傳輸還是在第二個沿
其實呢!!寫程式最終還是要看晶片的資料,,,,,
現在看一下ESP8266的SPI
用SPI1,主機模式,,空閑狀态下Clk為高電平,,第二個沿開始資料傳輸,8位資料,8分頻(10Mhz),預設半雙工
發送資料呢就簡單了
比如向從機發送0xaa,0x55,0x02,0x01
接收資料呢還另有個函數
假設需要接收4個資料
其實就是讓CLK産生32個脈沖信号,每8個代表一個位元組的資料,,後面的0xaa哈,是在産生脈沖信号的時候MOSI引腳發送的資料,,如果不寫
預設發0xFF
對了接收到的資料都是以字元串的形式儲存在變量裡面,,可能會問我怎麼自己解析資料呢
假如說判斷是不是接收到0xaa 和0x55
aa = spi.recv(1,2,0xaa)
if aa:byte(1)==0xaa and aa:byte(2)==0x55 then
自己的執行函數
end
大家肯定會說你咋知道要這樣寫
因為有API文檔
還有一點,,我一開始看到過别人這樣做過,,是以呢我就知道可以這樣用....知識這東西一定要活學活用
<a href="http://blog.csdn.net/silno/article/details/72866623?locationNum=10&fps=1" target="_blank">http://blog.csdn.net/silno/article/details/72866623?locationNum=10&fps=1</a>
最後說一下和STM32進行SPI通信的一些注意,,,當然是把stm32配置成從機模式,,然後呢其餘的設定一定要一樣
列如我配置的
要注意
CS引腳在子產品剛啟動的時候一定是低電平............
再說一點,我的32程式用的中斷接收的SPI的資料,然後在中斷裡面準備發送的資料,,大家這樣想
主機的資料發過來一個位元組資料之後才進的中斷,,是以如果想在中斷裡面發送資料,,應該在進中斷之前準備好資料的第一個位元組
假設主機需要讀四個位元組就會進四次中斷
我從機發給主機的資料是0xaa 0x55 0x01 0x02
char table[4] = {0xaa, 0x55, 0x01, 0x02}
在主機發送資料之前
我需要 SPI2->DR = table;
Spi2SendBuff = table+1;
這樣的話來第一個中斷的時候我的第一個資料0xaa也發向了主機,然後又準備了第二個資料,,,,,,,四次中斷就會把資料發給了主機,,注意指針溢出亂指了一下
這篇文章呢主要是會用ESP8266的SPI就行哈......