本帖最后由 hwpga 于 2019-3-28 17:15 编辑
if(I2C.ucSLSta>0)
{
if((I2CSLST&0x20)>0)
{
I2CSLST&=~0x20;
if(I2CRXD==0xfc) //从机地址匹配
{
I2CSLST=0x00; //从机发送Ack
I2C.ucGetStep=1;
}
else //地址不匹配
{
I2CSLST=0x01; //从机发送Noack
I2C.ucSLSta=0;
I2CSLCR=0x01; //复位I2C,从机退出Busy
I2CSLCR=0x40; //使能Sta,等待下一个新的起始
}
}
}
else
{
if((I2CSLST&0x40)>0) //起始
{
I2CSLST&=~0x40; //清除Sta标志位
I2C.ucSLSta=1;
I2CSLCR=0x20; //使能Rx接收中断,禁止Sta中断
}
}
break;
地址识别的,别的我就不发了
I2CSLST最低位写0,从机返回主机ack
I2CSLST最低位写1, 从机返回主机Noack
主机写0011命令到后, MSACK1读回从机返回的是ack或Noack
MSACK1位为0,主机继续通信
MSACK1位为1,主机要发送Stop命令,会清除Busy并结束通信
我也不是STC的人,也没义务帮谁
主机超时大概这样,每次通信主机写个I2CCFG|=0x80;
每次通信计时用完了,I2C就自动关掉
void I2C_TimeOut()
{
if((I2CCFG&0x80)>0) //I2C使能下,主机通信计时xxxMS
{
if(++I2C.xxxCnt>=5)
{
I2C.xxxCnt=0;
I2CCFG&=~0x80; //主机退出I2C模式
Rst_I2C();
}
}
}
|