void TwiObj::TWStart(void) { Busy = true; Status = 0;//主机准备发送启始位 Count = 0;//发送数据个数 I2C0->I2C_CONSET = (1 << I2EN) | (1 << STA); }
void TwiObj::TWREStart(void) { Busy = true; Status = 0x55;//主机准备发送启始位 Count = 0;//接收数据个数 I2C0->I2C_CONCLR = (1 << STA) | (1 << SI) | (1 << AA); I2C0->I2C_CONSET = (1 << I2EN) | (1 << STA); } //__inline void TwiObj::TWStop(void) { Busy = false; Status = 0x88;//通讯成功 I2C0->I2C_CONSET = (1 << I2EN) | (1 << STO); I2C0->I2C_CONCLR = (1 << STA) | (1 << SI) | (1 << AA); }
void TwiObj::TWExit(void) { Busy = false;//通讯失败 I2C0->I2C_CONSET = (1 << I2EN) | (1 << STO); I2C0->I2C_CONCLR = (1 << STA) | (1 << SI) | (1 << AA); }
void TwiObj::Exec(void) { switch(I2C0->I2C_STAT & 0xf8) { case I2C_START://主机收到自己发送的开始信号 if (Status == 0) {//本次中断应该接收TW_START信号//pwy I2C0->I2C_DAT = SubAddr & 0xfe;//发送子机地址(写) Status = 1;//Status下次主发为1,主收为2 I2C0->I2C_CONCLR = (1 << STA) | (1 << SI) | (1 << AA);//清除中断标志 } else TWExit();//通讯失败 break; case I2C_REP_START://主机收到自己发送的重新开始信号 if ((Status == 0x55) && (SubAddr & 0xfe)) {//本次中断应该接收TW_START信号//pwy I2C0->I2C_DAT = SubAddr;//发送子机地址(读) Status = 2;//Status下次主发为1,主收为2 I2C0->I2C_CONCLR = (1 << STA) | (1 << SI) | (1 << AA);//清除中断标志 } else TWExit();//通讯失败 break; case I2C_MT_SLA_ACK://主发机接收到从机的地址应答信号后发送命令 if (Status == 1) {//本次中断应该接收TW_MT_SLA_ACK信号 Status = 3;//Status下次应该收TW_MT_DATA_ACK I2C0->I2C_DAT = SubComm;//发送子机命令 I2C0->I2C_CONCLR = (1 << STA) | (1 << SI) | (1 << AA);//清除中断标志 } else TWExit();//通讯失败 break; case I2C_MR_SLA_ACK://主收机接收到从机的地址应答信号 if (SubCount && (Status == 2)) {//本次中断应该接收TW_MR_SLA_ACK信号 Status = 4;//Status下次应该收TW_MR_DATA_ACK I2C0->I2C_CONCLR = (1 << STA) | (1 << SI);//清除中断标志,主机转入接收状态 I2C0->I2C_CONSET = (1 << AA); } else TWExit();//通讯失败 break; case I2C_MT_DATA_ACK: if ((Count < MainCount) && (Status == 3)) {//本次中断应该接收TW_MT_DATA_ACK信号 I2C0->I2C_DAT = TxBuffer[Count ++];//发送子机数据 I2C0->I2C_CONCLR = (1 << STA) | (1 << SI) | (1 << AA);//清除中断标志 } else { if ((Count == MainCount) && (Status == 3) && (SubAddr & 1)) {//本次中断应该接收TW_MT_DATA_ACK信号 TWREStart();// } else TWExit();//通讯失败 } break; // case I2C_MT_DATA_NACK://数据发送结束 // TWExit();//通讯失败 // break; case I2C_MR_DATA_ACK: if ((Count < SubCount) && (Status == 4)) { RxBuffer[Count ++] = I2C0->I2C_DAT;//接收子机数据 if (Count < SubCount) { I2C0->I2C_CONCLR = (1 << STA) | (1 << SI);//主机转入接收状态 I2C0->I2C_CONSET = (1 << AA);// } else { I2C0->I2C_CONCLR = (1 << STA) | (1 << SI) | (1 << AA);//清除中断标志,主机转入接收状态 Status = 6;//下次进入I2C_MR_DATA_NACK,接收数据准备完成 } } else TWExit();//通讯失败 break; case I2C_MR_DATA_NACK://数据接收结束 if ((Count == SubCount) && (Status == 6)) { SetDataBuff();//取出接收字节 TWStop();//通讯成功 } else TWExit();//通讯失败 break; default: TWExit();//通讯失败 } }
|
雁塔菜农 2009-4-2 00:07
用户31709 2009-4-1 21:13