查看: 3152|回复: 8

[已解决] i2c_wait()出不来(已解决)

[复制链接]

该用户从未签到

4

主题

27

帖子

0

注册会员

Rank: 2

积分
124
最后登录
2015-9-14
发表于 2014-11-28 10:13:47 | 显示全部楼层 |阅读模式
本帖最后由 FSL_TICS_ZJJ 于 2014-12-2 09:18 编辑

程序死在 i2c_wait()里是怎么回事呢?

void i2c_wait(I2Cn_e i2cn){
    while(( I2C_S_REG(I2CN[i2cn]) & I2C_S_IICIF_MASK)==0) ;
    I2C_S_REG(I2CN[i2cn]) |= I2C_S_IICIF_MASK;
}

上电后,程序可以正常运行1到2次,然后会死在i2c_wait里,这是咋回事呢?

我知道答案 目前已有8人回答
回复

使用道具 举报

  • TA的每日心情
    开心
    2018-7-2 06:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    59

    主题

    2888

    帖子

    10

    金牌会员

    Rank: 6Rank: 6

    积分
    6020
    最后登录
    2020-9-28
    发表于 2014-11-28 10:45:00 | 显示全部楼层
    楼主你好
    请问你使用的哪个例程?
    芯片的具体型号是多少?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    27

    帖子

    0

    注册会员

    Rank: 2

    积分
    124
    最后登录
    2015-9-14
     楼主| 发表于 2014-11-28 12:33:06 | 显示全部楼层
    FSL_TICS_Robin 发表于 2014-11-28 10:45
    楼主你好
    请问你使用的哪个例程?
    芯片的具体型号是多少?

    就是在坛子里找的例程,和KL25 开发板上三轴加速度计的也是一样的,我的芯片是KL15。
    我这边调试了两个I2C外设,已经调试好一个了,现在调第二个,我想I2C的驱动应该是没有问题的,要不然第一个外设也会有问题。
    看参考手册上,I2C_S_IICIF 应该是中断标志,然后下面还有好多解释,看不明白。
    我的I2C初始化是这样的:(省略了管脚初始化)
    I2C_F_REG(I2CN[i2cn])  = 0x3f;        
    I2C_C1_REG(I2CN[i2cn]) = 0x80;
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    27

    帖子

    0

    注册会员

    Rank: 2

    积分
    124
    最后登录
    2015-9-14
     楼主| 发表于 2014-12-1 09:10:36 | 显示全部楼层
    问题描述清楚了吗?哪位大虾给讲讲,什么情况下会导致i2c_wait()死等。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
    发表于 2014-12-1 11:21:01 | 显示全部楼层
    liarlaker 发表于 2014-12-1 09:10
    问题描述清楚了吗?哪位大虾给讲讲,什么情况下会导致i2c_wait()死等。

    楼主你好!
    你说你发一两次成功,后面就卡住了。
    你有没有测试下通信的波形,看看再什么时序段给卡了,顺便把波形上传。
    一般是要等数据发出之后,这个位会置上,现在从情况上看,应该是数据没有发成功。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    27

    帖子

    0

    注册会员

    Rank: 2

    积分
    124
    最后登录
    2015-9-14
     楼主| 发表于 2014-12-1 11:47:12 | 显示全部楼层
    波形看了,就是在i2c_stop之前的一个i2c_wait里卡住了,是数据接收将要结束的时候

            i2c_start(MS5637);
            i2c_write_byte(MS5637,MS5637_I2C_ADR_R);        //读地址               
            i2c_wait(MS5637);
            i2c_get_ack(MS5637);
           
            delay_ms(5);
           
            i2c_set_rx_mode(MS5637);       
            i2c_give_ack(MS5637);
            data[0] = i2c_read_byte(MS5637);
            i2c_wait(MS5637);
            data[0] = i2c_read_byte(MS5637);
            i2c_wait(MS5637);
            data[1] = i2c_read_byte(MS5637);
            i2c_wait(MS5637); ----卡在这个地方
           
            i2c_stop(MS5637);
            data[2] = i2c_read_byte(MS5637);
           
            delay_ms(5);
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    27

    帖子

    0

    注册会员

    Rank: 2

    积分
    124
    最后登录
    2015-9-14
     楼主| 发表于 2014-12-1 11:48:30 | 显示全部楼层
    是不是我少了总线判忙啊?应该怎么加上去呢?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    27

    帖子

    0

    注册会员

    Rank: 2

    积分
    124
    最后登录
    2015-9-14
     楼主| 发表于 2014-12-2 09:00:20 | 显示全部楼层
    问题解决了,需要加总线判忙,谢谢各位的回复。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
    发表于 2014-12-2 09:18:41 | 显示全部楼层
    liarlaker 发表于 2014-12-2 09:00
    问题解决了,需要加总线判忙,谢谢各位的回复。

    好的,感谢分享解决方案!
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-20 16:51 , Processed in 0.101985 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表