楼主: hill123

关于OpenSDA和KL25Z的I2C的问题

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

    连续签到: 1 天

    [LV.7]常住居民III

     楼主| 发表于 2014-1-16 13:42:30 | 显示全部楼层
    分享到:
    wudianjun2001 发表于 2014-1-16 08:58
    看看。。。。。

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

    使用道具 举报

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

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 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信号线上就是有上拉电阻的。
    回复 支持 反对

    使用道具 举报

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

    连续签到: 1 天

    [LV.9]以坛为家II

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

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

    使用道具 举报

  • 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卡死不工作的现象。
    回复 支持 反对

    使用道具 举报

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

    连续签到: 1 天

    [LV.7]常住居民III

     楼主| 发表于 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的调试接口没有连接!!所以不存在冲突问题~
    回复 支持 反对

    使用道具 举报

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

    连续签到: 1 天

    [LV.9]以坛为家II

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

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

    使用道具 举报

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

    连续签到: 1 天

    [LV.7]常住居民III

     楼主| 发表于 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貌似没有这个问题。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-9-20 15:14
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2014-1-18 14:38:02 | 显示全部楼层
    赞~~~学习ing
    回复 支持 反对

    使用道具 举报

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

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 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的可能性不是没有,但一般仅存在这种理论的可能,尤其是像这样已经发布了将近两年的产品。像我们这样的软件开发者,贸然怀疑硬件的设计,不仅仅是在不能保证代码正确的前提下发现一些现象,还需要提供令人充分信服的理由,否则多少有点不负责任。我看你用的代码也不是官方的参考代码,建议从官网上下验证代码,或者用最基本的寄存器操作验证功能。
    回复 支持 反对

    使用道具 举报

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

    连续签到: 1 天

    [LV.9]以坛为家II

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

    还有,我在"MSP430"板块里发过关于SPI接口输入信号线上电平浮动的问题,因为它的引脚没有内部上拉电阻,需要在外部电路上附加一个上拉电阻,而KL25上的Pin可以配置内部上拉或下拉电阻并且可以配置增强驱动开关,不需要外置辅助电路就可以搞定,这些在参考手册里都有说明。还有关于配置端口顺序的问题,如果这个引脚控制的是个导弹开关,如果编程的时候没有在设定引脚复用功能之前预设正确的电平,在系统初始化的过程中不小心启动了导弹发射程序,这就是要命的事情了。类似这些东西,任何一家芯片厂都不可能专门放到文档里说明,因为人家只是做芯片的,不可能覆盖到所有的应用程序。关于这些,纯粹是经验的东西,不能总是等着别人把所有的东西都写清楚,是需要自己多实践,多思考的。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-11-29 14:54 , Processed in 0.186994 second(s), 31 queries , MemCache On.

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

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.