虚无 发表于 2025-8-26 17:44:19

硬件iic 发完start 没有进入忙标志 导致卡死 | 已解决

各位大神看看代码是否有问题主程序里面初始化了iic引脚配置的也是开漏   
void Wait()

{
    while (!(I2CMSST & 0x40));
    I2CMSST &= ~0x40;
}

void start()
{
    I2CMSCR = 0x01;                           //发送START命令
    Wait();
}

void sendData(char dat)
{
    I2CTXD = dat;                               //写数据到数据缓冲区
    I2CMSCR = 0x02;                           //发送SEND命令
    Wait();
    recvACK();
}

void recvACK()
{
    I2CMSCR = 0x03;                           //发送读ACK命令
    Wait();
}

char recvData()
{
    I2CMSCR = 0x04;                           //发送RECV命令
    Wait();
    return I2CRXD;
}

void sendACK()
{
    I2CMSST = 0x00;                           //设置ACK信号
    I2CMSCR = 0x05;                           //发送ACK命令
    Wait();
}

void sendNAK()
{
    I2CMSST = 0x01;                           //设置NAK信号
    I2CMSCR = 0x05;                           //发送ACK命令
    Wait();
}

void stop()
{
    I2CMSCR = 0x06;                           //发送STOP命令
    Wait();
}


void iic_init()
{

    P_SW2 = 0x80;
    I2CCFG = 0xc0;                              //使能I2C主机模式
    I2CCFG |=0X3E; //IIC总线速度等于Fosc/2/(MSSPEED*2+4)
    I2CMSST = 0x00;


}





ercircle 发表于 2025-8-26 21:21:16

上传完整工程或使用各型号例程包测试。

tmige 发表于 2025-9-4 18:13:25

正好在搞iic,stc的硬件iic实现好象没有超时处理。比如你发给了一个不存在的设备或设备有物理问题不在线了,就收不到RecvACK,卡Wait啦!要自己处理超时问题。

虚无 发表于 2025-9-6 15:38:30

tmige 发表于 2025-9-4 18:13
正好在搞iic,stc的硬件iic实现好象没有超时处理。比如你发给了一个不存在的设备或设备有物理问题不在线了, ...//问题,是把允许访问扩展XSFR关了


问题解决了
是adc的初始化把允许访问扩展XSFR关了,官方例程有一个P_SW2 |= 0x80;

开启扩展访问    配置完某些寄存器然后又把允许访问扩展XSFR关了P_SW2 &= ~0x80
当时还以为是必须要这样做后面排查是这里的问题 删掉无影响   
不过你说的发送一个不存在的设备并不会导致卡wait   

页: [1]
查看完整版本: 硬件iic 发完start 没有进入忙标志 导致卡死 | 已解决