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

重點(diǎn)是說(shuō)SPI通信協(xié)議,,,,

不要害怕協(xié)議因?yàn)閰f(xié)議是人規(guī)定的,,剛好我也是人......規(guī)定的協(xié)議既然能成為規(guī)范讓所有人所接受,那么必然有它的優(yōu)勢(shì)和優(yōu)點(diǎn),必然值得學(xué)習(xí),,

害怕協(xié)議的人是因?yàn)楫?dāng)初碰到了不懂的老師,他只會(huì)告訴你這很難............其實(shí)是他不會(huì)........

CS????? :?? Chip Selection??? 片選引腳,多個(gè)設(shè)備時(shí)可以用這個(gè)引腳選擇和哪個(gè)設(shè)備通信

MOSI??:?? Master Out?? Slave In?? 主機(jī)輸出數(shù)據(jù)引腳,,,,從機(jī)接收數(shù)據(jù)引腳

MISO :?? Master In? Slave Out???? 主機(jī)接收數(shù)據(jù)引腳....從機(jī)輸出數(shù)據(jù)引腳

CLK? :??? 時(shí)鐘

還有兩個(gè)參數(shù)----假設(shè)有的單片機(jī)自帶硬件SPI,一定會(huì)提供設(shè)置下面兩個(gè)參數(shù),,,當(dāng)然有的支持SPI通信的芯片也可能涉及這兩個(gè)參數(shù)

CPOL??? :表示時(shí)鐘信號(hào)(CLK引腳)在空閑時(shí)是高電平還是低電平

CPHA??? :表示數(shù)據(jù)在時(shí)鐘信號(hào)(CLK)的第幾個(gè)沿開始數(shù)據(jù)傳輸

現(xiàn)在假如說(shuō)

CPOL???= 0? ;//時(shí)鐘信號(hào)(CLK引腳)在空閑時(shí)是低電平

CPHA?? = 0;//數(shù)據(jù)在時(shí)鐘信號(hào)(CLK)的第1個(gè)沿開始數(shù)據(jù)傳輸

通信的時(shí)候先傳輸高位

假如說(shuō)? 主機(jī)發(fā)給從機(jī)?? 10101010?????? 從機(jī)發(fā)給主機(jī)??? 01010101

再假如 主機(jī)接收數(shù)據(jù)存到? MasterData 里面

從機(jī)接收數(shù)據(jù)存到? SlaveData 里面

第一個(gè)上升沿? 主機(jī)的10101010 最高位是 1 所以主機(jī)會(huì)讓MOSI引腳輸出高電平

從機(jī)的01010101最高位是 0? 所以從機(jī)會(huì)讓MISO引腳為低電平

第一個(gè)下降沿? 主機(jī)接收MISO引腳的數(shù)據(jù),因?yàn)槭堑碗娖剿?MasterData= 0000 0000;

從機(jī)接收MOSI引腳的數(shù)據(jù),因?yàn)槭歉唠娖剿詮臋C(jī)SlaveData = 0000 0001;

第二個(gè)上升沿? 主機(jī)左移一位0101010X 最高位是?0 所以主機(jī)會(huì)讓MOSI引腳輸出低電平

從機(jī)左移一位1010101X 最高位是?1? 所以從機(jī)會(huì)讓MISO引腳為高電平

第二個(gè)下降沿? 主機(jī)接收MISO引腳的數(shù)據(jù),因?yàn)槭歉唠娖剿?MasterData= 0000 0001;

從機(jī)接收MOSI引腳的數(shù)據(jù),因?yàn)槭堑碗娖剿詮臋C(jī)SlaveData = 0000 0010;

就這樣8個(gè)上升和8個(gè)下降沿之后

MasterData? = 01010101

SlaveData??? =? 10101010

現(xiàn)在假如說(shuō)

CPOL???= 0? ;//時(shí)鐘信號(hào)(CLK引腳)在空閑時(shí)是低電平

CPHA?? = 1;//數(shù)據(jù)在時(shí)鐘信號(hào)(CLK)的第2個(gè)沿開始數(shù)據(jù)傳輸

第一個(gè)下降沿? 主機(jī)的10101010 最高位是 1 所以主機(jī)會(huì)讓MOSI引腳輸出高電平

從機(jī)的01010101最高位是 0? 所以從機(jī)會(huì)讓MISO引腳為低電平

第一個(gè)上升沿? (注意是標(biāo)號(hào)為1的那個(gè),,,實(shí)際上是第二個(gè)上升沿)

主機(jī)接收MISO引腳的數(shù)據(jù),因?yàn)槭堑碗娖剿?MasterData= 0000 0000;

