天天看點

三,ESP8266 SPI(基于Lua腳本語言)

重點是說SPI通信協定,,,,

不要害怕協定因為協定是人規定的,,剛好我也是人......規定的協定既然能成為規範讓所有人所接受,那麼必然有它的優勢和優點,必然值得學習,,

害怕協定的人是因為當初碰到了不懂的老師,他隻會告訴你這很難............其實是他不會........

三,ESP8266 SPI(基于Lua腳本語言)

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個沿開始資料傳輸

三,ESP8266 SPI(基于Lua腳本語言)

通信的時候先傳輸高位

假如說  主機發給從機   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個沿開始資料傳輸

三,ESP8266 SPI(基于Lua腳本語言)

第一個下降沿  主機的10101010 最高位是 1 是以主機會讓MOSI引腳輸出高電平

第一個上升沿  (注意是标号為1的那個,,,實際上是第二個上升沿)

                       主機接收MISO引腳的資料,因為是低電平是以 MasterData= 0000 0000;

第二個下降沿  主機左移一位  0101010X 最高位是 0 是以主機會讓MOSI引腳輸出低電平

第二個上升沿  主機接收MISO引腳的資料,因為是高電平是以 MasterData= 0000 0001;

 第八個下降沿  主機把最後一位0放在了 MOSI引腳輸出低電平  

                               從機把最後一位1放在了 MISO引腳輸出高電平  

其實作在我也有疑惑,,,這樣就完了嗎??????隻把資料放在引腳上就行了嗎????然後内部硬體就自動接收了嗎????

看一下摩托羅拉的資料手冊

三,ESP8266 SPI(基于Lua腳本語言)

難道最後一位會自動的接收?????搞不懂咧咧.....改天自己測試一下,,,讓主機工作在

然後讓主機發一個位元組的資料看看CLK怎樣變化的..............然後再嘗試手寫從機接收....然後知道結果了再來修改這個地方....

其餘的兩種就不說了

其實說白了就是

CPOL控制在空閑狀态下CLK是高電平還是低電平

CPHA控制資料是在第一個沿就開始傳輸還是在第二個沿

其實呢!!寫程式最終還是要看晶片的資料,,,,,

現在看一下ESP8266的SPI

三,ESP8266 SPI(基于Lua腳本語言)
三,ESP8266 SPI(基于Lua腳本語言)

用SPI1,主機模式,,空閑狀态下Clk為高電平,,第二個沿開始資料傳輸,8位資料,8分頻(10Mhz),預設半雙工

發送資料呢就簡單了

比如向從機發送0xaa,0x55,0x02,0x01

三,ESP8266 SPI(基于Lua腳本語言)

接收資料呢還另有個函數

假設需要接收4個資料

其實就是讓CLK産生32個脈沖信号,每8個代表一個位元組的資料,,後面的0xaa哈,是在産生脈沖信号的時候MOSI引腳發送的資料,,如果不寫

預設發0xFF

三,ESP8266 SPI(基于Lua腳本語言)

對了接收到的資料都是以字元串的形式儲存在變量裡面,,可能會問我怎麼自己解析資料呢

假如說判斷是不是接收到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&amp;fps=1" target="_blank">http://blog.csdn.net/silno/article/details/72866623?locationNum=10&amp;fps=1</a>

三,ESP8266 SPI(基于Lua腳本語言)

 最後說一下和STM32進行SPI通信的一些注意,,,當然是把stm32配置成從機模式,,然後呢其餘的設定一定要一樣

列如我配置的

要注意

三,ESP8266 SPI(基于Lua腳本語言)

CS引腳在子產品剛啟動的時候一定是低電平............

再說一點,我的32程式用的中斷接收的SPI的資料,然後在中斷裡面準備發送的資料,,大家這樣想

主機的資料發過來一個位元組資料之後才進的中斷,,是以如果想在中斷裡面發送資料,,應該在進中斷之前準備好資料的第一個位元組

假設主機需要讀四個位元組就會進四次中斷

我從機發給主機的資料是0xaa 0x55 0x01 0x02

char table[4] = {0xaa, 0x55, 0x01, 0x02}

在主機發送資料之前

我需要   SPI2-&gt;DR = table;

              Spi2SendBuff = table+1;

這樣的話來第一個中斷的時候我的第一個資料0xaa也發向了主機,然後又準備了第二個資料,,,,,,,四次中斷就會把資料發給了主機,,注意指針溢出亂指了一下

這篇文章呢主要是會用ESP8266的SPI就行哈......

繼續閱讀