找回密码
 立即注册
查看: 1255|回复: 17

I2C通讯问题

[复制链接]
  • TA的每日心情

    2023-12-25 15:38
  • 签到天数: 1 天

    [LV.1]初来乍到

    39

    主题

    204

    回帖

    651

    积分

    高级会员

    积分
    651
    发表于 2023-3-23 12:10:25 | 显示全部楼层 |阅读模式
    大家好,单片机启动I2C通讯后就一直停留在这while语句这里了,这是什么原因?

    I2C通讯问题-1.png
    回复 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    3044

    回帖

    6863

    积分

    超级版主

    积分
    6863
    发表于 2023-3-23 12:15:29 | 显示全部楼层
    I2C操作命令没有执行完成。检查初始化程序,是否正常初始化了I2C。
    根据程序中不要使用死等的原则,增加超时错误处理吧。
  • TA的每日心情

    2023-12-25 15:38
  • 签到天数: 1 天

    [LV.1]初来乍到

    39

    主题

    204

    回帖

    651

    积分

    高级会员

    积分
    651
     楼主| 发表于 2023-3-23 13:57:04 | 显示全部楼层
    梁工 发表于 2023-3-23 12:15
    I2C操作命令没有执行完成。检查初始化程序,是否正常初始化了I2C。
    根据程序中不要使用死等的原则,增加超 ...



    梁工,I2C有初始化了,初始化程序如下:
    1.png
    2.png


  • TA的每日心情

    2023-12-25 15:38
  • 签到天数: 1 天

    [LV.1]初来乍到

    39

    主题

    204

    回帖

    651

    积分

    高级会员

    积分
    651
     楼主| 发表于 2023-3-23 14:16:09 | 显示全部楼层
    梁工 发表于 2023-3-23 12:15
    I2C操作命令没有执行完成。检查初始化程序,是否正常初始化了I2C。
    根据程序中不要使用死等的原则,增加超 ...

    我通过按键复位烧录程序,烧录程序进去后单片机就停留在这里了,如果给单片机断电然后再上电,单片机就不会一直停在这里了,这是什么原因?

    点评

    重新上电正常就可以了,烧录后不断电的运行情况,我没法深究,不考虑。  详情 回复 发表于 2023-3-23 14:51

    该用户从未签到

    46

    主题

    3044

    回帖

    6863

    积分

    超级版主

    积分
    6863
    发表于 2023-3-23 14:51:38 | 显示全部楼层
    980578873 发表于 2023-3-23 14:16
    我通过按键复位烧录程序,烧录程序进去后单片机就停留在这里了,如果给单片机断电然后再上电,单片机就不 ...

    重新上电正常就可以了,烧录后不断电的运行情况,我没法深究,不考虑。
  • TA的每日心情

    2023-12-25 15:38
  • 签到天数: 1 天

    [LV.1]初来乍到

    39

    主题

    204

    回帖

    651

    积分

    高级会员

    积分
    651
     楼主| 发表于 2023-3-23 15:04:07 | 显示全部楼层
    梁工 发表于 2023-3-23 12:15
    I2C操作命令没有执行完成。检查初始化程序,是否正常初始化了I2C。
    根据程序中不要使用死等的原则,增加超 ...

    梁工,如果增加超时检测,那要等多久就跳出while语句呢?

    点评

    我一般如此: /********** 等待操作完成 *************/ void Wait(void) { u16 i; for(i=0; i  详情 回复 发表于 2023-3-23 16:06

    该用户从未签到

    46

    主题

    3044

    回帖

    6863

    积分

    超级版主

    积分
    6863
    发表于 2023-3-23 16:06:50 | 显示全部楼层
    980578873 发表于 2023-3-23 15:04
    梁工,如果增加超时检测,那要等多久就跳出while语句呢?

    我一般如此:
    /********** 等待操作完成 *************/
    void        Wait(void)
    {
            u16        i;
            for(i=0; i<1000; i++)
            {
                    if((I2CMSST & 0x40) != 0)        break;
            }
            I2CMSST &= ~0x40;
    }
  • TA的每日心情

    2023-12-25 15:38
  • 签到天数: 1 天

    [LV.1]初来乍到

    39

    主题

    204

    回帖

    651

    积分

    高级会员

    积分
    651
     楼主| 发表于 2023-3-23 17:28:58 | 显示全部楼层
    梁工 发表于 2023-3-23 16:06
    我一般如此:
    /********** 等待操作完成 *************/
    void        Wait(void)

    梁工,看你发的测试程序《00-硬件I2C主机发送简单测试》有些疑问:为什么在如下这些函数开头都加上EAXSFR();//访问XSFR

    I2C初始化函数
    I2C开始函数
    I2C结束函数
    I2C写一个字节的函数
    然后在这些函数的结尾又加上EAXRAM();//访问XDATA

    开头不加EAXSFR();结尾EAXRAM();会有什么问题,谢谢?

    点评

    访问扩展特殊功能寄存器前要将P_SW2最高位置1,EAXSFR()是一个宏,就是做这个的。 如果不允许,则访问扩展寄存器无效,就会出现你说的问题。 其实在程序一开始就执行P_SW2 |= 0x80;后面不清0,就不用重复置1.  详情 回复 发表于 2023-3-23 22:26

    该用户从未签到

    46

    主题

    3044

    回帖

    6863

    积分

    超级版主

    积分
    6863
    发表于 2023-3-23 22:26:33 | 显示全部楼层
    980578873 发表于 2023-3-23 17:28
    梁工,看你发的测试程序《00-硬件I2C主机发送简单测试》有些疑问:为什么在如下这些函数开头都加上EAXSFR ...

    访问扩展特殊功能寄存器前要将P_SW2最高位置1,EAXSFR()是一个宏,就是做这个的。
    如果不允许,则访问扩展寄存器无效,就会出现你说的问题。
    其实在程序一开始就执行P_SW2 |= 0x80;后面不清0,就不用重复置1.
  • TA的每日心情

    2023-12-25 15:38
  • 签到天数: 1 天

    [LV.1]初来乍到

    39

    主题

    204

    回帖

    651

    积分

    高级会员

    积分
    651
     楼主| 发表于 2023-3-24 09:28:29 | 显示全部楼层
    梁工 发表于 2023-3-23 22:26
    访问扩展特殊功能寄存器前要将P_SW2最高位置1,EAXSFR()是一个宏,就是做这个的。
    如果不允许,则访问扩 ...

    好的,明白了,我现在是这样设计I2C初始化前就执行P_SW2 |= 0x80;我后面都不对P_SW2的EAXSFR位清0,这样设计应该也没有问题吧?

    点评

    就是这个意思。我给你的例程正常吧?  详情 回复 发表于 2023-3-24 09:56
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-20 02:00 , Processed in 0.244491 second(s), 81 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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