找回密码
 立即注册
查看: 2351|回复: 18

I2C通讯问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

39

主题

204

回帖

651

积分

高级会员

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

I2C通讯问题-1.png
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2023-3-23 12:15:29 | 显示全部楼层
I2C操作命令没有执行完成。检查初始化程序,是否正常初始化了I2C。
根据程序中不要使用死等的原则,增加超时错误处理吧。
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

39

主题

204

回帖

651

积分

高级会员

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



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


  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

39

主题

204

回帖

651

积分

高级会员

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

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

点评

重新上电正常就可以了,烧录后不断电的运行情况,我没法深究,不考虑。  详情 回复 发表于 2023-3-23 14:51
  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

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

重新上电正常就可以了,烧录后不断电的运行情况,我没法深究,不考虑。
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

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
  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

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

我一般如此:
/********** 等待操作完成 *************/
void        Wait(void)
{
        u16        i;
        for(i=0; i<1000; i++)
        {
                if((I2CMSST & 0x40) != 0)        break;
        }
        I2CMSST &= ~0x40;
}
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

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
  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

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

访问扩展特殊功能寄存器前要将P_SW2最高位置1,EAXSFR()是一个宏,就是做这个的。
如果不允许,则访问扩展寄存器无效,就会出现你说的问题。
其实在程序一开始就执行P_SW2 |= 0x80;后面不清0,就不用重复置1.
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

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, 2025-5-2 06:38 , Processed in 0.128370 second(s), 111 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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