Allspace
发表于 2024-2-13 21:56:52
void iic_master_init()
{
//P3M0 |= 0x0c; P3M1 |= 0x0c; //开漏输出:P3_2和P3_3 (I2C引脚在空闲状态下电压为0.1v左右)
P3M0 &= ~0x0c; P3M1 &= ~0x0c; //准双向IO:P3_2和P3_3(I2C引脚在空闲状态下电压为3.3v左右)
P3PU |= 0x0c; //使能P3_2和P3_3的上拉电阻
P_SW2 &= (~0x30); //I2C: I2CSCL(P3.2), I2CSDA(P3.3)
I2CCFG = 0xe0; //使能IIC主机模式
I2CMSST = 0x00; //IIC主机状态寄存器清零
EA = 1;
}
把I2C引脚改成“准双向IO”后,引脚在空闲状态下的电压是高电平了。这至少从空闲状态的角度是正确的了。
但是在发送START命令后,I2CMSST的中断位仍然始终为0. 此时测量I2C引脚电压,仍然是高电平。说明I2C控制器确实没有执行START命令。代码如下:
void hardiic_wait()
{
while(!(I2CMSST &0x40));
I2CMSST &= ~0x40;
}
void hardiic_start()
{
I2CMSCR = 0x01; //发送START命令
uart1_putstr("Test5\r\n");
hardiic_wait();
uart1_putstr("Test3\r\n");
}
神农鼎
发表于 2024-2-13 21:58:59
设置 EAXFR 为 1/允许访问扩展的XFR特殊功能寄存器 后,
不要再设置EAXFR 为 0/关闭允许访问扩展的XFR特殊功能寄存器
====有些朋友在这吃了亏,访问 XFR, 但遗漏了要打开允许访问 XFR
Allspace
发表于 2024-2-13 22:04:24
神农鼎 发表于 2024-2-13 21:58
EAXFR 设置为 1/允许访问扩展的XFR特殊功能寄存器 后,
不要再置 0/关闭允许访问扩展的XFR特殊功能寄存器
= ...
P_SW2 &= (~0x30); 这段代码只是将B5和B4位清零,并没有碰B7啊。 (另外硬件电路里也没有使用外部扩展RAM)
神农鼎
发表于 2024-2-13 22:06:33
初始化设置 EAXFR 为 1/允许访问扩展的XFR特殊功能寄存器 后,
不要再设置EAXFR 为 0/关闭允许访问扩展的XFR特殊功能寄存器
====有些朋友在这吃了亏,需要访问 XFR, 但遗漏了要打开允许访问 XFR
Allspace
发表于 2024-2-13 22:27:41
非常感谢,确实,只要P_SW2 |= 0x80,START命令就可以正常被执行了。
但在随后发送从机地址的时候,再次遇到I2CMSST的中断位始终为0的问题。代码如下:
void hardiic_wait()
{
while(!(I2CMSST &0x40));
I2CMSST &= ~0x40;
}
void hardiic_send_byte(uint8 iic_data)
{
I2CTXD = iic_data;
I2CMSCR = 0x02;
uart1_putstr("hardiic_send_byte done\r\n");
hardiic_wait();//程序在此处持续等待
uart1_putstr("hardiic_send_byte hardiic_wait done\r\n");
}
神农鼎
发表于 2024-2-13 22:41:06
老办法,用仿真来帮忙找错误
仿真 STC8 系列 MCU,用 STC-USB Link1D 全自动仿真/脱机下载 工具 ! 有视频讲解 - 仿真/编译器/头文件 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
神农鼎
发表于 2024-2-13 22:42:58
老办法,用仿真来帮忙找错误
仿真STC8系列MCU,用【一箭双雕之USB转双串口/全自动烧录器】 - 仿真/编译器/头文件 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
神农鼎
发表于 2024-2-14 07:49:34
研发放假中,可以先测试下面的代码,2024/2/2的数据手册
尽量和他一致,除了 I2C 管脚在哪个位置的设置
Allspace
发表于 2024-2-14 09:55:39
使用示例程序做仿真的结果是一样的:程序会在START之后第一次发送数据(也就是从机地址)的时候,因为(I2CMSST & 0x40)不置位而陷入死循环。
王昱顺
发表于 2024-2-14 09:58:06
Allspace 发表于 2024-2-14 09:55
使用示例程序做仿真的结果是一样的:程序会在START之后第一次发送数据(也就是从机地址)的时候,因为(I2CM ...
考虑一下是否是从机未响应,之前自己做了一个小的IIC转UART通讯工具,使用官方库。
会发现如果IIC从机(也是自己做的)仿真暂停的时候(此时CPU不响应IIC从机中断),会卡住主机那边的串口输出。
你看我这个经历是否对你有所帮助