TA的每日心情 | 郁闷 2017-12-1 15:13 |
---|
签到天数: 188 天 连续签到: 1 天 [LV.7]常住居民III
|
本帖最后由 smallmount 于 2014-1-18 00:48 编辑
1. 板载OpenSDA貌似下载速度较慢,而且在线仿真实测只能设置两个断点,用着实在不爽。
最后直接引出了KL25Z的SWD引脚,用Jlink搞定~
2. KL25Z的I2C有bug~ ,这是我实测的:
原初始化代码如下:
void I2C_Init(I2C_MemMapPtr p){
SIM_SCGC4 |= SIM_SCGC4_I2C0_MASK;
// configure GPIO for I2C function
PORTE_PCR24 = PORT_PCR_MUX(5);
PORTE_PCR25 = PORT_PCR_MUX(5);
p->F = 0x14; // baudrate
p->C1 = 0x80; // enable IIC
}
反复频繁的按复位键,会发现I2C死机。
此时在线仿真,查看I2C寄存器,发现初始化I2C后,S寄存器BUSY总是置一,表明I2C总是忙碌;
测试E25引脚总是保持一个电平;
在线仿真,发现PORTE_PCR25 = PORT_PCR_MUX(5);不起作用,因为PTE的PDIR值为0x01000000,而非0x03000000;
初始化代码中加入
IO_FUN_SEL(MKL_PORTE,25,1);
GPIO_DDR_OUTPUT(MKL_PORTE,25);
GPIO_SET(MKL_PORTE,25);
问题解决!
这个应该是芯片的bug,具体表现为:I2C通信过程中,偶然复位(非上电复位),之后PE25引脚不能直接设置为I2C功能
2014-01-17 01:25补充:
感谢@suyong_yq
在@suyong_yq的耐心回复与交流过程中,我得出这样的结论:
问题描述如视频:
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卡死不工作的现象。
再次感谢@suyong_yq
2014-01-18 0:47补充:
http://www.freescaleic.org/bbs/article_891_572613.html
希望驱动包早日放出
|
-
KL25Z引出SWD
|