|
at89s52 昌振是11。0592 eeprom是at24c02
当我写10个1给eeprom 再读出来时,(16进制)31 20 31 20 31 20
对一个错一个,还很有规律性
请各位帮帮是什么问题
void start_i2c(void)
{
SDA=1;
_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_();
}
void stop_i2c(void)
{
SDA=0;
_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=1;
_nop_(); _nop_(); _nop_(); _nop_();
SCL=0;
}
void sendB(uchar c)
{
uchar bit1;
for(bit1=0;bit1<8;bit1++)
{
//if((c<
//else SDA=0;
SDA=(bit)(c&0x80);
//_nop_();
c=c<<1;
SCL=1;
_nop_();_nop_();_nop_();_nop_();//_nop_();
SCL=0;
_nop_();
}
_nop_();_nop_();
SDA=1;
_nop_();_nop_();
SCL=1;
if(SDA==1)ack=0;
else ack=1;
_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_();_nop_();
}
uchar recB(void)
{
uchar bit1,rc=0;
SDA=1;
for(bit1=8;bit1!=0;bit1--)
{
_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();
rc=rc<<1;
//if(SDA==1)rc=rc+1;
rc=rc|((unsigned char)(SDA));
_nop_();_nop_();
}
SCL=0;
_nop_();_nop_();_nop_();_nop_();
return(rc);
}
void ack_i2c(bit a)
{
if(a==0)SDA=0;
else SDA=1;
_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_();
}
bit sendbety(uchar ad,uchar sad,uchar *str,uchar val)
{ uchar a;
start_i2c();
sendB(ad);
if(ack==0)return(0);
sendB(sad);
if(ack==0)return(0);
for(a=0;a
{
sendB(*str);
if(ack==0) return(0);
str++;
}
stop_i2c();
return(1);
}
bit recbety(uchar ad,uchar sad,uchar *str,uchar val)
{ uchar a;
start_i2c();
sendB(ad);
if(ack==0) return 0;
sendB(sad);
if(ack==0) return 0;
start_i2c();
sendB(ad+1);
if(ack==0) return 0;
for(a=0;a
{
*str=recB();
ack_i2c(0);
str++;
}
*str=recB();
ack_i2c(1);
stop_i2c();
return(1);
}
|
|