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

基于stm32f1硬件I2C busy问题

[复制链接]
攻城狮Melo 发布时间:2023-5-23 17:16
硬件I2C一直停留在busy
. n4 j7 C. G5 J* M) ]& G  l  U9 }/ z我尝试配置f1的硬件I2C,写好程序后读取一下mpu6050的I2C地址,只读取一个byte,调试代码时发现I2C写操作没问题,但是读取操作加入之后I2C一直停留在busy。
' q7 s! {; O# |$ |. v
  1. //停在这里( w+ ^* G8 R# H* M! L4 V1 H1 [
  2. while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));9 h1 C  |& S, v3 _! N- u# c
复制代码
, c2 u- k2 V, ]% Q& `
看了几篇博文,开关I2C->CR1的最高位SWRST并且重新初始化也不行,误打误撞遇到了博主lalalaxy的文章,文中提到需要在接收数据前把SDA拉高,还提到要注意数据手册中的清零细节。* ?1 {. B& m' @

3 X. g& P7 U% |' o# v重新查看手册发现我之前漏掉EV6_1的细节:9 E* m+ E! ~0 y
" h- a) Q- i' M
9d959a5bce9d4bcdbb77e0fbf4150e8f.png
; O- C: Z6 [/ v: S0 u1 `& f' F5 }* n  F) A8 z& u( W
图中提到EV6_1这个事件对应只读取一个byte时的操作,并且在标准库中没有相应的flag操作。所以这里的操作需要手动完成,即在事件6之后加:
7 [1 q. u1 p6 V% z9 l, u: J& j0 j9 k6 `; x2 w- S$ F
  1. //事件68 w; v3 z7 |# k- Q+ s
  2. while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
    - x4 ^3 C( @2 X( Z# i4 {* C
复制代码
  1. //事件6) x. V7 Z/ m. M) a' j! X" N/ I
  2. while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));# r) f7 A3 v% D) f* @5 U
复制代码
8 M' n  Q+ [1 W! |6 I
我没有在读数据前将SDA拉高,I2C通讯也可以正常读取,目前尚不知原因。
3 S9 Q, }" j) P$ d- \& z
$ V' ^: m: [; {8 y4 W& O
67f078b7e07640b5bf3bb83fcf5945fa.png
7 t& p6 \" C/ V% g
( G; v- F3 Q( g( _GPIO口初始化错了也有可能造成busy的情况。
" Z4 s: R  ?/ L————————————————  z  T7 p' j! S' M9 g9 u
版权声明:外星人请走开9 {" [- e& {. t7 M) b
如有侵权请联系删除
! g. A! x4 n$ b9 F3 [
  l9 g7 G! E& g
4 l" [) v8 y0 s9 C* e' c. c# O0 ]

" b" a$ A2 M7 Q
赞 收藏 评论0 发布时间:2023-5-23 17:16

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版