完善资料让更多小伙伴认识你,还能领取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的选项
2632 浏览 1 评论
3208 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1783 浏览 1 评论
3607 浏览 6 评论
5987 浏览 21 评论
939浏览 4评论
1315浏览 4评论
在Linux上安装Atollic TRUEStudio的步骤有哪些呢?
582浏览 3评论
使用DMA激活某些外设会以导致外设无法工作的方式生成代码是怎么回事
1302浏览 3评论
1357浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 07:12 , Processed in 1.024527 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号