23回答

0收藏

关于OpenSDA和KL25Z的I2C的问题

回答|共 23 个

倒序浏览

11#

hill123

发表于 2014-1-16 13:41:44 | 只看该作者

分享到:
dushanwu 发表于 2014-1-16 09:52
学习ing……

多谢~~,新手,望支持
12#

hill123

发表于 2014-1-16 13:42:30 | 只看该作者

wudianjun2001 发表于 2014-1-16 08:58
看看。。。。。

多谢~~,新手,望支持
13#

suyong_yq

发表于 2014-1-16 21:21:55 | 只看该作者

smallmount 发表于 2014-1-16 13:27
很热心的回复哦,顶一个!
1. 这个问题没有考虑那么多,只是我在调试I2C的时候让我很窝火,可怜的2个断点 ...

看了你的代码我觉得可能是你代码的问题,你可以在配置引脚复用功能的时候同时设定打开大驱动开关,例如在配置PTE25引脚的时候,可以使用语句:
PORTE_PCR25 = PORT_PCR_MUX(5) | PORT_PCR_DSE_MASK ;
这个是SDA引脚,传数据的,在驱动能力不强的情况下比较容易受干扰;PTE24上送的是SCL的时钟信号,一般接收端都是高阻的,不会对信号有多少干扰,所以没有出现你说的异常。
一般来说这就已经OK了,如果碰到极品case,还可以使能内部的上拉电阻进一步增强信号的驱动能力。最基本的IIC电气连接中,在总线的SDA信号线上就是有上拉电阻的。
14#

suyong_yq

发表于 2014-1-16 21:25:20 | 只看该作者

smallmount 发表于 2014-1-16 13:27
很热心的回复哦,顶一个!
1. 这个问题没有考虑那么多,只是我在调试I2C的时候让我很窝火,可怜的2个断点 ...

还有一点忘记说了,同时在SWD接口上接OpenSDA和Jink,并且使用用Jlink调试,有通过SWDIO信号线烧掉JLink的危险。
15#

hill123

发表于 2014-1-17 01:12:42 | 只看该作者

suyong_yq 发表于 2014-1-16 21:21
看了你的代码我觉得可能是你代码的问题,你可以在配置引脚复用功能的时候同时设定打开大驱动开关,例如在 ...

按照su兄说的,修改了代码,问题仍未解决。为更好的阐明现象,录制视频如下:
http://v.youku.com/v_show/id_XNjYyNjM1MDIw.html
1. 首先不清楚为什么复位键复位MCU能使得I2C工作不正常,这一点很疑惑。
2. 抛开这一点不谈,出现这种现象后怎么解决呢?显然“上电复位”不是一个好方法。
3. 调试发现,出现死机现象后,E25不受控制,导致I2C处于忙碌状态。
datasheet上解释BUSY的原因只有一个:发生了START信号,即SCK=1期间,检测到SDA = 0;
为了输出1,加上语句:
                      IO_FUN_SEL(MKL_PORTE,25,1);            // E25复用为IO功能
                      GPIO_DDR_OUTPUT(MKL_PORTE,25);  // E25方向设置为输出
                      GPIO_SET(MKL_PORTE,25);                  // E25输出1
让E25配置为IO,并输出1,接着再设置该引脚复用为I2C功能。正如视频所演示的,不会再出现卡死现象。
加上如下语句是不行的:
                      IO_FUN_SEL(MKL_PORTE,25,1);            // E25复用为IO功能
                      GPIO_DDR_OUTPUT(MKL_PORTE,25);  // E25方向设置为输出
                      GPIO_CLR(MKL_PORTE,25);                  // E25输出0
看来问题似乎可以这样解释:
连续按复位键,其中有一次MCU复位瞬间,SDA=0,接着MCU复位,进行I2C初始化;在打开I2C0的瞬间,MCU测得SCK = 1时, SDA = 0,误判为START信号,故始终处于忙碌状态。这就导致I2C卡死不工作的现象。
16#

hill123

发表于 2014-1-17 01:19:06 | 只看该作者

suyong_yq 发表于 2014-1-16 21:25
还有一点忘记说了,同时在SWD接口上接OpenSDA和Jink,并且使用用Jlink调试,有通过SWDIO信号线烧掉JLink ...

KL25z的SWD接口是板子上预留的,我看了它的原理图,发现open SDA与KL25z之间的连接(SWDIO,SWCLK)有三态门74LVC125,open SDA可控制三态门的开关。
由此推断在板子设计阶段,就考虑了外接仿真器的情况。
实际测试发现,在openSDA不工作(不工作的意思是,不用他来仿真)的情况下,所有的三态门的门极 = 1,即,处于关闭状态。
只要不使用openSDA仿真,我们可以视作它与KL25z的调试接口没有连接!!所以不存在冲突问题~
17#

suyong_yq

发表于 2014-1-17 09:56:16 | 只看该作者

smallmount 发表于 2014-1-17 01:12
按照su兄说的,修改了代码,问题仍未解决。为更好的阐明现象,录制视频如下:
http://v.youku.com/v_show ...

有没有试过调整一下配置引脚复用和配置IIC模块的顺序?这样可以保证IIC始终都是工作在正常状态下。这种瞬间的情况是不安全的,在写程序的时候就要避免。
18#

hill123

发表于 2014-1-17 20:11:18 | 只看该作者

suyong_yq 发表于 2014-1-17 09:56
有没有试过调整一下配置引脚复用和配置IIC模块的顺序?这样可以保证IIC始终都是工作在正常状态下。这种瞬 ...

实测不行
原则上讲,应该:A. 将IO口配置为I2C功能,B. 配置I2C寄存器,C. 最后再打开I2C
A和B互换好像作用不大,
按照道理上讲,MCU厂商应该规避我遇到的这个问题,或者明确告诉我要配置I2C功能时,需要首先将映射的IO输出1,以避免I2C控制器误判为忙碌状态。因为别的厂商的MCU貌似没有这个问题。
19#

zhangyeyan

发表于 2014-1-18 14:38:02 | 只看该作者

赞~~~学习ing
20#

suyong_yq

发表于 2014-1-18 21:21:12 | 只看该作者

smallmount 发表于 2014-1-17 20:11
实测不行
原则上讲,应该:A. 将IO口配置为I2C功能,B. 配置I2C寄存器,C. 最后再打开I2C
A和B互换好像作 ...

关于A,如我在之前的回复中提到的,不仅仅是要把Pin配置为I2C功能,还要记得配置端口时:
1. 配置启动高驱动开关
2. 配置使用内部上拉电阻
还有一点个人建议:
大公司从设计芯片到发布已经经过了充分的测试,如果这是芯片的问题,必将面临大量芯片的召回,留给用户发现bug的可能性不是没有,但一般仅存在这种理论的可能,尤其是像这样已经发布了将近两年的产品。像我们这样的软件开发者,贸然怀疑硬件的设计,不仅仅是在不能保证代码正确的前提下发现一些现象,还需要提供令人充分信服的理由,否则多少有点不负责任。我看你用的代码也不是官方的参考代码,建议从官网上下验证代码,或者用最基本的寄存器操作验证功能。
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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