23回答

0收藏

关于OpenSDA和KL25Z的I2C的问题

#竞赛 #竞赛 11014 人阅读 | 23 人回复 | 2014-01-16

本帖最后由 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
希望驱动包早日放出






























QQ截图20140116011312.jpg (57.54 KB, 下载次数: 113)

KL25Z引出SWD

KL25Z引出SWD
分享到:
回复

使用道具 举报

回答|共 23 个

倒序浏览

沙发

fj1161

发表于 2014-1-16 08:04:16 | 只看该作者

顶一个~~~~~~~~~
第五年了,这次一定要坚持到底,不留遗憾!!!
板凳

dushanwu

发表于 2014-1-16 09:52:53 | 只看该作者

学习ing……         
MMA7660加速度传感器,不错,可以读取啦,哈哈,很有意思呀!
地板

suyong_yq

发表于 2014-1-16 10:16:01 | 只看该作者

非常佩服LZ对解决问题的执着。我也用过这块板子,有一些思路,可以跟LZ分享一下:
1. OpenSDA在KL25上对接的是SWD接口,这个接口本身速率就不是非常快的那种,而且在开源调试器的领域,OpenSDA绝对是首屈一指的。用正版的OpenSDA不收钱,用正版的Jlink需要很多钱,使用克隆版是不能跟开源产品进行比较的。还有就是,OpenSDA可以将调试,供电和串口合成一条线,Jlink-v8是不行的,据说Jlink-V9也具备了相似的功能,不过克隆版还没鼓捣出来。。。
2. 对于配置引脚来说,是PORT外设专门的任务,同GPIO外设是有分工的。引脚可以复用到不同的内部信号上,可以在有限的引脚上扩展更多的功能,节约封装空间。在使用外设之前先要配置引脚的复用功能,这是标准流程,也是流行的编程步骤,不是芯片的BUG。不过有很多端口引脚的默认功能是GPIO,有的默认功能是ADC等等,有的时候用默认的就可以。芯片的BUG不是那么容易放出来的,尤其是KL25都已经推了很多年了,已经经过了成熟的市场验证。
3. 其实FRDM的理念就是自由与开放,这块板子做得也挺漂亮的,基于K20的OpenSDA,主控是目前市场上几乎是最好的CM0+内核的片子,三色灯,三轴加速度传感器,触摸板。整体外形小巧,价格超值,现在还有免费送的活动。从个人角度上,我是非常推崇的这个设计理念的。忍不住赞一个!
5#

ssj-413971

发表于 2014-1-16 10:39:37 | 只看该作者

suyong_yq 发表于 2014-1-16 10:16
非常佩服LZ对解决问题的执着。我也用过这块板子,有一些思路,可以跟LZ分享一下:
1. OpenSDA在KL25上对接 ...

感觉你是个不错的,高级屌丝哦。赞一个吧。
6#

hill123

发表于 2014-1-16 13:27:19 | 只看该作者

本帖最后由 smallmount 于 2014-1-16 13:30 编辑
suyong_yq 发表于 2014-1-16 10:16
非常佩服LZ对解决问题的执着。我也用过这块板子,有一些思路,可以跟LZ分享一下:
1. OpenSDA在KL25上对接 ...

很热心的回复哦,顶一个!
1. 这个问题没有考虑那么多,只是我在调试I2C的时候让我很窝火,可怜的2个断点让我设置来设置区,受够了。我也不太赞成使用盗版的东西,仿真器周立功的致远电子公司的AK100Pro也不错,至于使用哪种仿真器,只要支持SWD,并且用着舒服就是了。
2. 我的初始化代码中已经有配置引脚语句,并复用为I2C功能。
PORTE_PCR25 = PORT_PCR_MUX(5);       //5功能,为I2C功能
IO_FUN_SEL(MKL_PORTE,25,1);              //1功能,为IO功能
我所说的bug是:复位后,初始化函数中,直接配置为I2C功能,之后运行过程中,I2C会出现问题的,这是我实测的(E25有次现象,E24没有)。我觉得这是芯片的bug
目前最可靠的方法是:复位后,初始化函数中,先配置为IO功能,并输出0/1;然后配置为I2C功能。
完整的初始化代码如下:
void I2C_Init(I2C_MemMapPtr p){
        SIM_SCGC4 |= SIM_SCGC4_I2C0_MASK;             // I2C时钟
          // configure GPIO for I2C function
        PORTE_PCR24 = PORT_PCR_MUX(5);                 // E24复用为I2C功能

                      IO_FUN_SEL(MKL_PORTE,25,1);            // E25复用为IO功能
                      GPIO_DDR_OUTPUT(MKL_PORTE,25);  // E25方向设置为输出
                      GPIO_SET(MKL_PORTE,25);                  // E25输出1

        PORTE_PCR25 = PORT_PCR_MUX(5);                  // E25复用为I2C功能
        p->F  = 0x14; // baudrate
        p->C1 = 0x80; // enable IIC
}
3. 严重同意,这次举办的比赛非常有意义,而且我也是受益者之一~~~~~
7#

hill123

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

熬夜到凌晨1点,发的帖子不够严谨,还多包涵
8#

hill123

发表于 2014-1-16 13:39:46 | 只看该作者

fj1161 发表于 2014-1-16 08:04
顶一个~~~~~~~~~

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

hill123

发表于 2014-1-16 13:40:48 | 只看该作者

shen2008jie 发表于 2014-1-16 10:39
感觉你是个不错的,高级屌丝哦。赞一个吧。

一块进步哈,加油了,向着高级屌丝前进........
10#

hill123

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

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

多谢~~,新手,望支持
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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