打印

用stm32,I2C总线挂了,如何复位?

[复制链接]
11484|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ounie|  楼主 | 2010-8-31 14:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以前模拟I2C的时候,是在SDA为高的情况下,SCL强制发送9个脉冲使总线复位。
STM32里面是怎么处理的呢?置为CR1寄存器的SWRST位吗?
这样做的话,复位后,所有 相关的 寄存器啊,时钟啊那不是要重新设置啊?
沙发
香水城| | 2010-8-31 14:53 | 只看该作者
硬件I2C模块没有对应的机制,你可以配置对应的端口为OD输出,再强制向SCL发送9个脉冲。

使用特权

评论回复
板凳
ounie|  楼主 | 2010-8-31 15:06 | 只看该作者
就是用对应的IO口来模拟这个过程咯?

使用特权

评论回复
地板
香水城| | 2010-8-31 15:07 | 只看该作者
就是用对应的IO口来模拟这个过程咯?
ounie 发表于 2010-8-31 15:06


YES

使用特权

评论回复
5
ounie|  楼主 | 2010-8-31 15:15 | 只看该作者
那CR1寄存器的SWRST位在什么情形下用呢?

使用特权

评论回复
6
香水城| | 2010-8-31 15:30 | 只看该作者
CR1寄存器的SWRST位只复位I2C模块,不对外部器件产生影响。

可以在任何想复位I2C模块时使用。

使用特权

评论回复
7
ounie|  楼主 | 2010-8-31 15:42 | 只看该作者
那这个用寄存器复位I2C模块,和模拟方式发送9个脉冲使总线复位,有什么区别呢?香版耐心说说啊:D

使用特权

评论回复
8
ounie|  楼主 | 2010-8-31 15:44 | 只看该作者
发脉冲方式使总线复位,不会使得I2C模块的寄存器复位。置寄存器方式就会使得其全部复位。这是我清楚的。还有没有其他的区别呢?

使用特权

评论回复
9
香水城| | 2010-8-31 15:45 | 只看该作者
CR1寄存器的SWRST位只复位I2C模块,不对外部器件产生影响,即不对从设备发信号。

而用模拟方式发送9个脉冲是复位总线,也就是说要对从设备发信号。

使用特权

评论回复
10
ounie|  楼主 | 2010-8-31 15:59 | 只看该作者
哦。。。谢了

使用特权

评论回复
11
jackzbb| | 2010-8-31 17:38 | 只看该作者
为什么要发九个脉冲才能复位从设备,主控发一个STOP 行不行啊?

使用特权

评论回复
12
linqing171| | 2010-8-31 19:00 | 只看该作者
本帖最后由 linqing171 于 2010-8-31 19:02 编辑
以前模拟I2C的时候,是在SDA为高的情况下,SCL强制发送9个脉冲使总线复位。
STM32里面是怎么处理的呢?置为CR1寄存器的SWRST位吗?
这样做的话,复位后,所有 相关的 寄存器啊,时钟啊那不是要重新设置啊? ...
ounie 发表于 2010-8-31 14:25


我们给客户建议的复位是连续发9个 start stop组合。

使用特权

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

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

使用特权

评论回复
14
香水城| | 2010-9-1 15:44 | 只看该作者
BUSY位置1时,有可能是Host没有释放总线,这种情况下退出调试,再进调试时,Host可以释放总线,而使后续操作正确。

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

使用特权

评论回复
15
ounie|  楼主 | 2010-9-1 16:13 | 只看该作者
是的哦 谢谢提醒哈
现在板子上就一个24c02 不知道怎么弄成 Device没有释放总线?
我单步调试时候,故意在中途断电。然后在上电调试时候,还是能顺利运行程序。
前几天休息时候调,老是死。现在想要它死,它怎么都死不了 啊啊
反正明白了整个过程 以后再遇到了 心中也有数了啊

使用特权

评论回复
16
lut1lut| | 2010-9-2 12:00 | 只看该作者
哇哇哇,多说一句:

在主从之间串个小电阻,就可以在总线被拉低时知道,是谁拉的了。

使用特权

评论回复
17
ounie|  楼主 | 2010-9-2 12:39 | 只看该作者
哇哇哇,多说一句:

在主从之间串个小电阻,就可以在总线被拉低时知道,是谁拉的了。
lut1lut 发表于 2010-9-2 12:00


万一是多个Device的情况呢?不能串电阻了吧?

使用特权

评论回复
18
香水城| | 2010-9-2 13:53 | 只看该作者
万一是多个Device的情况呢?不能串电阻了吧?
ounie 发表于 2010-9-2 12:39


呵呵,想抬杠,谁都会,:D

多个Device时可以每个Device的信号线上,先串一个电阻,然后再一起接到Host。

使用特权

评论回复
19
ounie|  楼主 | 2010-9-2 14:30 | 只看该作者
哦哦 这样啊 哈哈 之前没想到哈:$

使用特权

评论回复
20
jgphu| | 2010-12-9 10:47 | 只看该作者
以前模拟I2C的时候,是在SDA为高的情况下,SCL强制发送9个脉冲使总线复位。
STM32里面是怎么处理的呢?置为CR1寄存器的SWRST位吗?
这样做的话,复位后,所有 相关的 寄存器啊,时钟啊那不是要重新设置啊? ...
ounie 发表于 2010-8-31 14:25


依楼主的说法,发9个脉冲是为了使其它I2C器件复位,或释放总线(这个情况我没有遇到过,什么器件要这么做呢)。用STM32的软件复位只能复位器件本身的STM32模块,你可以这么做,你先关闭STM32的I2C模块,然后再模拟复位的脉冲,然后在起动I2C,初始化一下。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

41

帖子

1

粉丝