乐鑫技术交流
直播中

王飞

7年用户 1113经验值
私信 关注
[问答]

ESP32S3 SPI主机模式下发送第一帧数据总出错的原因?

我使用ESP32S3的SPI master模式控制一个SPI器件,配置为mode=3,但是初始化完成后,时钟线一直保持在低电平。
我查了是在spi_bus_initialize函数调用spicommon_bus_initialize_io里面再调用esp_rom_gpio_connect_out_signal(bus_config->sclk_io_num, spi_periph_signal[host].spiclk_out, false, false);之后时钟线即被拉低。无论SPI模式mode=0~3任何情况。
尝试了各种配置,没找打解决办法,不知道大家有遇到过吗?
信号我用saleae logic2采集了波形,测试了多次,每次都是上电后第一帧数据出错。
数据和代码见附件。
MCU:ESP32S3
IDE:ESP-IDF V5.1

  • void CSLOW(void)
  • {
  •     gpio_set_level(48, 0);
  • }
  • void CSHIGH(void)
  • {
  •     gpio_set_level(48, 1);
  • }

  • void app_main(void)
  • {
  •     spi_device_handle_t spi;
  •     char buf[ = {1, 2, 3, 4, 5, 6, 7, 8};
  •     gpio_config_t ioconfig = {
  •         .mode = GPIO_MODE_OUTPUT,
  •         .intr_type = GPIO_INTR_DISABLE,
  •         .pull_up_en = GPIO_PULLUP_ENABLE,
  •         .pin_bit_mask = (1ULL << 48),
  •     };
  •     gpio_config(&ioconfig);
  •     spi_bus_config_t busconfig = {
  •         .mosi_io_num = 19,
  •         .miso_io_num = 20,
  •         .sclk_io_num = 21,
  •         .quadhd_io_num = -1,
  •         .quadwp_io_num = -1,
  •     };
  •     spi_bus_initialize(SPI2_HOST, &busconfig, SPI_DMA_CH_AUTO);
  •     spi_device_interface_config_t devconfig = {
  •         .spics_io_num = -1,
  •         .clock_speed_hz = 1000000,
  •         .mode = 3,
  •         .queue_size = 3,
  •         // .post_cb = CSHIGH,
  •         // .pre_cb = CSLOW,
  •     };
  •     spi_bus_add_device(SPI2_HOST, &devconfig, &spi);
  •     spi_transaction_t t = {
  •         .length = 8 * 8,
  •         .tx_buffer = buf,
  •         .rx_buffer = NULL,
  •     };
  •     while (1)
  •     {
  •         vTaskDelay(pdMS_TO_TICKS(3000));
  •         CSLOW();
  •         spi_device_transmit(spi, &t);
  •         CSHIGH();
  •     }
  •     vTaskDelete(NULL);
  • }


回帖(1)

刘燕

2024-6-6 18:15:09
根据您提供的信息,我将尝试分析可能导致ESP32S3 SPI主机模式下发送第一帧数据出错的原因,并提供一些建议。

1. 首先,检查SPI初始化配置是否正确。确保您已经正确配置了SPI接口的参数,如时钟极性(CPOL)、时钟相位(CPHA)、数据位宽等。这些参数对于SPI通信至关重要。

2. 检查GPIO配置。确保您已经正确配置了SPI的SCLK、MISO、MOSI引脚,以及任何其他相关的GPIO设置。

3. 检查SPI器件的初始化过程。确保SPI器件在上电后已经正确初始化,并且已经准备好接收数据。

4. 检查SPI时序。根据您的描述,时钟线在初始化后一直保持在低电平。这可能是由于SPI时序问题导致的。尝试调整SPI时钟速率,看看是否能解决问题。

5. 检查SPI中断和DMA配置。如果您使用了SPI中断或DMA传输,确保它们的配置正确,并且没有导致数据传输错误。

6. 检查SPI器件的数据手册。确保您了解SPI器件的工作原理和时序要求,以便正确配置SPI接口。

7. 检查代码逻辑。仔细检查您的代码,确保在发送第一帧数据之前,所有必要的初始化步骤都已经完成。

8. 使用调试工具。使用调试工具(如Saleae Logic 2)来捕获SPI通信的波形,以便更好地了解问题所在。

9. 尝试不同的SPI模式。虽然您已经尝试了所有SPI模式(0~3),但仍然建议再次检查这些模式的配置,以确保没有遗漏任何细节。


举报

更多回帖

×
20
完善资料,
赚取积分