楼主: cjpx84

[分享] mk1l4 i2c进入I2c_wait出不来

[复制链接]

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2015-4-28 11:50:25 | 显示全部楼层
cjpx84 发表于 2015-4-28 10:55
正常的。就是多主的时候,会出现问题。并且电池我看了下SMBUS协议,也是支持总线仲裁的。这个问题困扰了 ...

问题确实比较奇怪,在debug时,给个困在 i2c_Wait()时,I2Cx_S寄存器各个bit值的截图
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

90

帖子

0

中级会员

Rank: 3Rank: 3

积分
357
最后登录
2015-12-1
 楼主| 发表于 2015-4-28 12:20:51 | 显示全部楼层
本帖最后由 cjpx84 于 2015-4-28 13:38 编辑

增加了超时机制,i2c_wait超时之后,MCU主动发起stop信号,然后等待I2C总线free。在等待总线free时,也增加了超时机制。如果总线free之后,就重新发起start信号,开始传输数据。

出问题时的现象:
I2c_wait超时之后,MCU发起stop信号,然后等待bus free,但是目前出现的问题是,总线一直在忙,直到超时,总线还没有空闲下来,这样超时之后,就又发起start信号,导致卡死在I2C_READ上出不来。
另外,还有一个现象,就是出了一次问题之后,我用仿真器重新启动过两次,一启动就出问题。估计是I2C状态没有恢复,保持了之前的错误状态。(仿真器启动时不掉电的)。我多做了几个实验,每次都用仿真器启动,测试了下SCL和SDA,发现SCL为高,SDA为低。确实是保持了原来总线的错误状态。正常情况下,重启之后,SCL和SDA应该都是高电平才对


在网上看了下,我这种情况属于I2C总线死锁。但是,我并没有复位主控制器。。。。。。
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

90

帖子

0

中级会员

Rank: 3Rank: 3

积分
357
最后登录
2015-12-1
 楼主| 发表于 2015-4-28 12:21:15 | 显示全部楼层
FSL_TICS_ZP 发表于 2015-4-28 11:50
问题确实比较奇怪,在debug时,给个困在 i2c_Wait()时,I2Cx_S寄存器各个bit值的截图 ...


A1: 0x00
F: 0x27
C1: 0xb8
S:  0x85
D:  0xdc
C2: 0X00
FLT: 0x40
RA :0x00
SMB: 0X00
A2: 0XC2
SLTH: 0X00
SLTL :0X00
这是没有修改前卡在i2c_wait时的寄存器信息。
回复 支持 反对

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2015-4-28 14:01:07 | 显示全部楼层
cjpx84 发表于 2015-4-28 12:21
A1: 0x00
F: 0x27
C1: 0xb8

照你的描述,MCU仲裁失败后,就会出现目前这个问题,那么能不能人为调整访问顺序,先MCU主动避让,让电池访问,然后再MCU跟着访问,这样就可以避开同时访问而发生的仲裁啊。
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

90

帖子

0

中级会员

Rank: 3Rank: 3

积分
357
最后登录
2015-12-1
 楼主| 发表于 2015-4-28 14:45:24 | 显示全部楼层
FSL_TICS_ZP 发表于 2015-4-28 14:01
照你的描述,MCU仲裁失败后,就会出现目前这个问题,那么能不能人为调整访问顺序,先MCU主动避让,让电池 ...

这个估计不能够。电池的是第三方做的,也不知道它什么时候需要访问。另外,MCU这边也不好做控制吧。
回复 支持 反对

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2015-4-28 14:50:48 | 显示全部楼层
cjpx84 发表于 2015-4-28 14:45
这个估计不能够。电池的是第三方做的,也不知道它什么时候需要访问。另外,MCU这边也不好做控制吧。 ...

I2C模块肯定是支持multimaster模式的,这个电池支持编程吗,也就是是否内嵌一个MCU或者类似,支持编程可控?
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

90

帖子

0

中级会员

Rank: 3Rank: 3

积分
357
最后登录
2015-12-1
 楼主| 发表于 2015-4-28 14:55:53 | 显示全部楼层
本帖最后由 cjpx84 于 2015-4-28 14:57 编辑
FSL_TICS_ZP 发表于 2015-4-28 14:50
I2C模块肯定是支持multimaster模式的,这个电池支持编程吗,也就是是否内嵌一个MCU或者类似,支持编程可 ...


I2C模块硬件就支持的吧,不用做什么配置的吧。这个电池就认为是个黑盒子吧。至少我这边是不能做什么修改的。
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

90

帖子

0

中级会员

Rank: 3Rank: 3

积分
357
最后登录
2015-12-1
 楼主| 发表于 2015-4-29 16:36:07 | 显示全部楼层
恢复到原始方案:感觉又出现ACK消息没有收到。
带电池测试.png
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

90

帖子

0

中级会员

Rank: 3Rank: 3

积分
357
最后登录
2015-12-1
 楼主| 发表于 2015-4-30 13:39:03 | 显示全部楼层
FSL_TICS_ZP 发表于 2015-4-28 14:50
I2C模块肯定是支持multimaster模式的,这个电池支持编程吗,也就是是否内嵌一个MCU或者类似,支持编程可 ...

有没有什么方法可以reset MKL14的i2c总线的。
回复 支持 反对

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2015-4-30 15:21:14 | 显示全部楼层
cjpx84 发表于 2015-4-30 13:39
有没有什么方法可以reset MKL14的i2c总线的。

如果KL14是主机的话,发送完stop指令后,应该既可以释放掉队SDA,SCL的控制啊!
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-24 08:13 , Processed in 0.098185 second(s), 28 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表