case 0x40: // 已发送SLA+R,已接收ACK
if (I2C_num <= 1) // 如果是最后一个字节
{
I2C2CONCLR = 1 < 2; // 下次发送非应答信号
}
else
{
I2C2CONSET = 1 < 2; // 下次发送应答信号
}
I2C2CONCLR = 0x28; // 清零SI,STA
break;
case 0x20: // 已发送SLA+W,已接收非应答
case 0x30: // 已发送I2DAT中的数据,已接收非应答
case 0x38: // 在SLA+R/W或数据字节中丢失仲裁
case 0x48: // 已发送SLA+R,已接收非应答
I2C2CONCLR = 0x28;
I2C_end = 0xFF;
break;
case 0x50: // 已接收数据字节,已返回ACK
*I2C_buf++ = I2C2DAT;
I2C_num--;
if (I2C_num == 1) // 接收最后一个字节
{
I2C2CONCLR = 0x2C; // STA,SI,AA = 0
}
else
{
I2C2CONSET = 0x04; // AA=1
I2C2CONCLR = 0x28;
}
break;
case 0x58: // 已接收数据字节,已返回非应答
*I2C_buf++ = I2C2DAT; // 读取最后一字节数据
I2C2CONSET = 0x10; // 结束总线
I2C2CONCLR = 0x28;
I2C_end = 1;
break;
default:
break;
}
}
原因:指定suba_type参数不正确,如果器件的地址位宽是一字节,那么指定为1,如果地址位宽是两字节,那么指定为2。另外在读写操作时指定Wait_I2c_End(INT32 Dly)函数中的Dly值太小也不能操作成功,可以适当放大些。