ESP8266 HSPI


用到ESP8266的HSPI 做从设备

先看看双线的协议(其实这里所谓的双线,只是自己给他加上去而已) 

命令格式 

命令+地址+32字节数据

命令:02 从机接收数据 03 主机读取从机的数据

地址默认一直 0 

所以就是:

写数据:02+00 +32字节数据

读数据:03+00+32字节数据(写0吧)

 

 

 

 

网上直接拉 NONOSDK2.2.0

ESP8266_NONOS_SDK-2.2.0\examples\peripheral_test

将 peripheral_test 放到 ESP8266_NONOS_SDK-2.2.0根目录,直接编译

  1 /*
  2  * ESPRESSIF MIT License
  3  *
  4  * Copyright (c) 2015 <ESPRESSIF SYSTEMS (SHANGHAI) PTE LTD>
  5  *
  6  * Permission is hereby granted for use on ESPRESSIF SYSTEMS ESP8266 only, in which case,
  7  * it is free of charge, to any person obtaining a copy of this software and associated
  8  * documentation files (the "Software"), to deal in the Software without restriction, including
  9  * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
 10  * and/or sell copies of the Software, and to permit persons to whom the Software is furnished
 11  * to do so, subject to the following conditions:
 12  *
 13  * The above copyright notice and this permission notice shall be included in all copies or
 14  * substantial portions of the Software.
 15  *
 16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 18  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 19  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 20  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 22  *
 23  */
 24 
 25 #include "driver/spi_interface.h"
 26 #include "eagle_soc.h"
 27 #include "osapi.h"
 28 
 29 
 30 // Show the spi registers.
 31 #define SHOWSPIREG(i) __ShowRegValue(__func__, __LINE__);
 32 
 33 /**
 34  * @brief Print debug information.
 35  *
 36  */
 37 void __ShowRegValue(const char * func, uint32_t line)
 38 {
 39 
 40     int i;
 41     uint32_t regAddr = 0x60000140; // SPI--0x60000240, HSPI--0x60000140;
 42     os_printf("\r\n FUNC[%s],line[%d]\r\n", func, line);
 43     os_printf(" SPI_ADDR      [0x%08x]\r\n", READ_PERI_REG(SPI_ADDR(SpiNum_HSPI)));
 44     os_printf(" SPI_CMD       [0x%08x]\r\n", READ_PERI_REG(SPI_CMD(SpiNum_HSPI)));
 45     os_printf(" SPI_CTRL      [0x%08x]\r\n", READ_PERI_REG(SPI_CTRL(SpiNum_HSPI)));
 46     os_printf(" SPI_CTRL2     [0x%08x]\r\n", READ_PERI_REG(SPI_CTRL2(SpiNum_HSPI)));
 47     os_printf(" SPI_CLOCK     [0x%08x]\r\n", READ_PERI_REG(SPI_CLOCK(SpiNum_HSPI)));
 48     os_printf(" SPI_RD_STATUS [0x%08x]\r\n", READ_PERI_REG(SPI_RD_STATUS(SpiNum_HSPI)));
 49     os_printf(" SPI_WR_STATUS [0x%08x]\r\n", READ_PERI_REG(SPI_WR_STATUS(SpiNum_HSPI)));
 50     os_printf(" SPI_USER      [0x%08x]\r\n", READ_PERI_REG(SPI_USER(SpiNum_HSPI)));
 51     os_printf(" SPI_USER1     [0x%08x]\r\n", READ_PERI_REG(SPI_USER1(SpiNum_HSPI)));
 52     os_printf(" SPI_USER2     [0x%08x]\r\n", READ_PERI_REG(SPI_USER2(SpiNum_HSPI)));
 53     os_printf(" SPI_PIN       [0x%08x]\r\n", READ_PERI_REG(SPI_PIN(SpiNum_HSPI)));
 54     os_printf(" SPI_SLAVE     [0x%08x]\r\n", READ_PERI_REG(SPI_SLAVE(SpiNum_HSPI)));
 55     os_printf(" SPI_SLAVE1    [0x%08x]\r\n", READ_PERI_REG(SPI_SLAVE1(SpiNum_HSPI)));
 56     os_printf(" SPI_SLAVE2    [0x%08x]\r\n", READ_PERI_REG(SPI_SLAVE2(SpiNum_HSPI)));
 57 
 58     for (i = 0; i < 16; ++i) {
 59         os_printf(" ADDR[0x%08x],Value[0x%08x]\r\n", regAddr, READ_PERI_REG(regAddr));
 60         regAddr += 4;
 61     }
 62 
 63 }
 64 
 65 
 66 // SPI interrupt callback function.
 67 void spi_slave_isr_sta(void *para)
 68 {
 69     uint32 regvalue;
 70     uint32 statusW, statusR, counter;
 71     if (READ_PERI_REG(0x3ff00020)&BIT4) {
 72         //following 3 lines is to clear isr signal
 73         CLEAR_PERI_REG_MASK(SPI_SLAVE(SpiNum_SPI), 0x3ff);
 74     } else if (READ_PERI_REG(0x3ff00020)&BIT7) { //bit7 is for hspi isr,
 75         regvalue = READ_PERI_REG(SPI_SLAVE(SpiNum_HSPI));
 76         os_printf("spi_slave_isr_sta SPI_SLAVE[0x%08x]\n\r", regvalue);
 77         SPIIntClear(SpiNum_HSPI);
 78         SET_PERI_REG_MASK(SPI_SLAVE(SpiNum_HSPI), SPI_SYNC_RESET);
 79         SPIIntClear(SpiNum_HSPI);
 80         
 81         SPIIntEnable(SpiNum_HSPI, SpiIntSrc_WrStaDone
 82                  | SpiIntSrc_RdStaDone 
 83                  | SpiIntSrc_WrBufDone 
 84                  | SpiIntSrc_RdBufDone);
 85 
 86         if (regvalue & SPI_SLV_WR_BUF_DONE) {
 87             // User can get data from the W0~W7
 88             os_printf("spi_slave_isr_sta : SPI_SLV_WR_BUF_DONE\n\r");
 89         } else if (regvalue & SPI_SLV_RD_BUF_DONE) {
 90             // TO DO 
 91             os_printf("spi_slave_isr_sta : SPI_SLV_RD_BUF_DONE\n\r");            
 92         }
 93         if (regvalue & SPI_SLV_RD_STA_DONE) {
 94             statusR = READ_PERI_REG(SPI_RD_STATUS(SpiNum_HSPI));
 95             statusW = READ_PERI_REG(SPI_WR_STATUS(SpiNum_HSPI));
 96             os_printf("spi_slave_isr_sta : SPI_SLV_RD_STA_DONE[R=0x%08x,W=0x%08x]\n\r", statusR, statusW);
 97         }
 98 
 99         if (regvalue & SPI_SLV_WR_STA_DONE) {
100             statusR = READ_PERI_REG(SPI_RD_STATUS(SpiNum_HSPI));
101             statusW = READ_PERI_REG(SPI_WR_STATUS(SpiNum_HSPI));
102             os_printf("spi_slave_isr_sta : SPI_SLV_WR_STA_DONE[R=0x%08x,W=0x%08x]\n\r", statusR, statusW);
103         }
104         if ((regvalue & SPI_TRANS_DONE) && ((regvalue & 0xf) == 0)) {
105             os_printf("spi_slave_isr_sta : SPI_TRANS_DONE\n\r");
106 
107         }
108         SHOWSPIREG(SpiNum_HSPI);
109     }
110 }
111 
112 // Test spi master interfaces.
113 void ICACHE_FLASH_ATTR spi_master_test()
114 {
115     SpiAttr hSpiAttr;
116     hSpiAttr.bitOrder = SpiBitOrder_MSBFirst;
117     hSpiAttr.speed = SpiSpeed_10MHz;
118     hSpiAttr.mode = SpiMode_Master;
119     hSpiAttr.subMode = SpiSubMode_0;
120 
121     // Init HSPI GPIO
122     WRITE_PERI_REG(PERIPHS_IO_MUX, 0x105);
123     PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, 2);//configure io to spi mode
124     PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, 2);//configure io to spi mode
125     PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, 2);//configure io to spi mode
126     PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, 2);//configure io to spi mode
127 
128     SPIInit(SpiNum_HSPI, &hSpiAttr);
129     uint32_t value = 0xD3D4D5D6;
130     uint32_t sendData[8] ={ 0 };
131     SpiData spiData;
132 
133     os_printf("\r\n =============   spi init master   ============= \r\n");
134 
135 //  Test 8266 slave.Communication format: 1byte command + 1bytes address + x bytes Data.
136     os_printf("\r\n Master send 32 bytes data to slave(8266)\r\n");
137     os_memset(sendData, 0, sizeof(sendData));
138     sendData[0] = 0x55565758;
139     sendData[1] = 0x595a5b5c;
140     sendData[2] = 0x5d5e5f60;
141     sendData[3] = 0x61626364;
142     sendData[4] = 0x65666768;
143     sendData[5] = 0x696a6b6c;
144     sendData[6] = 0x6d6e6f70;
145     sendData[7] = 0x71727374;
146     spiData.cmd = MASTER_WRITE_DATA_TO_SLAVE_CMD;
147     spiData.cmdLen = 1;
148     spiData.addr = &value;
149     spiData.addrLen = 4;
150     spiData.data = sendData;
151     spiData.dataLen = 32;
152     SPIMasterSendData(SpiNum_HSPI, &spiData);
153   
154 
155     os_printf("\r\n Master receive 24 bytes data from slave(8266)\r\n");
156     spiData.cmd = MASTER_READ_DATA_FROM_SLAVE_CMD;
157     spiData.cmdLen = 1;
158     spiData.addr = &value;
159     spiData.addrLen = 4;
160     spiData.data = sendData;
161     spiData.dataLen = 24;
162     os_memset(sendData, 0, sizeof(sendData));
163     SPIMasterRecvData(SpiNum_HSPI, &spiData);
164     os_printf(" Recv Slave data0[0x%08x]\r\n", sendData[0]);
165     os_printf(" Recv Slave data1[0x%08x]\r\n", sendData[1]);
166     os_printf(" Recv Slave data2[0x%08x]\r\n", sendData[2]);
167     os_printf(" Recv Slave data3[0x%08x]\r\n", sendData[3]);
168     os_printf(" Recv Slave data4[0x%08x]\r\n", sendData[4]);
169     os_printf(" Recv Slave data5[0x%08x]\r\n", sendData[5]);
170 
171     value = SPIMasterRecvStatus(SpiNum_HSPI);
172     os_printf("\r\n Master read slave(8266) status[0x%02x]\r\n", value);
173 
174     SPIMasterSendStatus(SpiNum_HSPI, 0x99);
175     os_printf("\r\n Master write status[0x99] to slavue(8266).\r\n");
176     SHOWSPIREG(SpiNum_HSPI);
177 
178 
179 //  Test others slave.Communication format:0bytes command + 0 bytes address + x bytes Data
180 #if 0
181     os_printf("\r\n Master send 4 bytes data to slave\r\n");
182     os_memset(sendData, 0, sizeof(sendData));
183     sendData[0] = 0x2D3E4F50;
184     spiData.cmd = MASTER_WRITE_DATA_TO_SLAVE_CMD;
185     spiData.cmdLen = 0;
186     spiData.addr = &addr;
187     spiData.addrLen = 0;
188     spiData.data = sendData;
189     spiData.dataLen = 4;
190     SPIMasterSendData(SpiNum_HSPI, &spiData);
191 
192     os_printf("\r\n Master receive 4 bytes data from slaver\n");
193     spiData.cmd = MASTER_READ_DATA_FROM_SLAVE_CMD;
194     spiData.cmdLen = 0;
195     spiData.addr = &addr;
196     spiData.addrLen = 0;
197     spiData.data = sendData;
198     spiData.dataLen = 4;
199     os_memset(sendData, 0, sizeof(sendData));
200     SPIMasterRecvData(SpiNum_HSPI, &spiData);
201     os_printf(" Recv Slave data[0x%08x]\r\n", sendData[0]);
202 #endif
203 
204 }
205 
206 // Test spi slave interfaces.
207 void ICACHE_FLASH_ATTR spi_slave_test()
208 {
209     //
210     SpiAttr hSpiAttr;
211     hSpiAttr.bitOrder = SpiBitOrder_MSBFirst;
212     hSpiAttr.speed = 0;
213     hSpiAttr.mode = SpiMode_Slave;
214     hSpiAttr.subMode = SpiSubMode_0;
215 
216     // Init HSPI GPIO
217     WRITE_PERI_REG(PERIPHS_IO_MUX, 0x105);
218     PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, 2);//configure io to spi mode
219     PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, 2);//configure io to spi mode
220     PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, 2);//configure io to spi mode
221     PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, 2);//configure io to spi mode
222 
223     os_printf("\r\n ============= spi init slave =============\r\n");
224     SPIInit(SpiNum_HSPI, &hSpiAttr);
225     
226     // Set spi interrupt information.
227     SpiIntInfo spiInt;
228     spiInt.src = (SpiIntSrc_TransDone 
229         | SpiIntSrc_WrStaDone 
230         |SpiIntSrc_RdStaDone 
231         |SpiIntSrc_WrBufDone 
232         |SpiIntSrc_RdBufDone);
233     spiInt.isrFunc = spi_slave_isr_sta;
234     SPIIntCfg(SpiNum_HSPI, &spiInt);
235    // SHOWSPIREG(SpiNum_HSPI);
236     
237     SPISlaveRecvData(SpiNum_HSPI);
238     uint32_t sndData[8] = { 0 };
239     sndData[0] = 0x35343332;
240     sndData[1] = 0x39383736;
241     sndData[2] = 0x3d3c3b3a;
242     sndData[3] = 0x11103f3e;
243     sndData[4] = 0x15141312;
244     sndData[5] = 0x19181716;
245     sndData[6] = 0x1d1c1b1a;
246     sndData[7] = 0x21201f1e;
247 
248     SPISlaveSendData(SpiNum_HSPI, sndData, 8);
249     WRITE_PERI_REG(SPI_RD_STATUS(SpiNum_HSPI), 0x8A);
250     WRITE_PERI_REG(SPI_WR_STATUS(SpiNum_HSPI), 0x83);
251 }
252 
253 void spi_interface_test(void)
254 {
255     // Test spi interfaces.
256     os_printf("\r\n =======================================================\r\n");
257     os_printf("\t ESP8266 %s application \n\r", __func__);
258     os_printf("\t\t SDK version:%s    \n\r", system_get_sdk_version());
259     os_printf("\t\t Complie time:%s  \n\r", __TIME__);
260     os_printf("\r\n =======================================================\r\n");
261 
262 #if 0
263     spi_master_test();
264 #else
265     spi_slave_test();
266 #endif
267 
268 }

 