從機(jī)接收MOSI引腳的數(shù)據(jù),因?yàn)槭歉唠娖剿詮臋C(jī)SlaveData = 0000 0001;

第二個(gè)下降沿? 主機(jī)左移一位0101010X 最高位是?0 所以主機(jī)會(huì)讓MOSI引腳輸出低電平

從機(jī)左移一位1010101X 最高位是?1? 所以從機(jī)會(huì)讓MISO引腳為高電平

第二個(gè)上升沿? 主機(jī)接收MISO引腳的數(shù)據(jù),因?yàn)槭歉唠娖剿?MasterData= 0000 0001;

從機(jī)接收MOSI引腳的數(shù)據(jù),因?yàn)槭堑碗娖剿詮臋C(jī)SlaveData = 0000 0010;

第八個(gè)下降沿? 主機(jī)把最后一位0放在了?MOSI引腳輸出低電平

從機(jī)把最后一位1放在了?MISO引腳輸出高電平

其實(shí)現(xiàn)在我也有疑惑,,,這樣就完了嗎??????只把數(shù)據(jù)放在引腳上就行了嗎????然后內(nèi)部硬件就自動(dòng)接收了嗎????

看一下摩托羅拉的數(shù)據(jù)手冊(cè)

難道最后一位會(huì)自動(dòng)的接收?????搞不懂咧咧.....改天自己測(cè)試一下,,,讓主機(jī)工作在

CPOL???= 0? ;//時(shí)鐘信號(hào)(CLK引腳)在空閑時(shí)是低電平

CPHA?? = 1;//數(shù)據(jù)在時(shí)鐘信號(hào)(CLK)的第2個(gè)沿開始數(shù)據(jù)傳輸

然后讓主機(jī)發(fā)一個(gè)字節(jié)的數(shù)據(jù)看看CLK怎樣變化的..............然后再嘗試手寫從機(jī)接收....然后知道結(jié)果了再來(lái)修改這個(gè)地方....

其余的兩種就不說(shuō)了

其實(shí)說(shuō)白了就是

CPOL控制在空閑狀態(tài)下CLK是高電平還是低電平

CPHA控制數(shù)據(jù)是在第一個(gè)沿就開始傳輸還是在第二個(gè)沿

其實(shí)呢!!寫程序最終還是要看芯片的資料,,,,,

現(xiàn)在看一下ESP8266的SPI

spi.setup(1, spi.MASTER, spi.CPOL_HIGH, spi.CPHA_HIGH,8,8)

用SPI1,主機(jī)模式,,空閑狀態(tài)下Clk為高電平,,第二個(gè)沿開始數(shù)據(jù)傳輸,8位數(shù)據(jù),8分頻(10Mhz),默認(rèn)半雙工

發(fā)送數(shù)據(jù)呢就簡(jiǎn)單了

比如向從機(jī)發(fā)送0xaa,0x55,0x02,0x01

spi.send(1,0xaa,0x55,0x02,0x01)

接收數(shù)據(jù)呢還另有個(gè)函數(shù)

假設(shè)需要接收4個(gè)數(shù)據(jù)

ReadData = spi.recv(1,4,0xaa)

其實(shí)就是讓CLK產(chǎn)生32個(gè)脈沖信號(hào),每8個(gè)代表一個(gè)字節(jié)的數(shù)據(jù),,后面的0xaa哈,是在產(chǎn)生脈沖信號(hào)的時(shí)候MOSI引腳發(fā)送的數(shù)據(jù),,如果不寫

默認(rèn)發(fā)0xFF

對(duì)了接收到的數(shù)據(jù)都是以字符串的形式保存在變量里面,,可能會(huì)問我怎么自己解析數(shù)據(jù)呢

假如說(shuō)判斷是不是接收到0xaa 和0x55

aa?= spi.recv(1,2,0xaa)

if?? aa:byte(1)==0xaa? and? aa:byte(2)==0x55 ?then

自己的執(zhí)行函數(shù)

end

大家肯定會(huì)說(shuō)你咋知道要這樣寫

因?yàn)橛蠥PI文檔

鏈接:http://pan.baidu.com/s/1i5lBi7N%20密碼:2b5h

鏈接:http://pan.baidu.com/s/1crUXUe%20密碼:bs83

還有一點(diǎn),,我一開始看到過別人這樣做過,,所以呢我就知道可以這樣用....知識(shí)這東西一定要活學(xué)活用

http://blog.csdn.net/silno/article/details/72866623?locationNum=10&fps=1

最后說(shuō)一下和STM32進(jìn)行SPI通信的一些注意,,,當(dāng)然是把stm32配置成從機(jī)模式,,然后呢其余的設(shè)置一定要一樣

列如我配置的

voidSpi2SlaveInit(void)

