硬件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;
}
上传完整工程或使用各型号例程包测试。
正好在搞iic,stc的硬件iic实现好象没有超时处理。比如你发给了一个不存在的设备或设备有物理问题不在线了,就收不到RecvACK,卡Wait啦!要自己处理超时问题。 tmige 发表于 2025-9-4 18:13
正好在搞iic,stc的硬件iic实现好象没有超时处理。比如你发给了一个不存在的设备或设备有物理问题不在线了, ...//问题,是把允许访问扩展XSFR关了
问题解决了
是adc的初始化把允许访问扩展XSFR关了,官方例程有一个P_SW2 |= 0x80;
开启扩展访问 配置完某些寄存器然后又把允许访问扩展XSFR关了P_SW2 &= ~0x80
当时还以为是必须要这样做后面排查是这里的问题 删掉无影响
不过你说的发送一个不存在的设备并不会导致卡wait
页:
[1]