完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在 HAL_I2C_Mem_Read 中观察到 STM32 I2C Hal 驱动程序中存在问题,但其他读取命令中可能存在相同问题。
我观察到有时 I2C 主机无法确认并发送停止条件的问题,之后 SDA 卡在低电平并且 HAL_BUSY 在连续的 I2C 读取时返回。我可以重现此问题,同时强调 I2C 读取(读取加速度传感器的 7 个值)并结合运行 httpd 并每 5 秒在浏览器中刷新一次网页。 我注意到当我遇到只剩下 2 个剩余字节的情况时会出现问题
通常,当读取多个数据时,MCU 会从 hi2c->Instance->DR 中一次读取 1 个字节,最终得到剩余 3 个字节的情况(此时行为是正确的)。但是,如果设置了“I2C_FLAG_BTF”,MCU 将读出一个额外的字节。如果在那之后,只剩下 2 个字节,则 ACK 永远不会被禁用。 作为解决方案,下面的内容对我有用:(检查“//NEW”评论)
“HAL_I2C_Master_Receive”函数中可能存在同样的问题,但我没有验证过。代码看起来都一样。 我什至怀疑这段代码 (HAL_I2C_Mem_Read) 是否 100% 正确,因为我不确定“I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart)”(当只剩下 2 个字节时)是否能有效保证正好接收到最后 2 个字节。在我看来,当接收到最后 3 个字节中的第 2 个字节时,也可能会出现这种情况。但我在这方面可能是错的,而且更难解释。 |
|
相关推荐
1个回答
|
|
参考STM32F4参考手册RM0090《图244.主接收器传输时序图》
您描述的情况是由于: “4. EV7-1 软件序列在当前字节传输的 ACK 脉冲之前未完成”。 虽然,HAL I2C 驱动程序不支持这种情况,实际上也没有支持这种特定情况的计划。 当前的 HAL I2C 驱动程序管理 EV7-1 在当前字节传输的 ACK 脉冲之前完成的情况。 我们建议在中断或 DMA 模式下使用 I2C。但是对于轮询模式,用户需要通过禁用全局中断 (__disable_irq();) 然后重新启用它 (__enable_irq();) 来保护以下 API HAL_I2C_Mem_Read() 和 HAL_I2C_Master_Receive()。 |
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2906 浏览 1 评论
3290 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1873 浏览 1 评论
3725 浏览 6 评论
6134 浏览 21 评论
STM32G070 UART串口,低波特率传送数据时,TIMER出现严重延时现象如何解决?
24浏览 4评论
STM32H7打开DCache后,出现了串口接收信息为空的现象,是哪里出了问题?
13浏览 4评论
用NANO STM32F103RBT6的开发板烧录不了是哪里出了问题?
10浏览 4评论
4浏览 4评论
stm32mp135使用官方SDK交叉编译工具链,编译的时候却找不到头文件怎么解决?
12浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-3-10 19:41 , Processed in 0.440481 second(s), Total 44, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191