找回密码
 立即注册
查看: 219|回复: 13

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

[复制链接]
  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 20 天

    [LV.4]偶尔看看III

    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, 下载次数: 3

    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 121 天

    [LV.7]常住居民III

    33

    主题

    397

    回帖

    2040

    积分

    荣誉版主

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

    使用道具 举报

  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 20 天

    [LV.4]偶尔看看III

    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
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 121 天

    [LV.7]常住居民III

    33

    主题

    397

    回帖

    2040

    积分

    荣誉版主

    积分
    2040
    发表于 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,不会操作其他位的
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 121 天

    [LV.7]常住居民III

    33

    主题

    397

    回帖

    2040

    积分

    荣誉版主

    积分
    2040
    发表于 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)

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 20 天

    [LV.4]偶尔看看III

    7

    主题

    16

    回帖

    161

    积分

    注册会员

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

    使用道具 举报

  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 20 天

    [LV.4]偶尔看看III

    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了,但是没有改善。

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

    使用道具 举报

  • TA的每日心情
    奋斗
    11 小时前
  • 签到天数: 143 天

    [LV.7]常住居民III

    27

    主题

    1343

    回帖

    4187

    积分

    论坛元老

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

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


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


    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 20 天

    [LV.4]偶尔看看III

    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;
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    11 小时前
  • 签到天数: 143 天

    [LV.7]常住居民III

    27

    主题

    1343

    回帖

    4187

    积分

    论坛元老

    积分
    4187
    发表于 2024-3-7 16:55:43 | 显示全部楼层
    czdspeed 发表于 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, 2024-5-17 20:07 , Processed in 0.083188 second(s), 69 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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