{

SPI_InitTypeDef? SPI_InitStructure;

GPIO_InitTypeDef? GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,? ENABLE );//SPI2時(shí)鐘使能GPIO_InitStructure.GPIO_Pin= GPIO_Pin_12;//CSGPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;

GPIO_Init(GPIOB,&GPIO_InitStructure);//GPIO_ResetBits(GPIOB,GPIO_Pin_12);//PB13/14/15上拉GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPD;? ? ? ? ? ? GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15 ;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPD;? ? GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14 ;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF_PP;? ? GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_ResetBits(GPIOB,GPIO_Pin_14);//PB13/14/15上拉GPIO_ResetBits(GPIOB,GPIO_Pin_15);//PB13/14/15上拉SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;

SPI_InitStructure.SPI_Mode=SPI_Mode_Slave;

SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;

SPI_InitStructure.SPI_CPOL=SPI_CPOL_High;

SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;//SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;//如果這里使用硬件模式,從機(jī)低電平SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_256;

SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;

SPI_InitStructure.SPI_CRCPolynomial=7;

SPI_Init(SPI2,&SPI_InitStructure);

SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE);

SPI_Cmd(SPI2 , ENABLE);

}

要注意

CS引腳在模塊剛啟動(dòng)的時(shí)候一定是低電平............

再說(shuō)一點(diǎn),我的32程序用的中斷接收的SPI的數(shù)據(jù),然后在中斷里面準(zhǔn)備發(fā)送的數(shù)據(jù),,大家這樣想

主機(jī)的數(shù)據(jù)發(fā)過來(lái)一個(gè)字節(jié)數(shù)據(jù)之后才進(jìn)的中斷,,所以如果想在中斷里面發(fā)送數(shù)據(jù),,應(yīng)該在進(jìn)中斷之前準(zhǔn)備好數(shù)據(jù)的第一個(gè)字節(jié)

假設(shè)主機(jī)需要讀四個(gè)字節(jié)就會(huì)進(jìn)四次中斷

我從機(jī)發(fā)給主機(jī)的數(shù)據(jù)是0xaa 0x55 0x01 0x02

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

在主機(jī)發(fā)送數(shù)據(jù)之前

我需要?? SPI2->DR = table;

Spi2SendBuff= table+1;

voidSPI2_IRQHandler(void)

{if(SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_RXNE) ==SET)

{

SPI2->DR = *Spi2SendBuff;

Spi2ReadBuff[Spi2ReadCnt]= SPI2->DR;

Spi2ReadCnt++;

Spi2SendBuff++;

}

}

這樣的話來(lái)第一個(gè)中斷的時(shí)候我的第一個(gè)數(shù)據(jù)0xaa也發(fā)向了主機(jī),然后又準(zhǔn)備了第二個(gè)數(shù)據(jù),,,,,,,四次中斷就會(huì)把數(shù)據(jù)發(fā)給了主機(jī),,注意指針溢出亂指了一下

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蒸眠,一起剝皮案震驚了整個(gè)濱河市择懂,隨后出現(xiàn)的幾起案子庞呕,更是在濱河造成了極大的恐慌奏赘,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件璃哟,死亡現(xiàn)場(chǎng)離奇詭異采够,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)医男,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門砸狞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人镀梭,你說(shuō)我怎么就攤上這事刀森。” “怎么了丰辣?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵撒强,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我笙什,道長(zhǎng)飘哨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任琐凭,我火速辦了婚禮芽隆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘统屈。我一直安慰自己胚吁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布愁憔。 她就那樣靜靜地躺著腕扶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吨掌。 梳的紋絲不亂的頭發(fā)上半抱,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音膜宋,去河邊找鬼窿侈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛秋茫,可吹牛的內(nèi)容都是我干的史简。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼肛著,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼圆兵!你這毒婦竟也來(lái)了跺讯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤衙傀,失蹤者是張志新(化名)和其女友劉穎抬吟,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體统抬,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡火本,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了聪建。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钙畔。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖金麸,靈堂內(nèi)的尸體忽然破棺而出擎析,到底是詐尸還是另有隱情,我是刑警寧澤挥下,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布揍魂,位于F島的核電站,受9級(jí)特大地震影響棚瘟,放射性物質(zhì)發(fā)生泄漏现斋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一偎蘸、第九天 我趴在偏房一處隱蔽的房頂上張望庄蹋。 院中可真熱鬧,春花似錦迷雪、人聲如沸限书。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)倦西。三九已至,卻和暖如春赁严,著一層夾襖步出監(jiān)牢的瞬間扰柠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工误澳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秦躯。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓忆谓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親踱承。 傳聞我的和親對(duì)象是個(gè)殘疾皇子倡缠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容