天天看點

android i2c可以連24c02嗎,請教各位I2C對24C02寫完後無法立即讀的問題

C51:

//定義EE24XX的管腳********************************

sbit        SCL        =P1^2;        //

sbit        SDA =P1^3;

void nop_(void)

{

unsigned char i=5;

while (i--);

}

void Start_ee        (void)

{

SDA=HIGH;

nop_();

SCL=HIGH;

nop_();

SDA=LOW;

nop_();

SCL=LOW;

nop_();

}

void Stop_ee        (void)

{

SDA=LOW;

nop_();

SCL=HIGH;

nop_();

SDA=HIGH;

nop_();

SCL=LOW;

nop_();

}

bit Ack(void)

{

bit cy;

SCL=HIGH;

nop_();

cy=SDA;

SCL=LOW;

nop_();

return(cy);

}

bit McuAck(void)

{

bit cy;

SDA=LOW;

cy=Ack();

SDA=HIGH;

return(cy);

}

void McuNAck(void)

{

SDA=HIGH;

SCL=HIGH;

nop_();

SCL=LOW;

SDA=LOW;

}

bit Wr_Byte(unsigned char Dat)

{

unsigned char i;

bit cy;

for (i=0;i<8;i++)

{

if ((Dat & 0x80)==0x80) SDA=HIGH;

else        SDA=LOW;

cy=Ack();

Dat<<=1;

}

SDA=HIGH;

return(Ack());

}

unsigned char Rd_Byte(void)

{

unsigned char i,j=0;

for (i=0;i<8;i++)

{

j<<=1;

if (Ack()) j++;

}

return j;

}

unsigned char EeAll (unsigned int EeAdr)

{

Start_ee();

#if Ee_Type                                                          //1 EE24c32__

if (Wr_Byte(Wr_ee)) return 1;

if (Wr_Byte((unsigned char)EeAdr>>8)) return 1;

if (Wr_Byte((unsigned char)EeAdr)) return 1;

#else

if (Wr_Byte((unsigned char)(EeAdr>>7 |Wr_ee))) return 1;

if (Wr_Byte((unsigned char)EeAdr )) return 1;

#endif

return 0;

}

unsigned char WriteEe24(unsigned int EeAdr,unsigned char *RamAdr,unsigned char Number)

{

bit cy;

if (EeAll(EeAdr)) return (0);

while (Number--)

{

cy=Wr_Byte(*RamAdr++);

}

Stop_ee();

Delay (10);

return (1);

}

unsigned char ReadEe24(unsigned int EeAdr,unsigned char *RamAdr,unsigned char Number)

{

if (EeAll(EeAdr)) return (0);

Start_ee();

if (Wr_Byte(Rd_ee)) return (0);

while (--Number)

{

*RamAdr++=Rd_Byte();

McuAck();

}

*RamAdr=Rd_Byte();

McuNAck();

Stop_ee();

return (1);

}

void SaveEe24c512(void)

{

unsigned char Buf[2],i;

static unsigned char Flag=0;

if ((UseData.Tm % WrSec) ==0)

{

if(Flag==0) //2004-7-9改FLAG

{

Flag=1;        //寫入标志

Buf[1]=WorkData.Nu;

Buf[0]=WorkData.Nu>>8;

i=WriteEe24(HeadAdr+2*Menu.Piont++,Buf,2);

if (Menu.Piont >= WrNumber)

{

EndCount();                //溢出

UseData.ToBak=0;

UseData.To=0;

UseData.Tm=0;        //2004-4-18

Menu.Piont=0;

UseData.LedPower=Msg_Up;                //暫停放電

}

}

}

else

{

Flag=0;

}

}