单片机采用MSP430,以前的芯片读写正常,掉电后数据都在,但后来买入的很多芯片掉电数据就丢失了,只有很少部分是正常的,请问这是什么问题,咨询过厂商,他说应该不是芯片的问题,下面是我的代码,请高人指点 /************************I2C bus interface with EEPROM***************************/ void startI2C(void) { P3DIR|=BIT7; P3OUT|=BIT7+BIT6; _NOP(); _NOP(); _NOP(); _NOP(); P3OUT&=~BIT7; _NOP(); _NOP(); _NOP(); _NOP(); P3OUT&=~BIT6; }
void stopI2C(void) { P3DIR|=BIT7;//SDA P3OUT&=~(BIT7+BIT6); _NOP(); _NOP(); _NOP(); _NOP(); P3OUT|=BIT6;//SCL _NOP(); _NOP(); _NOP(); _NOP(); P3OUT|=BIT7; }
void WBYTE_I2C(uchar W_Byte) { uchar i; P3DIR|=BIT7; for(i=0; i<8; i++) { P3OUT&=~BIT7; if(W_Byte & 0x80) P3OUT|=BIT7; P3OUT|=BIT6; delay(10); P3OUT&=~BIT6; W_Byte <<= 1; } P3DIR&=~BIT7; P3OUT|=BIT6; delay(10); P3OUT&=~BIT6; delay(10); }
uchar RBYTE_I2C(void) { uchar i; uchar R_Byte; uchar TmpByte; P3DIR&=~BIT7; P3OUT&=~BIT6; for(i = 0; i < 8; i++) { P3OUT|=BIT6; _NOP(); _NOP(); _NOP(); _NOP(); if((P3IN&BIT7)==BIT7) TmpByte =0x01 ; else TmpByte =0; P3OUT&=~BIT6; R_Byte <<= 1; R_Byte |= TmpByte; } return(R_Byte); }
uchar I2C_rduchar(uchar page, uchar addr) { uchar uctemp; page=((page&0x03)<<1)+0xa0; startI2C(); WBYTE_I2C(page); WBYTE_I2C(addr); page|=BIT0; startI2C(); WBYTE_I2C(page); uctemp=RBYTE_I2C(); stopI2C(); return(uctemp); }
void I2C_wruchar(uchar page, uchar addr, uchar W_Byte) { page=((page&0x03)<<1)+0xa0; startI2C(); WBYTE_I2C(page); WBYTE_I2C(addr); WBYTE_I2C(W_Byte); stopI2C(); }
void I2C_rdulong(uchar page, uchar addr) { uchar *Ptemp; Ptemp=(uchar *)&I2C_rdtemp;/*?*/ *Ptemp++=I2C_rduchar(page, addr); *Ptemp++=I2C_rduchar(page, addr+1); *Ptemp++=I2C_rduchar(page, addr+2); *Ptemp=I2C_rduchar(page, addr+3); }
void I2C_wrulong(uchar page, uchar addr) { uchar *Ptemp; Ptemp=(uchar *)&I2C_wrtemp; I2C_wruchar(page, addr, *Ptemp++); delay(2000); I2C_wruchar(page, addr+1, *Ptemp++); delay(2000); I2C_wruchar(page, addr+2, *Ptemp++); delay(2000); I2C_wruchar(page, addr+3, *Ptemp); delay(2000); } |