查看: 7586|回复: 23

关于OpenSDA和KL25Z的I2C的问题

[复制链接]
  • TA的每日心情
    郁闷
    2017-12-1 15:13
  • 签到天数: 188 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2014-1-16 01:14:28 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 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

    KL25Z引出SWD
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-12 10:32
  • 签到天数: 295 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2014-1-16 08:04:16 | 显示全部楼层
    顶一个~~~~~~~~~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-3-15 10:18
  • 签到天数: 1027 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2014-1-16 09:52:53 | 显示全部楼层
    学习ing……         
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-10-29 22:48
  • 签到天数: 731 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 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+内核的片子,三色灯,三轴加速度传感器,触摸板。整体外形小巧,价格超值,现在还有免费送的活动。从个人角度上,我是非常推崇的这个设计理念的。忍不住赞一个!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2013-7-2 13:29
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

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

    感觉你是个不错的,高级屌丝哦。赞一个吧。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2017-12-1 15:13
  • 签到天数: 188 天

    连续签到: 1 天

    [LV.7]常住居民III

     楼主| 发表于 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. 严重同意,这次举办的比赛非常有意义,而且我也是受益者之一~~~~~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2017-12-1 15:13
  • 签到天数: 188 天

    连续签到: 1 天

    [LV.7]常住居民III

     楼主| 发表于 2014-1-16 13:36:55 | 显示全部楼层
    熬夜到凌晨1点,发的帖子不够严谨,还多包涵
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2017-12-1 15:13
  • 签到天数: 188 天

    连续签到: 1 天

    [LV.7]常住居民III

     楼主| 发表于 2014-1-16 13:39:46 | 显示全部楼层
    fj1161 发表于 2014-1-16 08:04
    顶一个~~~~~~~~~

    多谢~~,新手,望支持
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2017-12-1 15:13
  • 签到天数: 188 天

    连续签到: 1 天

    [LV.7]常住居民III

     楼主| 发表于 2014-1-16 13:40:48 | 显示全部楼层
    shen2008jie 发表于 2014-1-16 10:39
    感觉你是个不错的,高级屌丝哦。赞一个吧。

    一块进步哈,加油了,向着高级屌丝前进........
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2017-12-1 15:13
  • 签到天数: 188 天

    连续签到: 1 天

    [LV.7]常住居民III

     楼主| 发表于 2014-1-16 13:41:44 | 显示全部楼层
    dushanwu 发表于 2014-1-16 09:52
    学习ing……

    多谢~~,新手,望支持
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-5-19 21:39 , Processed in 0.222338 second(s), 33 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.