先看读取:

 

之前用 N76E003模拟做了一下驱动。。。发送是成功,读取却失败,后面直接上工具....是正常的了 (这里估计要改一下超时时间......)

工具设置如下:

2M

模式0 IDLE 为LOW 第一个上升沿采集

命令参数 0300(03 是读取命令 00 是地址)

读取字节 32 

所以一共发送34字节

 

 

log如下:

 1 spi_slave_isr_sta SPI_SLAVE[0x477603f1]
 2 spi_slave_isr_sta : SPI_SLV_RD_BUF_DONE
 3 
 4  FUNC[spi_slave_isr_sta],line[108]
 5  SPI_ADDR      [0x00000000]
 6  SPI_CMD       [0x0004a003]
 7  SPI_CTRL      [0x0028a000]
 8  SPI_CTRL2     [0x00800011]
 9  SPI_CLOCK     [0x00000000]
10  SPI_RD_STATUS [0x0000008a]
11  SPI_WR_STATUS [0x00000000]
12  SPI_USER      [0xd1000040]
13  SPI_USER1     [0x1dfeff00]
14  SPI_USER2     [0x70000003]
15  SPI_PIN       [0x0008001e]
16  SPI_SLAVE     [0x407603e0]
17  SPI_SLAVE1    [0x3aff1c70]
18  SPI_SLAVE2    [0x00000000]
19  ADDR[0x60000140],Value[0x31313131]
20  ADDR[0x60000144],Value[0x31313131]
21  ADDR[0x60000148],Value[0x31313131]
22  ADDR[0x6000014c],Value[0x31313131]
23  ADDR[0x60000150],Value[0x31313131]
24  ADDR[0x60000154],Value[0x31313131]
25  ADDR[0x60000158],Value[0x31313131]
26  ADDR[0x6000015c],Value[0x41414031]
27  ADDR[0x60000160],Value[0x35343332]
28  ADDR[0x60000164],Value[0x39383736]
29  ADDR[0x60000168],Value[0x3d3c3b3a]
30  ADDR[0x6000016c],Value[0x11103f3e]
31  ADDR[0x60000170],Value[0x15141312]
32  ADDR[0x60000174],Value[0x19181716]
33  ADDR[0x60000178],Value[0x1d1c1b1a]
34  ADDR[0x6000017c],Value[0x21201f1e]
35 add 1
36 aid 1
37 station: 82:15:53:ed:20:7c join, AID = 1
38 station: 82:15:53:ed:20:7c leave, AID = 1
39 rm 1

 

 逻辑分析如下

