//TWI初始化
TWSR=0x00;
TWBR=0x06;
TWAR=0x01;
TWCR=0x41;
//TWI中断函数
SIGNAL(SIG_2WIRE_SERIAL)
{//IIC中断
switch(eep_int_seq)
{
case 1 :
{
if((TWSR&0xf8) != 0x08)
{//发送start信号出错
eep_int_seq=1;
TWCR = 0xa5; //错误,启动start信号
return;
}
else
{//发送start信号成功
TWDR=slave_rw&0xfe; //发送器件地址
TWCR &= ~0x20; //清start发送标志
}
break;
}
case 2 :
{
if((TWSR&0xf8) != 0x18)
{//发送器件地址出错
eep_int_seq=1;
TWCR = 0xa5; //错误,启动start信号
return;
}
else
{//发送器件地址成功
TWDR=eeprom_addr;
}
break;
}
case 3 :
{
if((TWSR&0xf8) != 0x28)
{//发送eeprom地址出错
eep_int_seq=1;
TWCR = 0xa5; //错误,启动start信号
return;
}
else
{//发送eeprom地址成功
if((slave_rw&0x01)==0) //写数据进eeprom
TWDR=eeprom_data;
else
{//从eeprom读数据
TWCR = 0xa5; //重新启动start信号
eep_int_seq++;
return;
}
}
break;
}
case 4 :
{
if((slave_rw&0x01)==0)
{//写eeprom
if((TWSR&0xf8) != 0x28)
{//发送eeprom数据出错
eep_int_seq=1;
TWCR = 0xa5; //错误,启动start信号
return;
}
else
{//发送eeprom数据成功
eep_int_seq=0;//0xff;
write_eep_flag=YES; //写eeprom延时标志
TWCR = 0x94; //发送停止信号
return;
}
}
else
{//读eeprom
if((TWSR&0xf8) != 0x10)
{//重发start信号出错
eep_int_seq=1;
TWCR = 0xa5; //错误,启动start信号
return;
}
else
{//重发start信号成功
TWDR=slave_rw; //发器件地址
TWCR &= ~0x20; //清start发送标志
}
}
break;
}
case 5 :
{
if((TWSR&0xf8) != 0x40)
{//发送器件地址出错
eep_int_seq=1;
TWCR = 0xa5; //错误,启动start信号
return;
}
// else
// TWCR |= 0x04; //slave_rw发送成功,并接收到ack
break;
}
case 6 :
{
if((TWSR&0xf8) != 0x50 && (TWSR&0xf8) != 0x58)
{
eep_int_seq=1;
TWCR = 0xa5; //错误,启动start信号
return;
}
else
{//发送器件地址成功
eep_int_seq=0;//0xff;
//write_eep_flag=YES;
get_eeprom_data=TWDR;
TWCR |= 0x94;//发送停止信号
return;
}
break;
}
default : break;
}
eep_int_seq++;
TWCR |= 0x80; //清TWINT标志
}
//AT24C16的字节读写函数
void OprateEepromByte(unchar read_flag,unchar byte_addr,unchar byte_data)
{
slave_rw=(read_flag&0x0f)|0xa0;
eeprom_addr=byte_addr;
eeprom_data=byte_data;
eep_int_seq=1;
TWCR |= 0xa4; //启动start信号
} |
|