乐鑫技术交流
直播中

王艳

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

从esp32-c3移植到s3后spi读取结果错误是怎么回事?

做了hal层的接口调用spi功能,在esp32-c3上测试结果没有问题,但是到s3上读取的结果就错了
int HA_spi_read(spi_device_handle_t spi, uint8_t *data)
{
    esp_err_t ret;
    spi_transaction_t t;
    uint8_t data1 = 0xFF;

    memset(&t, 0, sizeof(t));
    t.length = sizeof(uint8_t) * 8;
    t.rxlength = sizeof(uint8_t) * 8;
    t.rx_buffer = &data1;
    ret = spi_device_polling_transmit(spi, &t);
    assert( ret == ESP_OK );

    *data = data1;

    return 0;
}

void HA_Spi_Init(HA_SPI_CONFIG_T *spi_config, spi_device_handle_t *spi)
{
    esp_err_t ret;
    spi_bus_config_t buscfg;
    spi_device_interface_config_t devcfg;

    buscfg.miso_io_num = spi_config->spi_miso;
    buscfg.mosi_io_num = spi_config->spi_mosi;
    buscfg.sclk_io_num = spi_config->spi_clk;
    buscfg.quadwp_io_num = -1;
    buscfg.quadhd_io_num = -1;
    buscfg.flags = SPICOMMON_BUSFLAG_MASTER;

    devcfg.command_bits = 0;
    devcfg.address_bits = 0;
    devcfg.dummy_bits = 0;
    devcfg.clock_speed_hz = 1000 * 1000; // Clock out at 10 MHz
    devcfg.input_delay_ns = 0;
    devcfg.duty_cycle_pos = 0;
    devcfg.mode = 0;                          // SPI mode 0
    devcfg.spics_io_num = -1;                 // CS pin
    devcfg.queue_size = 6;                    //queue 7 transactions at a time

    ret = spi_bus_initialize(SPI2_HOST, &buscfg, 0);
    if (ret != ESP_OK){
        ESP_LOGI(SPI_TAG, "bus initialize failed!n");
    }else{
        ESP_LOGI(SPI_TAG, "bus initialize successed!n");
    }
    ret = spi_bus_add_device(SPI2_HOST, &devcfg, spi);
    if (ret != ESP_OK){
        ESP_LOGI(SPI_TAG, "device config errorn");
    }else{
        ESP_LOGI(SPI_TAG, "device config successn");
    }
}
测了波形,发送的数据是对的,从机回的数据看波形是EF16也是对的,但是api返回的结果是F768
想可能是c3和s3的差异,查了sdkconfig,关于spi的设置也都是一样的,代码里配置的参数也都一样。
是spi_device_polling_transmit不适用s3吗,但是也找不到其他关于spi通信api的说明了,换了spi_device_transmit结果也是一样的
                                                                                                

回帖(1)

陈静

2024-6-5 17:41:06
从ESP32-C3移植到S3后,SPI读取结果错误可能是由以下几个原因导致的:

1. **硬件连接问题**:首先检查S3上的SPI硬件连接是否正确,包括数据线、时钟线、片选线等。确保连接没有问题。

2. **SPI配置问题**:在移植过程中,需要确保SPI的配置与ESP32-C3上的配置相同。这包括时钟频率、数据位宽、CPOL、CPHA等参数。请检查S3上的SPI配置是否与ESP32-C3上的配置一致。

3. **中断和DMA配置**:如果ESP32-C3上使用了中断或DMA来处理SPI通信,需要确保S3上也正确配置了中断和DMA。请检查S3上的中断和DMA设置是否正确。

4. **SPI驱动问题**:可能是S3上的SPI驱动存在问题。可以尝试更新或重新编译SPI驱动,以确保驱动与硬件兼容。

5. **代码移植问题**:在移植代码时,可能存在一些细节问题导致SPI读取结果错误。请仔细检查代码,确保所有与SPI相关的函数和变量都已正确移植。

6. **调试和日志**:在S3上运行时,可以使用调试工具和日志输出来检查SPI通信过程中的问题。这有助于定位问题所在。

针对您提供的代码片段,我有一些建议:

- 确保`spi_device_handle_t spi`是正确初始化和配置的SPI设备句柄。
- 在`spi_transaction_t t`结构体中,`rx_buffer`应指向要接收数据的缓冲区,而不是`data1`。请将`t.rx_buffer = &data1;`更改为`t.rx_buffer = data;`。
- 确保`spi_device_polling`函数调用正确,并且传入的参数无误。

最后,建议您在S3上进行详细的调试,以便找到导致SPI读取结果错误的根本原因。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分