【已解决】利用STM32(主机) HAL的SPI库与esp8266(从机)进行通信遇到了困难

HWX20100301
Posts: 2
Joined: Sat Jul 29, 2023 4:34 pm

【已解决】利用STM32(主机) HAL的SPI库与esp8266(从机)进行通信遇到了困难

Postby HWX20100301 » Sat Jul 29, 2023 4:54 pm

我将官方的ESP8266_RTOS_SDK\examples\peripherals\spi\high_performance\spi_slave下的工程进行编译烧录进了ESP8266。

stm32f103c8t6端按照官方给的格式指令将数据传送查看是否正常
  1.         uint8_t* data = (uint8_t *)malloc(5);
  2.     memset(data, 0x00, 5);
  3.     data[0] = 0x01;
  4.     int* len2 = (int*)(data + 1);
  5.     *len2 = 4;
  6.     HAL_StatusTypeDef re = HAL_SPI_Transmit(&hspi1,data,5,0xFFFF);
并在SDK里spi.c的static IRAM_ATTR void spi_intr(void *arg)里进行了调试信息输出
  1. static IRAM_ATTR void spi_intr(void *arg)
  2. {
  3.     spi_host_t host;
  4.     uint32_t trans_done;
  5.     uint32_t cnt = 0;
  6.     if (READ_PERI_REG(DPORT_SPI_INT_STATUS_REG) & DPORT_SPI_INT_STATUS_SPI0) { // DPORT_SPI_INT_STATUS_SPI0
  7.         trans_done = SPI0.slave.val & 0x1F;
  8.         SPI0.slave.val &= ~0x3FF;
  9.         host = CSPI_HOST;
  10.     } else if (READ_PERI_REG(DPORT_SPI_INT_STATUS_REG) & DPORT_SPI_INT_STATUS_SPI1) { // DPORT_SPI_INT_STATUS_SPI1
  11.         ets_printf("TIP: SPI1.slave.val  0 is %d\r\n",SPI1.slave.val);
  12.         trans_done = SPI1.slave.val & 0x1F;
  13.         ets_printf("TIP: trans_done is %d\r\n",trans_done);
  14.         SPI1.slave.val &= ~0x1F;
  15.         ets_printf("TIP: SPI1.slave.val 1 is %d\r\n",SPI1.slave.val);
  16.         // Hardware issues: We need to wait for the hardware to clear the registers successfully.
  17.         while ((SPI1.slave.val & 0x1F) != 0) {
  18.             if (cnt >= 50) {
  19.                 ets_printf("WARNING: waiting too much time, maybe error\r\n");
  20.                 cnt = 0;
  21.             }
  22.             SPI1.slave.val &= ~0x1F;
  23.             cnt++;
  24.             //ets_printf("TIP: SPI1.slave.val 2 is %d\r\n",SPI1.slave.val);
  25.         }
  26.  
  27.         host = HSPI_HOST;
  28.     } else {
  29.         return;
  30.     }
  31.     ets_printf("TIP: if generated by software");
  32.     if (spi_object[host]) {
  33.         // Hardware has no interrupt flag, which can be generated by software.
  34.         trans_done &=  spi_object[host]->intr_enable.val;
  35.         ets_printf("TIP: trans_done is %d\r\n",trans_done);
  36.         ets_printf("TIP: spi_object[host]->event_cb && trans_done is %d\r\n",spi_object[host]->event_cb && trans_done);
  37.         if (spi_object[host]->event_cb && trans_done != 0) {
  38.             spi_object[host]->event_cb(SPI_TRANS_DONE_EVENT, &trans_done);
  39.         }
  40.     }
  41. }
利用串口输出的信息调试,查看esp8266的输出,如下:

[REC]TIP: SPI1.slave.val 0 is 2003829244

TIP: trans_done is 28

TIP: SPI1.slave.val 1 is 1936720380

WARNING: waiting too much time, maybe error

WARNING: waiting too much time, maybe error
更多WARNING: waiting too much time, maybe error......


接线与官方给的一致
| Signal | (ESP8266)Slave | (STM32)Master |
| --------- | ------ | ------ |
| SCLK | GPIO14 | GPIO14 |
| MISO | GPIO12 | GPIO12 |
| MOSI | GPIO13 | GPIO13 |
| CS | GPIO15 | GPIO15 |
| HANDSHARK | GPIO4 | GPIOA PIN1 |
| GND | GND | GND |

作为初学者,对该问题很困扰,不知道该如何下手,虚心请教一下各位。

ESP_Yake
Posts: 109
Joined: Mon Mar 06, 2017 12:23 pm

Re: 利用STM32(主机) HAL的SPI库与esp8266(从机)进行通信遇到了困难

Postby ESP_Yake » Thu Aug 03, 2023 11:42 am

不建议你在ESP8266上使用SPI了,一方面 ESP8266 SPI 没有DMA,而且协议设计的也复杂,另一方面 SPI支持的 clock 最高也就 10M,吞吐不会比 UART 高很多,而且因为中断触发的慢,后面测试的问题也会比较多。对于 ESP8266,我们只建议使用 UART 进行通信,如果需要使用 SPI,请使用 ESP8266 的替代芯片 ESP32-C2 进行测试。

HWX20100301
Posts: 2
Joined: Sat Jul 29, 2023 4:34 pm

Re: 利用STM32(主机) HAL的SPI库与esp8266(从机)进行通信遇到了困难

Postby HWX20100301 » Thu Aug 03, 2023 12:49 pm

ESP_Yake wrote:
Thu Aug 03, 2023 11:42 am
不建议你在ESP8266上使用SPI了,一方面 ESP8266 SPI 没有DMA,而且协议设计的也复杂,另一方面 SPI支持的 clock 最高也就 10M,吞吐不会比 UART 高很多,而且因为中断触发的慢,后面测试的问题也会比较多。对于 ESP8266,我们只建议使用 UART 进行通信,如果需要使用 SPI,请使用 ESP8266 的替代芯片 ESP32-C2 进行测试。
谢谢你的回复和建议,的确发现ESP8266的SPI不是很好用,我另购入了一块ESP8266烧录了官方示例的Spi Matser,使之与另一块ESP8266从机(官方示例Spi Slave)进行通信,结果是数据一多就不太能正常的进行通讯,从机会报错,重启后开始又能正常传输。并且之后我单独使用spi api spi_trans编写了一个简单的从机程序,发现:开始主机拉低CS后进行收发数据,主机发送03命令进行form从机读数据,从机开始进行了第一次中断static IRAM_ATTR void spi_intr(void *arg),trans_one的值为12,主机接收不到期望的数据,第二次也是收不到期望的数据trans_one的值为1,多进行几次后收发操作后才能接收到自己期望的数据(trans_one的都值为1),对此现象我也不是很清楚。

我会从新购入ESP32-C2或者其他ESP32型号进行测试,我想用SPI,UART的速率不能达到我的要求,我是想STM32作为SPI主机中转,使SPI从机之间进行数据收发,ESP程序将数据传入网络。

Who is online

Users browsing this forum: Google [Bot] and 153 guests