I2C从模式读取偶尔会出错,怎么解决?外部上拉了4.7K。
void IIC_InitI2cSlave(u8 SlaveAddr)
{
IIC_InitRunParam();
SSPADD = SlaveAddr;// i2c slave addr
SSPCON1 = 0x36;// power on state
SSPSTAT = 0x00;// power on state
SSPCON2 = 0x01;// power on state
PIR1bits.SSPIF = 0;//
IPR1bits.SSPIP = 1;// 高优先级
PIE1bits.SSPIE = 1;// 使能I2C1中断
}
if(PIR1bits.SSPIF)// I2C通信中断
{
PIR1bits.SSPIF = 0;
if((!SSPSTATbits.R_NOT_W)&&(SSPSTATbits.S)) //是写操作,并且有启始位
{
if(SSPSTATbits.D_NOT_A == 0)
{
// 如果当前接收的是地址
i = SSPBUF;
SSPCON1bits.CKP = 1;
t_I2cManage.OptFlag.Bit.CmdRegOK = 0; //清除操作寄存器状态
}
else
{
// 如果当前接收的是数据
i = SSPBUF;
SSPCON1bits.CKP = 1;
IIC_OptWriteDataInput(i);// 写入操作对象 或 写入数据
}
}
else if(SSPSTATbits.R_NOT_W)// 如果状态是读数据
{
if(SSPSTATbits.D_NOT_A == 0)// 如果是地址
{
SSPBUF = IIC_OptReadInput();// 初次读取数据
SSPCON1bits.CKP = 1;
}
else// 如果是数据
{
if(SSPCON1bits.CKP == 0)
{
SSPBUF = IIC_OptReadInput();// 连续读取数据
SSPCON1bits.CKP = 1;
}
}
}
}
|