乐鑫技术交流
直播中

摩托罗拉

8年用户 929经验值
私信 关注
[问答]

利用STM32 HAL的SPI库与esp8266进行通信遇到的疑问求解

我将官方的ESP8266_RTOS_SDKexamplesperipheralsspihigh_performancespi_slave下的工程进行编译烧录进了ESP8266。

STM32f103c8t6端按照官方给的格式指令将数据传送查看是否正常

  •         uint8_t* data = (uint8_t *)malloc(5);
  •     memset(data, 0x00, 5);
  •     data[0 = 0x01;
  •     int* len2 = (int*)(data + 1);
  •     *len2 = 4;
  •     HAL_StatusTypeDef re = HAL_SPI_Transmit(&hspi1,data,5,0xFFFF);


并在SDK里spi.c的static IRAM_ATTR void spi_intr(void *arg)里进行了调试信息输出

  • static IRAM_ATTR void spi_intr(void *arg)
  • {
  •     spi_host_t host;
  •     uint32_t trans_done;
  •     uint32_t cnt = 0;
  •     if (READ_PERI_REG(DPORT_SPI_INT_STATUS_REG) & DPORT_SPI_INT_STATUS_SPI0) { // DPORT_SPI_INT_STATUS_SPI0
  •         trans_done = SPI0.slave.val & 0x1F;
  •         SPI0.slave.val &= ~0x3FF;
  •         host = CSPI_HOST;
  •     } else if (READ_PERI_REG(DPORT_SPI_INT_STATUS_REG) & DPORT_SPI_INT_STATUS_SPI1) { // DPORT_SPI_INT_STATUS_SPI1
  •         ets_printf("TIP: SPI1.slave.val  0 is %drn",SPI1.slave.val);
  •         trans_done = SPI1.slave.val & 0x1F;
  •         ets_printf("TIP: trans_done is %drn",trans_done);
  •         SPI1.slave.val &= ~0x1F;
  •         ets_printf("TIP: SPI1.slave.val 1 is %drn",SPI1.slave.val);
  •         // Hardware issues: We need to wait for the hardware to clear the registers successfully.
  •         while ((SPI1.slave.val & 0x1F) != 0) {
  •             if (cnt >= 50) {
  •                 ets_printf("WARNING: waiting too much time, maybe errorrn");
  •                 cnt = 0;
  •             }
  •             SPI1.slave.val &= ~0x1F;
  •             cnt++;
  •             //ets_printf("TIP: SPI1.slave.val 2 is %drn",SPI1.slave.val);
  •         }

  •         host = HSPI_HOST;
  •     } else {
  •         return;
  •     }
  •     ets_printf("TIP: if generated by software");
  •     if (spi_object[host) {
  •         // Hardware has no interrupt flag, which can be generated by software.
  •         trans_done &=  spi_object[host->intr_enable.val;
  •         ets_printf("TIP: trans_done is %drn",trans_done);
  •         ets_printf("TIP: spi_object[host]->event_cb && trans_done is %drn",spi_object[host->event_cb && trans_done);
  •         if (spi_object[host->event_cb && trans_done != 0) {
  •             spi_object[host->event_cb(SPI_TRANS_DONE_EVENT, &trans_done);
  •         }
  •     }
  • }

利用串口输出的信息调试,查看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    |

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

回帖(2)

彭小海

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

杜喜喜

2024-6-11 16:48:24
从您的描述来看,您在使用STM32 HAL库与ESP8266进行SPI通信时遇到了一些问题。以下是一些建议和解决方案:

1. 首先,请确保您的硬件连接正确。STM32和ESP8266之间的SPI通信需要连接以下引脚:
   - MOSI(主设备输出,从设备输入):STM32的SPI_MOSI引脚连接到ESP8266的SPI_MOSI引脚
   - MISO(主设备输入,从设备输出):STM32的SPI_MISO引脚连接到ESP8266的SPI_MISO引脚
   - SCK(时钟信号):STM32的SPI_SCK引脚连接到ESP8266的SPI_SCK引脚
   - CS(片选信号):STM32的SPI_CS引脚连接到ESP8266的SPI_CS引脚

2. 检查SPI初始化设置是否正确。在STM32的HAL库中,您需要正确配置SPI的初始化结构体(例如:SPI_InitTypeDef),并使用HAL_SPI_Init()函数进行初始化。确保您的SPI模式、数据大小、时钟极性等设置与ESP8266的SPI设置相匹配。

3. 检查数据传输代码。在您的代码中,有一些语法错误需要修正:
   ```c
   uint8_t* data = (uint8_t *)malloc(5);
   memset(data, 0x00, 5);
   data[0] = 0x01; // 这里应该是赋值操作符'=',而不是'='
   int* len2 = (int*)(data + 1);
   *len2 = 4;
   HAL_StatusTypeDef re = HAL_SPI_Transmit(&hspi1, data, 5, 0xFFFF);
   ```
   请确保您的数据传输代码正确无误。

4. 在ESP8266侧,确保您已经正确配置了SPI接口,并使用正确的SPI通信协议。您可以查阅ESP8266的SPI通信文档,了解如何配置和使用SPI接口。

5. 使用调试工具(如串口助手)来监控SPI通信过程中的数据,以便发现潜在的问题。


举报

更多回帖

×
20
完善资料,
赚取积分