完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
用ESP32通过SPI读取设备数据,采用GPIO中断方式触发读取,设备数据准备好后通过GPIO5上升沿触发。GPIO的配置完全按照例程设置,SPI的配置是在eeprom例程的基础上改的。
现象是运行程序可以进入中断读取设备数据,但读取一段时间后,中断不再触发。 中断不触发的原因是设备数据准备好发出上升沿后,如果没有通过SPI读取数据,则设备输出将保持高电平,不会在输出上升沿,直到读取数据后恢复正常。我这样判断的原因是在main_app()函数的循环中加入延时和读取数据的操作后,可以连续产生中断,不会停止。 我的问题是:如何保证每次上升沿中断都被触发并调用中断服务函数?设备正常输出上升沿触发中断的频次是3200次/秒。 IO配置程序如下: #define GPIO_INPUT_IO_1 5 #define GPIO_INPUT_PIN_SEL (1ULL< |
|
相关推荐
1个回答
|
|
要确保每次上升沿中断都被触发并调用中断服务函数,可以按照以下步骤进行操作:
1. 确保GPIO5已经正确配置为输入模式,并启用了上升沿中断。可以使用以下代码配置GPIO5: ```c gpio_config_t io_conf; io_conf.intr_type = GPIO_PIN_INTR_POSEDGE; io_conf.mode = GPIO_MODE_INPUT; io_conf.pin_bit_mask = (1ULL< io_conf.pull_up_en = 1; gpio_config(&io_conf); ``` 2. 注册GPIO5的中断处理函数。可以使用以下代码注册中断处理函数: ```c gpio_install_isr_service(0); gpio_isr_handler_add(GPIO_NUM_5, gpio5_isr_handler, NULL); ``` 3. 编写中断服务函数,用于处理SPI数据读取。在中断服务函数中,添加SPI读取代码。例如: ```c void IRAM_ATTR gpio5_isr_handler(void* arg) { // 调用SPI读取函数 spi_read_data(); } ``` 4. 在`spi_read_data()`函数中,添加SPI读取代码。确保在读取数据后,将设备输出设置为低电平,以便下次上升沿可以触发中断。例如: ```c void spi_read_data() { // SPI读取代码 // ... // 读取完成后,将设备输出设置为低电平 gpio_set_level(GPIO_NUM_5, 0); } ``` 5. 在`main_app()`函数的循环中,避免使用延时和读取数据的操作,以确保中断可以正常触发。如果需要实现定时读取数据,可以使用定时器(如ESP32的RTOS timer)来代替延时。 6. 确保SPI配置正确,并且设备数据准备好后能够正常发送上升沿信号。 通过以上步骤,可以确保每次上升沿中断都被触发并调用中断服务函数,实现连续的数据读取。 |
|
|
|
只有小组成员才能发言,加入小组>>
473浏览 6评论
397浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
376浏览 5评论
383浏览 4评论
353浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-27 10:08 , Processed in 0.825879 second(s), Total 81, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号