17636|20

62

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

用stm32,I2C总线挂了,如何复位? [复制链接]

以前模拟I2C的时候,是在SDA为高的情况下,SCL强制发送9个脉冲使总线复位。
STM32里面是怎么处理的呢?置为CR1寄存器的SWRST位吗?
这样做的话,复位后,所有 相关的 寄存器啊,时钟啊那不是要重新设置啊?
此帖出自stm32/stm8论坛

最新回复

我参照at24c512cpdf手册、写了一个复位函数、然后芯片就不会一直处于忙的状态了、再参照stm32r的全程改出来了一个stm8s207cb的页写与缓冲区读函数。 测试完全成功 QQ214147249 超亚电子工作室  详情 回复 发表于 2015-4-30 01:10
点赞 关注
 

回复
举报

66

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
                                 硬件I2C模块没有对应的机制,你可以配置对应的端口为OD输出,再强制向SCL发送9个脉冲。
此帖出自stm32/stm8论坛
 
 

回复

17

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
                                 就是用对应的IO口来模拟这个过程咯?
此帖出自stm32/stm8论坛
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 
就是用对应的IO口来模拟这个过程咯?
YES
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 
                                 那CR1寄存器的SWRST位在什么情形下用呢?
此帖出自stm32/stm8论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

6
 
CR1寄存器的SWRST位只复位I2C模块,不对外部器件产生影响。

可以在任何想复位I2C模块时使用。
此帖出自stm32/stm8论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(中级)

7
 
                                 那这个用寄存器复位I2C模块,和模拟方式发送9个脉冲使总线复位,有什么区别呢?版主耐心说说啊
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

8
 
                                 发脉冲方式使总线复位,不会使得I2C模块的寄存器复位。置寄存器方式就会使得其全部复位。这是我清楚的。还有没有其他的区别呢?
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

9
 
CR1寄存器的SWRST位只复位I2C模块,不对外部器件产生影响,即不对从设备发信号。

而用模拟方式发送9个脉冲是复位总线,也就是说要对从设备发信号。
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

10
 
                                 哦。。。谢了
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

11
 
                                 为什么要发九个脉冲才能复位从设备,主控发一个STOP 行不行啊?
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

12
 
以前模拟I2C的时候,是在SDA为高的情况下,SCL强制发送9个脉冲使总线复位。
STM32里面是怎么处理的呢?置为CR1寄存器的SWRST位吗?
这样做的话,复位后,所有 相关的 寄存器啊,时钟啊那不是要重新设置啊? ...
我们给客户建议的复位是连续发9个 start stop组合。
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

13
 
至于主器件发一个STOP能不能恢复I2C总线还没有试过
双休调I2C的时候,用的3.3版库函数,i2c_ee.c文件里面有个写好的BufferRead()函数,运行了这个函数之后,I2C那个寄存器的BUSY位就置1了。然后退出调试,再进调试时,运行I2C外设时钟后,BUSY立马置1,搞的后面的程序没法运行,一直死在那个等BUSY置0后,才能继续下去的函数那。

昨天又调了下,即使BUSY位在调试时候置1了,退出调试状态后,再进去调试,没影响了,程序跑的很好。真是见鬼了啊,想让它死,它就是死不了啊。感觉这个硬件I2C,流程上是有些头晕
此帖出自stm32/stm8论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

14
 
BUSY位置1时,有可能是Host没有释放总线,这种情况下退出调试,再进调试时,Host可以释放总线,而使后续操作正确。

但BUSY位置1时也可能是Device没有释放总线,这种情况下退出调试,再进调试时,Host不能释放总线,结果会导致后续操作错误。这时,如果你对Device复位,或做掉电处理,则它就能释放总线了,再调试也不会出错了。
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

15
 
是的哦 谢谢提醒哈
现在板子上就一个24c02 不知道怎么弄成 Device没有释放总线?
我单步调试时候,故意在中途断电。然后在上电调试时候,还是能顺利运行程序。
前几天休息时候调,老是死。现在想要它死,它怎么都死不了 啊啊
反正明白了整个过程 以后再遇到了 心中也有数了啊
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

16
 
哇哇哇,多说一句:

在主从之间串个小电阻,就可以在总线被拉低时知道,是谁拉的了。
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

17
 
哇哇哇,多说一句:

在主从之间串个小电阻,就可以在总线被拉低时知道,是谁拉的了。
万一是多个Device的情况呢?不能串电阻了吧?
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

18
 
万一是多个Device的情况呢?不能串电阻了吧?
ounie 发表于 2010-9-2 12:39

多个Device时可以每个Device的信号线上,先串一个电阻,然后再一起接到Host。
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

19
 
                                 哦哦 这样啊 哈哈 之前没想到哈
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

20
 
以前模拟I2C的时候,是在SDA为高的情况下,SCL强制发送9个脉冲使总线复位。
STM32里面是怎么处理的呢?置为CR1寄存器的SWRST位吗?
这样做的话,复位后,所有 相关的 寄存器啊,时钟啊那不是要重新设置啊? ...
依楼主的说法,发9个脉冲是为了使其它I2C器件复位,或释放总线(这个情况我没有遇到过,什么器件要这么做呢)。用STM32的软件复位只能复位器件本身的STM32模块,你可以这么做,你先关闭STM32的I2C模块,然后再模拟复位的脉冲,然后在起动I2C,初始化一下。
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
立即报名 | 2025 瑞萨电子工业以太网技术日即将开启!
3月-4月 深圳、广州、北京、苏州、西安、上海 走进全国6城
2025瑞萨电子工业以太网技术巡回沙龙聚焦工业4.0核心需求,为工程师与企业决策者提供实时通信技术最佳解决方案。
预报从速,好礼等您拿~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表