久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

立即注冊 登錄
返回首頁

uid:226961的個人空間

日志

三,ESP8266 SPI

已有 6929 次閱讀2017-9-15 04:12 | esp8266, spi

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

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

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

CS      :   Chip Selection    片選引腳,多個設(shè)備時可以用這個引腳選擇和哪個設(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ù)----假設(shè)有的單片機(jī)自帶硬件SPI,一定會提供設(shè)置下面兩個參數(shù),,,當(dāng)然有的支持SPI通信的芯片也可能涉及這兩個參數(shù)

CPOL    :表示時鐘信號(CLK引腳)在空閑時是高電平還是低電平

CPHA    :表示數(shù)據(jù)在時鐘信號(CLK)的第幾個沿開始數(shù)據(jù)傳輸

現(xiàn)在假如說

CPOL   = 0  ;//時鐘信號(CLK引腳)在空閑時是低電平

CPHA   = 0;//數(shù)據(jù)在時鐘信號(CLK)的第1個沿開始數(shù)據(jù)傳輸

 

通信的時候先傳輸高位

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

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

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

 

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

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

 

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

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

 

 

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

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

 

 

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

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

 

 就這樣8個上升和8個下降沿之后

                        MasterData  = 01010101

                              SlaveData    =  10101010

 

 

 

現(xiàn)在假如說

CPOL   = 0  ;//時鐘信號(CLK引腳)在空閑時是低電平

CPHA   = 1;//數(shù)據(jù)在時鐘信號(CLK)的第2個沿開始數(shù)據(jù)傳輸

 

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

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

 

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

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

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

 

 

 

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

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

 

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

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

 

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

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

 

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

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

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

CPOL   = 0  ;//時鐘信號(CLK引腳)在空閑時是低電平

CPHA   = 1;//數(shù)據(jù)在時鐘信號(CLK)的第2個沿開始數(shù)據(jù)傳輸

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

其余的兩種就不說了

其實(shí)說白了就是

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

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

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

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

 

 

 

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

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

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

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

 

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

接收數(shù)據(jù)呢還另有個函數(shù)
假設(shè)需要接收4個數(shù)據(jù)

 

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

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

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

 

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

假如說判斷是不是接收到0xaa 和0x55

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

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

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

end

大家肯定會說你咋知道要這樣寫

因?yàn)橛蠥PI文檔

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

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

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

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

 

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

列如我配置的

復(fù)制代碼
void Spi2SlaveInit(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時鐘使能 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;//CS GPIO_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); }
復(fù)制代碼

 

要注意

CS引腳在模塊剛啟動的時候一定是低電平............

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

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

假設(shè)主機(jī)需要讀四個字節(jié)就會進(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;

復(fù)制代碼
void SPI2_IRQHandler(void) { if(SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_RXNE) == SET) { SPI2->DR = *Spi2SendBuff; Spi2ReadBuff[Spi2ReadCnt] = SPI2->DR; Spi2ReadCnt ++; Spi2SendBuff ++; } }
復(fù)制代碼

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

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


路過

雞蛋

鮮花

握手

雷人

全部作者的其他最新日志

評論 (0 個評論)

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

返回頂部
主站蜘蛛池模板: 91在线视频 | 欧美成人一区二免费视频软件 | 午夜视频在线播放 | 天天操综合网站 | 中文字幕精品一区二区三区在线 | 成人毛片在线观看 | 免费观看黄 | 亚洲成人一区二区 | 国产乱码精品一区二区三区五月婷 | 国产亚洲成av人片在线观看桃 | 成人精品一区亚洲午夜久久久 | 高清久久久 | 成人精品一区二区三区四区 | 国产精品久久精品 | 亚洲国产成人精品女人 | 欧美日韩高清在线一区 | 成人午夜看片 | 麻豆av在线免费观看 | 欧美成人黄色小说 | 青青草免费在线视频 | 密室大逃脱第六季大神版在线观看 | 日韩精品一区二区三区四区视频 | 亚洲欧洲一区 | 国产精品一卡二卡三卡 | 国产精品一区二 | 成人免费视频网 | 国产精品久久久久婷婷二区次 | 日韩高清一区二区 | 国产情侣在线看 | 久久69精品久久久久久国产越南 | 成人国产精品久久久 | 黄色片视频 | 免费在线性爱视频 | 91视频在线观看 | 精品日韩一区二区 | 最近日韩中文字幕 | 夜夜夜操 | 91精品久久久久久久久 | 欧美一级片在线看 | www.精品国产| 精品婷婷 |