I2C1TRN = I2CRegs.RWAddr & 0xff;//发送EEPROM写低8位地址
I2CRegs.State = I2C_MT_ADDRL_ACK;//下次应该接收EEPROM写低8位地址应答信号
I2CRegs.Count = 0;//清空发送缓冲计数器
}
else//收到NAck信号
{
I2cExit();//错误的ACK信号
}
break;
case I2C_MT_ADDRL_ACK://收到EEPROM写高低8位地址应答信号
if (I2CRegs.TxCount)//写保护只在写入期间不保护,增加了对误写入的安全防护能力!!!
{
WP = 0;//不写保护
}
case I2C_MT_DATA_ACK://收到应答信号
if (!I2C1STATbits.ACKSTAT)//收到Ack信号
{
if (I2CRegs.Count < I2CRegs.TxCount)//缓冲区未空
{
I2C1TRN = I2CRegs.TxBuffer[I2CRegs.Count ++];//继续发送数据
}
else if (I2CRegs.Count == I2CRegs.TxCount)//缓冲区已空
{
if (I2CRegs.I2CAddr & 1)//应该开始接收数据
{
I2cReStart();//发送重复位命令
}
else//只写退出
{
I2cStop();//正常发送结束
}
}
else//干扰出错
{
I2cExit();//错误
}
}
else//收到NAck信号(可能被写保护)
{
I2cExit();//错误的ACK信号
}
break;
case I2C_REP_START://收到ReStart信号
I2C1TRN = I2CRegs.I2CAddr | I2C_READ;//发送器件读地址(通知从机可以说话)
I2CRegs.State = I2C_MR_SLA_ACK;//下次应该接收器件写读地址应答信号
break;
case I2C_MR_SLA_ACK://收到器件读地址应答信号
if (!I2C1STATbits.ACKSTAT)//收到Ack信号
{
I2C1CONbits.RCEN = 1;//开始接收数据
I2CRegs.State = I2C_MR_DATA;//下次应该收接收数据
}
else//收到NAck信号
{
上一页 [1] [2] [3] [4] 下一页
本文关键字:暂无联系方式PIC单片机,单片机-工控设备 - PIC单片机