完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我们公司计划用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个回答
|
|
在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在从机模式下连续接收多帧数据。注意,这里只是一个基本的实现示例,具体实现可能需要根据实际需求进行调整。 |
|
|
|
只有小组成员才能发言,加入小组>>
406浏览 6评论
338浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
321浏览 5评论
322浏览 4评论
309浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-16 01:38 , Processed in 0.694552 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号