czdspeed 发表于 2024-3-6 11:04:21

初始化了P5.0端口后, I2C总线进不了中断了,请问一下有什么原因会导致这个问题

各位工程师:

      我这里用stc8g1k08pin做的一个控制器,要简单接收红外并和安卓端连接。
      单独调红外和i2c接口都通了,和代码的时候发现只要把IO (主要是P5.4 按键输入P5.5 推挽输出)一初始化,I2C(用的P3.2 3.3)就进不了中断了。我们这里硬件这两个口压根没连着。
      请教一下各位,下面应该怎么去查。

王昱顺 发表于 2024-3-6 11:21:43

可以尝试用仿真找一找问题,我看了看你的代码。但是没有看出有什么很大的问题来。
估计要连接到实物上进行仿真才能知道了。

czdspeed 发表于 2024-3-6 11:24:51

王昱顺 发表于 2024-3-6 11:21
可以尝试用仿真找一找问题,我看了看你的代码。但是没有看出有什么很大的问题来。
估计要连接到实物上进行 ...

谢谢您,我连着仿真看了,加上了IO就出问题。关掉就能接到安卓数据了。确实没想通咋回事的。那个IO还蛮重要的是检测开关机并控制设备关机的。

另外请问一下 P_SW2 = 0x80; 这个功能切换的能注释掉吗,后面因为I2C要改成P_SW2 &= ~0x30;

王昱顺 发表于 2024-3-6 11:38:30

czdspeed 发表于 2024-3-6 11:24
谢谢您,我连着仿真看了,加上了IO就出问题。关掉就能接到安卓数据了。确实没想通咋回事的。那个IO还蛮重 ...

不可以的
P_SW2=0x80是打开XFR访问,就是访问一些外设的寄存器要必须打开
可以使用P_SW2 |= 0x80;这样不会对其他位造成影响。
此时再使用P_SW2 &= ~0x30;就没有问题了
P_SW2 &= ~0x30;这句是对bit4和bit5置0,不会操作其他位的

王昱顺 发表于 2024-3-6 11:40:56

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)

czdspeed 发表于 2024-3-6 15:15:42

用逻辑分析仪又抓了一下,加了IO初始化以后,接到addr的数据后面的data没接到。然后在按照你们说的在start后面把设备地址标志为1了,但是没有改善。

czdspeed 发表于 2024-3-6 15:16:03

王昱顺 发表于 2024-3-6 11:40
IIC需要注意的是对于Stop部分的响应。具体可以参考这个文章
STC8 I2C从机,示例代码跑起有点bug,提一点 ...

用逻辑分析仪又抓了一下,加了IO初始化以后,接到addr的数据后面的data没接到。然后在按照你们说的在start后面把设备地址标志为1了,但是没有改善。

截图我贴在其他回复里面。

乘风飞扬 发表于 2024-3-7 10:19:58

czdspeed 发表于 2024-3-6 15:16
用逻辑分析仪又抓了一下,加了IO初始化以后,接到addr的数据后面的data没接到。然后在按照你们说的在star ...

IO初始化代码看起来没什么问题,只是加了100ms延时,会增加上电初始化时间,如果这段时间主机发送指令过来就收不到了。
附件是一套I2C主从收发测试的例子,供参考:





czdspeed 发表于 2024-3-7 15:55:52

乘风飞扬 发表于 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;

乘风飞扬 发表于 2024-3-7 16:55:43

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
查看完整版本: 初始化了P5.0端口后, I2C总线进不了中断了,请问一下有什么原因会导致这个问题