2M,MOSI 先发了03 00 然后32字节的0(直接低电平)

 

 

 

 

 

 

 

 

 

 数据完全OK

 

 

 

 

 

再看发送的:

2M,MOSI 先发了02 00 然后32字节的数据

log:

 1 spi_slave_isr_sta SPI_SLAVE[0x41f403f2]
 2 spi_slave_isr_sta : SPI_SLV_WR_BUF_DONE
 3 
 4  FUNC[spi_slave_isr_sta],line[108]
 5  SPI_ADDR      [0x00000000]
 6  SPI_CMD       [0x00049002]
 7  SPI_CTRL      [0x0028a000]
 8  SPI_CTRL2     [0x00800011]
 9  SPI_CLOCK     [0x00000000]
10  SPI_RD_STATUS [0x0000008a]
11  SPI_WR_STATUS [0x00000000]
12  SPI_USER      [0xc9000040]
13  SPI_USER1     [0x1dfeff00]
14  SPI_USER2     [0x70000002]
15  SPI_PIN       [0x0008001e]
16  SPI_SLAVE     [0x407403e0]
17  SPI_SLAVE1    [0x3aff1c70]
18  SPI_SLAVE2    [0x00000000]
19  ADDR[0x60000140],Value[0x31313131]
20  ADDR[0x60000144],Value[0x31313131]
21  ADDR[0x60000148],Value[0x31313131]
22  ADDR[0x6000014c],Value[0x31313131]
23  ADDR[0x60000150],Value[0x31313131]
24  ADDR[0x60000154],Value[0x31313131]
25  ADDR[0x60000158],Value[0x31313131]
26  ADDR[0x6000015c],Value[0x41414031]
27  ADDR[0x60000160],Value[0x35343332]
28  ADDR[0x60000164],Value[0x39383736]
29  ADDR[0x60000168],Value[0x3d3c3b3a]
30  ADDR[0x6000016c],Value[0x11103f3e]
31  ADDR[0x60000170],Value[0x15141312]
32  ADDR[0x60000174],Value[0x19181716]
33  ADDR[0x60000178],Value[0x1d1c1b1a]
34  ADDR[0x6000017c],Value[0x21201f1e]

 

 逻辑分析如下

 

 

 

 数据完全对上 OJBK

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM