unsigned char I2CData_r[22];
unsigned char I2CData_s[22];
unsigned char SMB_RCount;
unsigned char SMB_TCount;
unsigned char I2C_Work = 0;
unsigned char CommandFlag = 0;
unsigned char STS_CPN;
unsigned char stop_first = 0;
void IRQ_Handler(void)__irq;
void CommandPross(void);
unsigned char MSA_Command(void);
void CommandPross(void)
{
unsigned char rlen;
unsigned char i;
unsigned char chk=0;
rlen = SMB_RCount;
if(rlen!=(I2CData_r[2]+4))//判断数据帧是否正确
{
I2CData_s[1] = STS_FrameErr|STS_CPN;
I2CData_s[2] = 0;
}
else
{
// Error Check
for(i=0;i<rlen-1;i++)
chk = chk^I2CData_r[i];
chk = chk-1;
if(I2CData_r[rlen-1] != chk)
{
I2CData_s[1] = STS_CheckErr|STS_CPN;
I2CData_s[2] = 0;
}
else
{
chk = MSA_Command();
if(chk==STS_OK)
STS_CPN ^= 0x80; // CPN翻转
I2CData_s[1] = chk|STS_CPN; //CPN问题
}
}
// Calc CHK Data
rlen = I2CData_s[2]+4;
chk = 0;
for(i=0;i<rlen-1;i++)
chk = chk^I2CData_s[i];
I2CData_s[rlen-1] = chk-1;
I2C0STX = I2CData_s[1];
}
void IRQ_Handler()__irq
{
unsigned int I2C0SSTASTU=0;
unsigned int IRQSTASTU = 0;
IRQSTASTU = IRQSTA;
if(IRQSTASTU & BIT9)
{
I2C0SSTASTU = I2C0SSTA;
if((I2C0SSTASTU & BIT14)==BIT14) //Slave start
{
if(I2C_Work==0)
{
I2C_Work = 1;
SMB_RCount = 1;
SMB_TCount = 2;
}
}
// Slave Recieve
if ((I2C0SSTASTU & BIT3)==BIT3) // Slave Recieve IRQ
{
if(I2C_Work)
{
if(SMB_RCount<21) // SMB_Count从1开始
{
I2CData_r[SMB_RCount] = I2C0SRX;
SMB_RCount ++;
}
}
}
if ((I2C0SSTASTU & BIT10)==BIT10) //stop received
{
I2C_Work = 0;
if(stop_first == 0) // Receive stop
{
if(CommandFlag == 0)
CommandFlag = 1;
else //上一条命令未执行完成
{
I2CData_s[1]= STS_Busy|STS_CPN;
I2CData_s[2] = 0;
I2CData_s[3] = (I2CData_s[0] ^ I2CData_s[1]) -1;
I2C0STX = I2CData_s[1];
}
stop_first = 1;
}
else //Transmit stop
{
I2C0FSTA |=BIT8; //flush Slave Transmit FIFO
I2C0FSTA &=~BIT8;
stop_first = 0;
}
}
// Slave Transmit
if ((I2C0SSTASTU & 0x04)==0x04) // Slave Transmit IRQ
{
if(I2C_Work == 1)
{
I2C0STX = I2CData_s[SMB_TCount];
SMB_TCount ++;
}
}
}
}