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从机中断),会卡住主机那边的串口输出。
你看我这个经历是否对你有所帮助
页: 1 2 [3] 4 5
查看完整版本: 8H/8G 的I2C还需要外部上拉电阻吗?