I2C通讯问题
大家好,单片机启动I2C通讯后就一直停留在这while语句这里了,这是什么原因?I2C操作命令没有执行完成。检查初始化程序,是否正常初始化了I2C。
根据程序中不要使用死等的原则,增加超时错误处理吧。 梁工 发表于 2023-3-23 12:15
I2C操作命令没有执行完成。检查初始化程序,是否正常初始化了I2C。
根据程序中不要使用死等的原则,增加超 ...
梁工,I2C有初始化了,初始化程序如下:
梁工 发表于 2023-3-23 12:15
I2C操作命令没有执行完成。检查初始化程序,是否正常初始化了I2C。
根据程序中不要使用死等的原则,增加超 ...
我通过按键复位烧录程序,烧录程序进去后单片机就停留在这里了,如果给单片机断电然后再上电,单片机就不会一直停在这里了,这是什么原因? 980578873 发表于 2023-3-23 14:16
我通过按键复位烧录程序,烧录程序进去后单片机就停留在这里了,如果给单片机断电然后再上电,单片机就不 ...
重新上电正常就可以了,烧录后不断电的运行情况,我没法深究,不考虑。 梁工 发表于 2023-3-23 12:15
I2C操作命令没有执行完成。检查初始化程序,是否正常初始化了I2C。
根据程序中不要使用死等的原则,增加超 ...
梁工,如果增加超时检测,那要等多久就跳出while语句呢? 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;
}
梁工 发表于 2023-3-23 16:06
我一般如此:
/********** 等待操作完成 *************/
void Wait(void)
梁工,看你发的测试程序《00-硬件I2C主机发送简单测试》有些疑问:为什么在如下这些函数开头都加上EAXSFR();//访问XSFR
I2C初始化函数
I2C开始函数
I2C结束函数
I2C写一个字节的函数
然后在这些函数的结尾又加上EAXRAM();//访问XDATA
开头不加EAXSFR();结尾EAXRAM();会有什么问题,谢谢? 980578873 发表于 2023-3-23 17:28
梁工,看你发的测试程序《00-硬件I2C主机发送简单测试》有些疑问:为什么在如下这些函数开头都加上EAXSFR ...
访问扩展特殊功能寄存器前要将P_SW2最高位置1,EAXSFR()是一个宏,就是做这个的。
如果不允许,则访问扩展寄存器无效,就会出现你说的问题。
其实在程序一开始就执行P_SW2 |= 0x80;后面不清0,就不用重复置1. 梁工 发表于 2023-3-23 22:26
访问扩展特殊功能寄存器前要将P_SW2最高位置1,EAXSFR()是一个宏,就是做这个的。
如果不允许,则访问扩 ...
好的,明白了,我现在是这样设计I2C初始化前就执行P_SW2 |= 0x80;我后面都不对P_SW2的EAXSFR位清0,这样设计应该也没有问题吧?
页:
[1]
2