乐鑫技术交流
直播中

李娟

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

请问ESP32S3从机模式下如何连续接受多帧数据?

我们公司计划用ESP32S3做AFE主控,目前选用的AFE有2个SPI接口(1主,1从),ESP32作为主机向AFE的SPI从机端口发送命令进行控制,AFE通过其SPI主机向ESP32响应数据。所以,目前用到了ESP32S3的2个SPI外设(SPI2(主),SPI3(从))。
目前测试,ESP32S3的SPI2作为主机可以正常发送控制指令,通过逻辑分析仪观察,AFE也能正确响应。但是,目前没有找到好的办法让ESP32S3的SPI3作为从机完整的接收AFE响应的所有数据。测试了直接在SPI2使用spi_device_transmit()发送之后立即调用SPI3的spi_slave_transmit(),接收到的数据会丢帧。也按照手册"传输事务间隔"测试了分别使用spi_slave_queue_trans(),spi_device_transmit(),spi_slave_get_trans_result().还是不能正确接收所有数据。
不知道大家有没有更好的方式处理这种场景?
谢谢!
附图是逻辑分析仪数据,其中0:SPI是主机,1:SPI是从机。主机发送一帧之后,从机连续响应多帧报文。每帧报文6字节,最多一次可以响应0x71帧。
                                                                                                                                            

回帖(1)

youyoulan

2024-6-6 18:11:43
在ESP32S3上实现从机模式下连续接收多帧数据,可以采用以下步骤:

1. 初始化SPI接口:首先需要初始化SPI2(主机)和SPI3(从机)接口。配置SPI接口的参数,如时钟频率、数据位宽、极性等。

```c
spi_bus_config_t buscfg = {
    .mosi_io_num = SPI_MASTER_MOSI_IO,
    .miso_io_num = SPI_MASTER_MISO_IO,
    .sclk_io_num = SPI_MASTER_SCLK_IO,
    .quadwp_io_num = -1,
    .quadhd_io_num = -1,
};
spi_bus_initialize(HSPI_HOST, &buscfg, SPI_DMA_CH_AUTO);

spi_device_interface_config_t devcfg = {
    .clock_speed_hz = 10 * 1000 * 1000, // 10MHz
    .mode = 0,
    .spics_io_num = SPI_SLAVE_CS_IO,
    .queue_size = 7,
};
spi_device_interface_config_t devcfg2 = {
    .clock_speed_hz = 10 * 1000 * 1000, // 10MHz
    .mode = 0,
    .spics_io_num = -1,
    .queue_size = 7,
};
spi_device_handle_t spi_device = NULL;
spi_device_handle_t spi_device2 = NULL;
spi_bus_add_device(HSPI_HOST, &devcfg, &spi_device);
spi_bus_add_device(SPI3_HOST, &devcfg2, &spi_device2);
```

2. 创建传输队列:为了实现连续接收多帧数据,需要创建一个传输队列。队列中的每个元素包含一个发送缓冲区和一个接收缓冲区。

```c
#define QUEUE_SIZE 10
spi_transaction_t trans[QUEUE_SIZE];
```

3. 发送控制指令:使用SPI2(主机)发送控制指令,并通过逻辑分析仪观察AFE的响应。

```c
spi_transaction_t t;
memset(&t, 0, sizeof(t));
t.length = 8 * sizeof(uint8_t); // 8位数据
t.tx_buffer = &cmd; // 控制指令
spi_device_transmit(spi_device, &t);
```

4. 接收数据:在SPI3(从机)上接收AFE响应的数据。为了实现连续接收,可以在SPI3的从机中断服务例程中处理接收到的数据。

```c
void IRAM_ATTR spi3_isr_handler(void *arg)
{
    spi_slave_transaction_t t;
    memset(&t, 0, sizeof(t));
    t.length = 8 * sizeof(uint8_t); // 8位数据
    spi_slave_receive_data(spi_device2, &t, portMAX_DELAY);
    // 处理接收到的数据
}
```

5. 注册从机中断:在初始化SPI3(从机)时,注册从机中断服务例程。

```c
spi_slave_config_t slavecfg = {
    .mode = 0,
    .spics_io_num = -1,
    .queue_size = QUEUE_SIZE,
    .post_trans_cb = NULL
};
spi_slave_initialize(SPI3_HOST, &slavecfg, spi3_isr_handler);
```

6. 处理接收到的数据:在从机中断服务例程中,处理接收到的数据。可以将数据存储到一个全局数组或结构体中,以便在主程序中访问。

7. 循环发送控制指令:在主程序中,循环发送控制指令,并通过从机接收响应数据。

通过以上步骤,可以实现ESP32S3在从机模式下连续接收多帧数据。注意,这里只是一个基本的实现示例,具体实现可能需要根据实际需求进行调整。
举报

更多回帖

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