初始化了P5.0端口后, I2C总线进不了中断了,请问一下有什么原因会导致这个问题
各位工程师:我这里用stc8g1k08pin做的一个控制器,要简单接收红外并和安卓端连接。
单独调红外和i2c接口都通了,和代码的时候发现只要把IO (主要是P5.4 按键输入P5.5 推挽输出)一初始化,I2C(用的P3.2 3.3)就进不了中断了。我们这里硬件这两个口压根没连着。
请教一下各位,下面应该怎么去查。
可以尝试用仿真找一找问题,我看了看你的代码。但是没有看出有什么很大的问题来。
估计要连接到实物上进行仿真才能知道了。 王昱顺 发表于 2024-3-6 11:21
可以尝试用仿真找一找问题,我看了看你的代码。但是没有看出有什么很大的问题来。
估计要连接到实物上进行 ...
谢谢您,我连着仿真看了,加上了IO就出问题。关掉就能接到安卓数据了。确实没想通咋回事的。那个IO还蛮重要的是检测开关机并控制设备关机的。
另外请问一下 P_SW2 = 0x80; 这个功能切换的能注释掉吗,后面因为I2C要改成P_SW2 &= ~0x30; czdspeed 发表于 2024-3-6 11:24
谢谢您,我连着仿真看了,加上了IO就出问题。关掉就能接到安卓数据了。确实没想通咋回事的。那个IO还蛮重 ...
不可以的
P_SW2=0x80是打开XFR访问,就是访问一些外设的寄存器要必须打开
可以使用P_SW2 |= 0x80;这样不会对其他位造成影响。
此时再使用P_SW2 &= ~0x30;就没有问题了
P_SW2 &= ~0x30;这句是对bit4和bit5置0,不会操作其他位的 czdspeed 发表于 2024-3-6 11:24
谢谢您,我连着仿真看了,加上了IO就出问题。关掉就能接到安卓数据了。确实没想通咋回事的。那个IO还蛮重 ...
IIC需要注意的是对于Stop部分的响应。具体可以参考这个文章
STC8 I2C从机,示例代码跑起有点bug,提一点修改建议 - SPI/I2S/I2C,DMA支持的3组SPI和I2C,一线制温湿度传感器 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
用逻辑分析仪又抓了一下,加了IO初始化以后,接到addr的数据后面的data没接到。然后在按照你们说的在start后面把设备地址标志为1了,但是没有改善。 王昱顺 发表于 2024-3-6 11:40
IIC需要注意的是对于Stop部分的响应。具体可以参考这个文章
STC8 I2C从机,示例代码跑起有点bug,提一点 ...
用逻辑分析仪又抓了一下,加了IO初始化以后,接到addr的数据后面的data没接到。然后在按照你们说的在start后面把设备地址标志为1了,但是没有改善。
截图我贴在其他回复里面。 czdspeed 发表于 2024-3-6 15:16
用逻辑分析仪又抓了一下,加了IO初始化以后,接到addr的数据后面的data没接到。然后在按照你们说的在star ...
IO初始化代码看起来没什么问题,只是加了100ms延时,会增加上电初始化时间,如果这段时间主机发送指令过来就收不到了。
附件是一套I2C主从收发测试的例子,供参考:
乘风飞扬 发表于 2024-3-7 10:19
IO初始化代码看起来没什么问题,只是加了100ms延时,会增加上电初始化时间,如果这段时间主机发送指令过 ...
这个代码整体搬过去和之前现象一样的,我又对比了工具生成的有几个地方不太清楚。
1. I2CCFG = 0x80; //使能I2C从机模式
工具的上配置的是I2CCFG = 0x81;
2.另外这个p3.23.3这两个IO应该设置成双向吧,为啥参考代码改成了开漏输出
3.还有这个
void I2C_Isr() interrupt 24
{
char store;
store = P_SW2;
P_SW2 |= 0x80;
.....
这里P_SW2是不是应该改成 P_SW2 |= 0x30;
czdspeed 发表于 2024-3-7 15:55
这个代码整体搬过去和之前现象一样的,我又对比了工具生成的有几个地方不太清楚。
1. I2CCFG = 0x80; ...
1. I2C从机模式没必要设置SPEED参数
2. I2C从机模式可以设置开漏输出模式,减少从机对电平的影响,通过上拉电阻来拉高脚位电平。
3. 以下代码用于在中断里开启扩展寄存器访问使能,I2C寄存器是扩展寄存器,需要开启扩展寄存器访问使能后才能对寄存器进行读写操作。
如果程序起始位置开启扩展寄存器访问使能后没有再关闭,这些代码可以删除:
char store;
store = P_SW2;
P_SW2 |= 0x80;
......
P_SW2 = store;
至于 P_SW2 |= 0x30; 是将I2C功能脚切换到 P3.2,P3.3,在程序初始化时设置一次就可以。
页:
[1]
2