找回密码
 立即注册
查看: 1348|回复: 14

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

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2024-05-13 10:00:16

7

主题

16

回帖

161

积分

注册会员

积分
161
发表于 2024-3-6 11:04:21 | 显示全部楼层 |阅读模式
各位工程师:

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

原理图

原理图

代码示意图

代码示意图

IIC_RF.c

13.81 KB, 下载次数: 85

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2024-3-6 11:21:43 | 显示全部楼层
可以尝试用仿真找一找问题,我看了看你的代码。但是没有看出有什么很大的问题来。
估计要连接到实物上进行仿真才能知道了。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2024-05-13 10:00:16

7

主题

16

回帖

161

积分

注册会员

积分
161
发表于 2024-3-6 11:24:51 | 显示全部楼层
王*** 发表于 2024-3-6 11:21
可以尝试用仿真找一找问题,我看了看你的代码。但是没有看出有什么很大的问题来。
估计要连接到实物上进行 ...

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

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

点评

IIC需要注意的是对于Stop部分的响应。具体可以参考这个文章 STC8 I2C从机,示例代码跑起有点bug,提一点修改建议 - SPI/I2S/I2C,DMA支持的3组SPI和I2C,一线制温湿度传感器 - 国芯论坛-STC全球32位8051爱好者互助交  详情 回复 发表于 2024-3-6 11:40
不可以的 P_SW2=0x80是打开XFR访问,就是访问一些外设的寄存器要必须打开 可以使用P_SW2 |= 0x80;这样不会对其他位造成影响。 此时再使用P_SW2 &= ~0x30;就没有问题了 P_SW2 &= ~0x30;这句是对bit4和bit5置0,不会操  详情 回复 发表于 2024-3-6 11:38
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2024-3-6 11:38:30 | 显示全部楼层
czds*** 发表于 2024-3-6 11:24
谢谢您,我连着仿真看了,加上了IO就出问题。关掉就能接到安卓数据了。确实没想通咋回事的。那个IO还蛮重 ...

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2024-3-6 11:40:56 | 显示全部楼层
czds*** 发表于 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)

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2024-05-13 10:00:16

7

主题

16

回帖

161

积分

注册会员

积分
161
发表于 2024-3-6 15:15:42 | 显示全部楼层
用逻辑分析仪又抓了一下,加了IO初始化以后,接到addr的数据后面的data没接到。然后在按照你们说的在start后面把设备地址标志为1了,但是没有改善。
截图202403061512539334.jpg
截图202403061513127787.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2024-05-13 10:00:16

7

主题

16

回帖

161

积分

注册会员

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

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

截图我贴在其他回复里面。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2024-3-7 10:19:58 | 显示全部楼层
czds*** 发表于 2024-3-6 15:16
用逻辑分析仪又抓了一下,加了IO初始化以后,接到addr的数据后面的data没接到。然后在按照你们说的在star ...

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


I2C主从收发测试.zip (85.09 KB, 下载次数: 92)


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2024-05-13 10:00:16

7

主题

16

回帖

161

积分

注册会员

积分
161
发表于 2024-3-7 15:55:52 | 显示全部楼层
乘风*** 发表于 2024-3-7 10:19
IO初始化代码看起来没什么问题,只是加了100ms延时,会增加上电初始化时间,如果这段时间主机发送指令过 ...

这个代码整体搬过去和之前现象一样的,我又对比了工具生成的有几个地方不太清楚。

1.    I2CCFG = 0x80;                              //使能I2C从机模式
工具的上配置的是I2CCFG = 0x81;

2.另外这个p3.2  3.3这两个IO应该设置成双向吧,为啥参考代码改成了开漏输出

3.还有这个
void I2C_Isr() interrupt 24
{
    char store;
   
    store = P_SW2;
    P_SW2 |= 0x80;
.....
这里P_SW2  是不是应该改成 P_SW2 |= 0x30;
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2024-3-7 16:55:43 | 显示全部楼层
czds*** 发表于 2024-3-7 15:55
这个代码整体搬过去和之前现象一样的,我又对比了工具生成的有几个地方不太清楚。

1.    I2CCFG = 0x80; ...

1. I2C从机模式没必要设置SPEED参数
截图202403071642388547.jpg

2. I2C从机模式可以设置开漏输出模式,减少从机对电平的影响,通过上拉电阻来拉高脚位电平。

3. 以下代码用于在中断里开启扩展寄存器访问使能,I2C寄存器是扩展寄存器,需要开启扩展寄存器访问使能后才能对寄存器进行读写操作。
如果程序起始位置开启扩展寄存器访问使能后没有再关闭,这些代码可以删除:
  1.     char store;
  2.     store = P_SW2;
  3.     P_SW2 |= 0x80;
  4.     ......
  5.     P_SW2 = store;
复制代码

至于 P_SW2 |= 0x30; 是将I2C功能脚切换到 P3.2,P3.3,在程序初始化时设置一次就可以。
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-5-2 04:11 , Processed in 0.154922 second(s), 110 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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