找回密码
 立即注册
楼主: Allspace

8H/8G 的I2C还需要外部上拉电阻吗?

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-02-29 15:49:17

15

主题

27

回帖

143

积分

注册会员

积分
143
发表于 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. }
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

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


截图202402132158211454.jpg



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-02-29 15:49:17

15

主题

27

回帖

143

积分

注册会员

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

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


截图202402132206459231.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-02-29 15:49:17

15

主题

27

回帖

143

积分

注册会员

积分
143
发表于 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. }       
复制代码

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

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



截图202402140747252163.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-02-29 15:49:17

15

主题

27

回帖

143

积分

注册会员

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

点评

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

使用道具 举报 送花

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

110

主题

2219

回帖

5452

积分

版主

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

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 04:25 , Processed in 0.128097 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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