你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于stm32f1硬件I2C busy问题

[复制链接]
攻城狮Melo 发布时间:2023-5-23 17:16
硬件I2C一直停留在busy
; \1 s  P- W' `' x8 Q6 J我尝试配置f1的硬件I2C,写好程序后读取一下mpu6050的I2C地址,只读取一个byte,调试代码时发现I2C写操作没问题,但是读取操作加入之后I2C一直停留在busy。7 c& r5 C: m& k+ b
  1. //停在这里, N* r' ~" m0 w; z5 w
  2. while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));) P+ |. |8 S& Y+ `- k7 o5 U
复制代码

2 F( i/ ]+ l+ L2 y9 p! E. f看了几篇博文,开关I2C->CR1的最高位SWRST并且重新初始化也不行,误打误撞遇到了博主lalalaxy的文章,文中提到需要在接收数据前把SDA拉高,还提到要注意数据手册中的清零细节。
5 f/ N+ B; k! n- R8 u8 F0 H% ~# e! N* ^( \
重新查看手册发现我之前漏掉EV6_1的细节:" C% L; k5 Z, V( x9 d, K9 h, G

+ b/ I, r" K& u5 N
9d959a5bce9d4bcdbb77e0fbf4150e8f.png
5 w+ y0 ]; \* W/ i0 {3 I1 }2 [  G5 Z# b6 Q8 }7 ], w0 Z9 d% U
图中提到EV6_1这个事件对应只读取一个byte时的操作,并且在标准库中没有相应的flag操作。所以这里的操作需要手动完成,即在事件6之后加:+ V5 R# S$ _* |* U, p
1 h' @" s) {( n9 g2 t
  1. //事件68 E& Q4 e( m3 d4 m" U
  2. while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
    6 L5 @7 B# Q9 {- L8 t: B( x! c
复制代码
  1. //事件6
    9 i: U4 Q/ t( r: V
  2. while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
    ) L! I9 y0 j7 i9 L6 W/ U
复制代码
5 g0 o9 N9 Y* W
我没有在读数据前将SDA拉高,I2C通讯也可以正常读取,目前尚不知原因。
" K0 ^( a3 k  x- ~
0 Z3 ]8 B2 b8 w
67f078b7e07640b5bf3bb83fcf5945fa.png 8 a* K' ]6 A2 R; r& _+ ~

. Y% \( S, d) ?! f0 ?( nGPIO口初始化错了也有可能造成busy的情况。, b; w! L, s  I4 ?9 O  \
————————————————* w& a% Z$ C: c
版权声明:外星人请走开+ u8 O! v! n7 |+ @2 v- a+ m7 v
如有侵权请联系删除
2 ]4 H! }! ~8 ?& M: J
4 T/ \2 m+ x7 D% G9 f& O

2 C' S( a5 @0 ?$ w1 T- ?3 s! J# Y* K, s) l4 s  B
收藏 评论0 发布时间:2023-5-23 17:16

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版