//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信号 } |
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) | Powered by Discuz! X3.4 |