完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在使用esp8266的HSPI做通信实验时,遇到一些问题:
SPI主可以正常发送数据,SPI从可以正常接收数据。但SPI主读回来的数据,并不是SPI从发送出来的数据,甚至有时候主端读回的数据一直为0xff。 实验环境为: 开发板为两块ESP-LAUNCHER SDK使用 FREERTOS_2.0.0 参考代码为:https://github.com/espressif/esp8266-rtos-sample-code/blob/master/02Peripheral/HSPI_Slave/user/user_main.c SPI slave 运行的代码为: Code: Select all LOCAL void spi_slave_task(void *prg) { // SpiAttr hSpiAttr; hSpiAttr.bitOrder = SpiBitOrder_MSBFirst; hSpiAttr.speed = 0; hSpiAttr.mode = SpiMode_Slave; hSpiAttr.subMode = SpiSubMode_0; // Init HSPI GPIO WRITE_PERI_REG(PERIPHS_IO_MUX, 0x105); PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, 2);//configure io to spi mode PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, 2);//configure io to spi mode PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, 2);//configure io to spi mode PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, 2);//configure io to spi mode printf("rn ============= spi init slave =============rn"); SPIInit(SpiNum_HSPI, &hSpiAttr); //CLEAR_PERI_REG_MASK(SPI_SLAVE(SpiNum_HSPI), 0x3FF); SPISlaveRecvData(SpiNum_HSPI,spi_slave_isr_sta); uint32 sndData[8] = { 0 }; sndData[0] = 0x35343332; sndData[1] = 0x39383736; sndData[2] = 0x3d3c3b3a; sndData[3] = 0x11103f3e; sndData[4] = 0x15141312; sndData[5] = 0x19181716; sndData[6] = 0x1d1c1b1a; sndData[7] = 0x21201f1e; SPISlaveSendData(SpiNum_HSPI, sndData, 8); WRITE_PERI_REG(SPI_RD_STATUS(SpiNum_HSPI), 0x8A); WRITE_PERI_REG(SPI_WR_STATUS(SpiNum_HSPI), 0x83); while(1) { vTaskDelay(1000/porttiCK_RATE_MS); //printf("rn spi slave still alive!!!"); } } SPI master 运行的代码为: Code: Select all void spi_master_test() { SpiAttr hSpiAttr; hSpiAttr.bitOrder = SpiBitOrder_MSBFirst; hSpiAttr.speed = SpiSpeed_2MHz; hSpiAttr.mode = SpiMode_Master; hSpiAttr.subMode = SpiSubMode_0; // Init HSPI GPIO WRITE_PERI_REG(PERIPHS_IO_MUX, 0x105); PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, 2);//configure io to spi mode PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, 2);//configure io to spi mode PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, 2);//configure io to spi mode PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, 2);//configure io to spi mode SPIInit(SpiNum_HSPI, &hSpiAttr); uint32 value = 0x00; uint32 sendData[8] ={ 0 }; SpiData spiData; printf("rn ============= spi init master ============= rn"); // Test 8266 slave.Communication format: 1byte command + 1bytes address + x bytes Data. while(1) { printf("rn Master send 32 bytes data to slave(8266)rn"); memset(sendData, 0, sizeof(sendData)); sendData[0] = 0x55565758; sendData[1] = 0x595a5b5c; sendData[2] = 0x5d5e5f60; sendData[3] = 0x61626364; sendData[4] = 0x65666768; sendData[5] = 0x696a6b6c; sendData[6] = 0x6d6e6f70; sendData[7] = 0x71727374; spiData.cmd = MASTER_WRITE_DATA_TO_SLAVE_CMD; spiData.cmdLen = 1; spiData.addr = &value; spiData.addrLen = 1; spiData.data = sendData; spiData.dataLen = 32; SPIMasterSendData(SpiNum_HSPI, &spiData); printf("rn Master receive 24 bytes data from slave(8266)rn"); spiData.cmd = MASTER_READ_DATA_FROM_SLAVE_CMD; spiData.cmdLen = 1; spiData.addr = &value; spiData.addrLen = 1; spiData.data = sendData; spiData.dataLen = 24; memset(sendData, 0, sizeof(sendData)); SPIMasterRecvData(SpiNum_HSPI, &spiData); printf(" Recv Slave data0[0x%08x]rn", sendData[0]); printf(" Recv Slave data1[0x%08x]rn", sendData[1]); printf(" Recv Slave data2[0x%08x]rn", sendData[2]); printf(" Recv Slave data3[0x%08x]rn", sendData[3]); printf(" Recv Slave data4[0x%08x]rn", sendData[4]); printf(" Recv Slave data5[0x%08x]rn", sendData[5]); /* value = SPIMasterRecvStatus(SpiNum_HSPI); printf("rn Master read slave(8266) status[0x%02x]rn", value); SPIMasterSendStatus(SpiNum_HSPI, 0x99); printf("rn Master write status[0x99] to slavue(8266).rn"); */ vTaskDelay(1000/portTICK_RATE_MS); } } 如果一切正常,spi master 收到的数据应该为: Code: Select all sndData[0] = 0x35343332; sndData[1] = 0x39383736; sndData[2] = 0x3d3c3b3a; sndData[3] = 0x11103f3e; sndData[4] = 0x15141312; sndData[5] = 0x19181716; sndData[6] = 0x1d1c1b1a; sndData[7] = 0x21201f1e; 但实际收到的为: Code: Select all Master receive 24 bytes data from slave(8266) Recv Slave data0[0x6a686664] Recv Slave data1[0x72706e6c] Recv Slave data2[0x7a787674] Recv Slave data3[0xff3f7e7c] Recv Slave data4[0xffffffff] Recv Slave data5[0xffffffff] 请知道的大神指点一下思路,谢谢。 |
|
相关推荐
1个回答
|
|
在使用ESP8266作为SPI从机时,如果遇到可以正常接收数据但无法发送数据的问题,可能有以下几个原因:
1. **SPI配置问题**:确保SPI从机的配置正确,包括SPI模式、时钟极性、时钟相位等。检查代码中的SPI配置是否与主设备兼容。 2. **GPIO引脚配置**:确保SPI从机的MISO、MOSI、SCK和CS引脚正确连接并配置。检查代码中的GPIO设置是否正确。 3. **数据发送逻辑**:检查代码中的数据发送逻辑,确保在接收到数据后,正确地将数据发送回SPI主设备。可能存在逻辑错误或数据未正确写入SPI缓冲区。 4. **SPI缓冲区溢出**:如果SPI缓冲区溢出,可能会导致发送的数据不正确。检查代码中的缓冲区大小和数据发送逻辑,确保缓冲区足够大且数据发送不会溢出。 5. **SPI时钟频率**:SPI时钟频率过高或过低可能导致数据传输错误。检查代码中的SPI时钟频率设置,确保与主设备兼容。 6. **硬件问题**:检查硬件连接是否正确,包括电源、地线和信号线。确保没有短路或接触不良的问题。 7. **软件问题**:检查代码中是否有其他逻辑错误或资源冲突,这可能影响到SPI从机的正常工作。 针对您提供的代码链接,我无法直接查看代码,但建议您按照上述建议进行检查。如果问题仍然存在,您可以尝试以下操作: 1. 使用简单的测试代码,如将SPI从机设置为只发送固定的数据,以排除其他逻辑错误的影响。 2. 使用逻辑分析仪或示波器检查SPI信号,确保数据传输过程中没有异常。 3. 尝试使用其他SPI主设备进行通信,以排除主设备问题。 希望这些建议能帮助您解决问题。如果需要更具体的帮助,请提供更多关于您的代码和硬件设置的信息。 |
|
|
|
只有小组成员才能发言,加入小组>>
598 浏览 1 评论
552浏览 6评论
461浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
443浏览 5评论
445浏览 4评论
415浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 01:58 , Processed in 0.843242 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号