|
发表于 2012-7-29 15:25:25
|
显示全部楼层
看了楼主的程序,貌似没问题,下面是我写的程序,给楼主参考参考:
#define SLAW 0XA0
#define SLAR 0XA1
#define PWP_H IOSET(P3,BIT(4))
#define PWP_L IOCLR(P3,BIT(4))
#define PSCL_H IOSET(P3,BIT(5))
#define PSCL_L IOCLR(P3,BIT(5))
#define PSDA_H IOSET(P3,BIT(6))
#define PSDA_L IOCLR(P3,BIT(6))
#define PINSDA (P3&BIT(6))
//------------------------------------------------
//IIC启始信号
//------------------------------------------------
void IICStart(void)
{
PSCL_H;
PSDA_H;
delayus(1);
PSDA_L;
delayus(1);
PSCL_L;
delayus(1);
}
//------------------------------------------------
//IIC终止信号
//------------------------------------------------
void IICEnd(void)
{
PSCL_L;
PSDA_L;
delayus(1);
PSCL_H;
delayus(1);
PSDA_H;
delayus(1);
}
//------------------------------------------------
//IIC回应
//------------------------------------------------
U8 IICACK(void) reentrant
{
U8 ret=0;
PSDA_H;//放开数据线
PSCL_H;
delayus(1);
if(PINSDA)ret=1;//读数据线
PSCL_L;
delayus(1);
return ret;
}
//------------------------------------------------
//IIC发出一字节数据
//------------------------------------------------
void IICSendByte(U8 sdata) reentrant//Thigh,Tlow>2US 就行
{
U8 i;
for(i=0;i<8;i++)//之前PSCL=0;
{
if(sdata&0x80)
PSDA_H;
else
PSDA_L;
delayus(1);//NOP(); //delayus()
PSCL_H;
delayus(1);//NOP();
PSCL_L;
sdata<<=1;//移位
}
}
//------------------------------------------------
//IIC读取一字节数据
//------------------------------------------------
U8 IICReadByte(void) reentrant
{
U8 ret,i;
PSDA_H;
for(i=0;i<8;i++)//之前PSCL=0;
{
ret<<=1;
delayus(1);//NOP();
PSCL_H;
delayus(1);//NOP();
if(PINSDA)ret|=1;
PSCL_L;
}
return ret;
}
//------------------------------------------------
//IIC存入一字节
//addr:地址
//wdata:数据
//返回:第一个ACK,为0是正常的
//------------------------------------------------
U8 IICEEPW(U16 addr,U8 wdata)//写入24C01
{
U8 pg;//页地址
U8 ack;
pg=addr>>8;
IICStart();
IICSendByte(SLAW|(pg<<1));
ack=IICACK();
IICSendByte(addr);
IICACK();
IICSendByte(wdata);
IICACK();
IICEnd();
delayms(6);
return ack;
}
//------------------------------------------------
//IIC读取一字节
//addr:地址
//rdata:返回读到的数据
//返回:第一个ACK,为0是正常的
//------------------------------------------------
U8 IICEEPR(U16 addr,U8 * rdata) reentrant//读一字节
{
U8 ack,d;
U8 pg;//页地址
pg=addr>>8;
IICStart();
IICSendByte(SLAW|(pg<<1));
ack=IICACK();
IICSendByte(addr);//伪写操作
IICACK();
IICStart();
IICSendByte(SLAR|(pg<<1));
IICACK();
d=IICReadByte();
IICACK();
IICEnd();
*rdata=d;
return ack;
} |
|