完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
大家好,我用ESP32 SPI slave实时采集外部AD值失败,若各位有相关经验,提供任何相关信息和建议都可能会帮到我,先在此表示感谢!
用ESP32作为SPI从机,实时采集外部AD数据,每隔一定时间,数据源转换完成通过DRDY引脚给ESP中断信号,ESP检测到中断后及时通过SPI实时读取AD值,需要在中断产生后马上响应并处理,若不及时读取将丢失数据 遇到的问题现象:AD数据输出时间仅32us左右,中断延迟响应,当处理中断执行中断函数时,AD数据已输出完毕已为时已晚,若无法及时处理数据,调用spi_slave_transmit读取出值全是0xFF 用示波器抓取波形,外部AD的时钟引脚和数据输出引脚波形正常。 示波器查看波形发现中断响应(调用spi_slave_transmit时)滞后DRDY外部中断产生,比如正常应在①后立即读取SPI,实际波形是在②以后才处理中断读取SPI。外部中断根据调用spi_slave_transmit采集AD值,示波器查看波形发现中断响应(调用spi_slave_transmit时)滞后DRDY外部中断,比如正常应在①后立即读取SPI,实际波形是在②以后才处理中断读取SPI。 目前我尝试过 1 直接在GPIO中断函数中调用spi_slave_transmit,结果是触发panic重启 2 创建二值信号量、read_data_task,在中断函数里释放信号量xSemaphoreGiveFromISR(semaphore_handle, &xHigherPriorityTaskWoken),任务中阻塞获取信号直到获取到就调用spi_slave_transmit,结果读出来仍错误 3 创建read_data_task,在读完spi后挂起当前任务,在中断函数xTaskResumeFromISR(xHandle)恢复任务 请问我需要怎么样修改代码来减小这个滞后的时间呢? |
|
相关推荐
1个回答
|
|
根据您的描述,您在使用ESP32作为SPI从机实时采集外部AD值时遇到了一些问题。以下是一些建议和可能的原因:
1. 中断优先级设置:确保您的中断优先级设置正确。在ESP32中,中断优先级范围是1-5,数值越小,优先级越高。您可以尝试将SPI中断的优先级设置为最高,以便在其他任务执行时能够更快地响应中断。 2. 中断服务程序(ISR)优化:检查您的中断服务程序(ISR)是否过于复杂或包含耗时的操作。尽量简化ISR中的代码,将耗时的操作放在主循环或其他任务中处理。 3. SPI配置:检查您的SPI配置是否正确。确保SPI的时钟速率、数据位宽度等参数与您的外部AD设备兼容。 4. 硬件连接:检查您的硬件连接是否正确,包括SPI数据线、时钟线、片选线等。确保连接稳定,避免接触不良或信号干扰。 5. 软件驱动:确保您使用的ESP32 SPI驱动库是最新版本,或者与您的硬件设备兼容。如果可能,尝试使用其他SPI驱动库或示例代码。 6. 调试和日志:在您的代码中添加调试和日志输出,以便更好地了解程序在执行过程中的状态。这可以帮助您找到问题所在。 7. 考虑使用DMA(直接内存访问):如果您的ESP32支持DMA,可以考虑使用DMA来提高数据传输速度。DMA可以在不占用CPU资源的情况下,自动完成数据的传输。 8. 检查外部AD设备:确保您的外部AD设备工作正常,没有损坏或故障。您可以尝试使用其他设备或模块来测试SPI通信。 9. 考虑使用其他通信方式:如果SPI通信仍然无法满足您的需求,您可以考虑使用其他通信方式,如I2C、UART等。 希望这些建议能帮助您解决问题。如果问题仍然存在,请随时提供更多详细信息,以便我们为您提供更具体的帮助。 |
|
|
|
只有小组成员才能发言,加入小组>>
1108 浏览 1 评论
574浏览 6评论
477浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
460浏览 5评论
461浏览 4评论
435浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 01:43 , Processed in 0.653541 second(s), Total 47, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号