找回密码
 立即注册
楼主: Alls***

STC8G的I2C还需要外部上拉电阻吗?

[复制链接]
  • TA的每日心情
    开心
    2024-2-29 15:49
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    8

    主题

    18

    回帖

    94

    积分

    注册会员

    积分
    94
     楼主| 发表于 2024-2-13 21:56:52 | 显示全部楼层
    1. void iic_master_init()
    2. {
    3.     //P3M0 |= 0x0c; P3M1 |= 0x0c;          //开漏输出:P3_2和P3_3 (I2C引脚在空闲状态下电压为0.1v左右)
    4.     P3M0 &= ~0x0c; P3M1 &= ~0x0c;         //准双向IO:P3_2和P3_3  (I2C引脚在空闲状态下电压为3.3v左右)
    5.     P3PU |= 0x0c;                         //使能P3_2和P3_3的上拉电阻
    6.     P_SW2 &= (~0x30);                                  //I2C: I2CSCL(P3.2), I2CSDA(P3.3)
    7.     I2CCFG = 0xe0;                        //使能IIC主机模式
    8.     I2CMSST = 0x00;                       //IIC主机状态寄存器清零
    9.     EA = 1;
    10. }
    复制代码


    把I2C引脚改成“准双向IO”后,引脚在空闲状态下的电压是高电平了。这至少从空闲状态的角度是正确的了。
    但是在发送START命令后,I2CMSST的中断位仍然始终为0. 此时测量I2C引脚电压,仍然是高电平。说明I2C控制器确实没有执行START命令。代码如下:
    1. void hardiic_wait()
    2. {
    3.     while(!(I2CMSST &0x40));
    4.     I2CMSST &= ~0x40;
    5. }
    6. void hardiic_start()
    7. {
    8.     I2CMSCR = 0x01;                         //发送START命令
    9.     uart1_putstr("Test5\r\n");
    10.     hardiic_wait();
    11.     uart1_putstr("Test3\r\n");
    12. }
    复制代码
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    552

    主题

    9497

    回帖

    1万

    积分

    管理员

    积分
    14069
    发表于 2024-2-13 21:58:59 | 显示全部楼层
              设置 EAXFR 为 1/允许访问扩展的XFR特殊功能寄存器 后,
    不要再EAXFR 0/关闭允许访问扩展的XFR特殊功能寄存器
    ====有些朋友在这吃了亏,访问 XFR, 但遗漏了要打开允许访问 XFR


    截图202402132158211454.jpg



    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-2-29 15:49
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    8

    主题

    18

    回帖

    94

    积分

    注册会员

    积分
    94
     楼主| 发表于 2024-2-13 22:04:24 | 显示全部楼层
    神农鼎 发表于 2024-2-13 21:58
    EAXFR 设置为 1/允许访问扩展的XFR特殊功能寄存器 后,
    不要再置 0/关闭允许访问扩展的XFR特殊功能寄存器
    = ...
    1. P_SW2 &= (~0x30);
    复制代码
    这段代码只是将B5和B4位清零,并没有碰B7啊。 (另外硬件电路里也没有使用外部扩展RAM)
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    552

    主题

    9497

    回帖

    1万

    积分

    管理员

    积分
    14069
    发表于 2024-2-13 22:06:33 | 显示全部楼层
    初始化设置 EAXFR 为 1/允许访问扩展的XFR特殊功能寄存器 后,
    不要再EAXFR 0/关闭允许访问扩展的XFR特殊功能寄存器
    ====有些朋友在这吃了亏,需要访问 XFR, 但遗漏了要打开允许访问 XFR


    截图202402132206459231.jpg
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-2-29 15:49
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    8

    主题

    18

    回帖

    94

    积分

    注册会员

    积分
    94
     楼主| 发表于 2024-2-13 22:27:41 | 显示全部楼层
    非常感谢,确实,只要P_SW2 |= 0x80,START命令就可以正常被执行了。
    但在随后发送从机地址的时候,再次遇到I2CMSST的中断位始终为0的问题。代码如下:
    1. void hardiic_wait()
    2. {
    3.     while(!(I2CMSST &0x40));
    4.     I2CMSST &= ~0x40;
    5. }
    6. void hardiic_send_byte(uint8 iic_data)
    7. {
    8.     I2CTXD = iic_data;
    9.     I2CMSCR = 0x02;
    10.     uart1_putstr("hardiic_send_byte done\r\n");
    11.         hardiic_wait();  //程序在此处持续等待
    12.     uart1_putstr("hardiic_send_byte hardiic_wait done\r\n");
    13. }       
    复制代码

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    552

    主题

    9497

    回帖

    1万

    积分

    管理员

    积分
    14069
    发表于 2024-2-13 22:41:06 | 显示全部楼层
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    552

    主题

    9497

    回帖

    1万

    积分

    管理员

    积分
    14069
    发表于 2024-2-13 22:42:58 | 显示全部楼层
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    552

    主题

    9497

    回帖

    1万

    积分

    管理员

    积分
    14069
    发表于 2024-2-14 07:49:34 | 显示全部楼层
    研发放假中,可以先测试下面的代码,2024/2/2的数据手册
    尽量和他一致,除了 I2C 管脚在哪个位置的设置



    截图202402140747252163.jpg

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-2-29 15:49
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    8

    主题

    18

    回帖

    94

    积分

    注册会员

    积分
    94
     楼主| 发表于 2024-2-14 09:55:39 | 显示全部楼层
    使用示例程序做仿真的结果是一样的:程序会在START之后第一次发送数据(也就是从机地址)的时候,因为(I2CMSST & 0x40)不置位而陷入死循环。
    截图202402140951465718.jpg

    点评

    考虑一下是否是从机未响应,之前自己做了一个小的IIC转UART通讯工具,使用官方库。 会发现如果IIC从机(也是自己做的)仿真暂停的时候(此时CPU不响应IIC从机中断),会卡住主机那边的串口输出。 你看我这个经历是否  详情 回复 发表于 2024-2-14 09:58
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    33

    主题

    397

    回帖

    2044

    积分

    荣誉版主

    积分
    2044
    发表于 2024-2-14 09:58:06 | 显示全部楼层
    Allspace 发表于 2024-2-14 09:55
    使用示例程序做仿真的结果是一样的:程序会在START之后第一次发送数据(也就是从机地址)的时候,因为(I2CM ...

    考虑一下是否是从机未响应,之前自己做了一个小的IIC转UART通讯工具,使用官方库。
    会发现如果IIC从机(也是自己做的)仿真暂停的时候(此时CPU不响应IIC从机中断),会卡住主机那边的串口输出。
    你看我这个经历是否对你有所帮助
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-18 23:20 , Processed in 0.078456 second(s), 70 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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