|
发表于 2010-8-8 11:54:45
|
显示全部楼层
/****************************************/
#define Set_24XXX_SDA(void) {PIN_SDA=1;}
#define Clr_24XXX_SDA(void) {PIN_SDA=0;}
#define Get_24XXX_SDA(void) {PIN_SDA;}
#define Set_24XXX_SCL(void) {PIN_SCL=1;}
#define Clr_24XXX_SCL(void) {PIN_SCL=0;}
/****************************************/
static void nop(void)
{ asm("nop");
asm("nop");
asm("nop");
}
/****************************************/
static void ProgrameDelay(int16u x)
{ while(x--);
}
/****************************************/
static void Start(void)
{ Clr_24XXX_SCL();
Set_24XXX_SDA();
Set_24XXX_SCL();
nop();
Clr_24XXX_SDA();
nop();
Clr_24XXX_SCL();
Set_24XXX_SDA();
}
/****************************************/
void Stop(void)
{ Clr_24XXX_SCL();
Clr_24XXX_SDA();
Set_24XXX_SCL();
nop();
Set_24XXX_SDA();
nop();
Clr_24XXX_SCL();
}
/****************************************/
static int8u GetAck(void)
{ int8u ack;
Clr_24XXX_SCL();
Set_24XXX_SDA();
Set_24XXX_SCL();
nop();
ack= Get_24XXX_SDA();
Clr_24XXX_SCL();
return ack;
}
/****************************************/
static void Ack(void)
{ Clr_24XXX_SDA();
Set_24XXX_SCL();
nop();
Clr_24XXX_SCL();
nop();
Set_24XXX_SDA();
}
/****************************************/
static void Nack(void)
{ Set_24XXX_SDA();
Set_24XXX_SCL();
nop();
Clr_24XXX_SCL();
}
/****************************************/
static void SendByte(int8u sendbyte)
{ int8u i;
for(i=8;i>0;i--)
{ Clr_24XXX_SCL();
if(sendbyte & 0x80)
{ Set_24XXX_SDA();
}
else
{ Clr_24XXX_SDA();
}
sendbyte<<= 1;
Set_24XXX_SCL();
nop();
}
Clr_24XXX_SCL();
}
/****************************************/
static int8u ReceiveByte(void)
{ int8u resualt,i=8;
Clr_24XXX_SCL();
while(i--)
{ Set_24XXX_SCL();
resualt= (resualt<<1)|Get_24XXX_SDA();
Clr_24XXX_SCL();
}
return resualt;
}
/****************************************/
int8u Rw24XXX(int16u address,int8u *buf,int16u number,int8u control)
{ int16u i;
int8u *ptr;
int8u error=1;
int8s time=3;
while(1)
{ if(--time < 0) break;
ptr= buf;
Start();
SendByte(control&0xfe); if(GetAck())continue;
SendByte(address>>8); if(GetAck())continue; //如果地址小于2字节的,如24c02,04,16,32可以屏蔽此句
SendByte(address); if(GetAck())continue;
if(!(control&0x01))
{ i= number;
error= 0;
while(i--)
{ SendByte(*ptr++); if(!GetAck())continue;
error= 1;
break;
}
if(error == 1) continue;
break;
}
else
{ Start();
SendByte(control); if(GetAck())continue;
while(--number)
{ *ptr++= ReceiveByte();
Ack();
}
*ptr= ReceiveByte();
Nack();
error= 0;
break;
}
}
Stop();
if(!(control&0x01))
{ ProgrameDelay(1000);
}
return error;
}
/****************************************/ |
|