TA的每日心情 | 郁闷 2017-12-1 15:13 |
---|
签到天数: 188 天 连续签到: 1 天 [LV.7]常住居民III
|
楼主 |
发表于 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卡死不工作的现象。 |
|