void I2c_delay(unsigned int t)
{
while(t--);
}
void I2c_start(void)
{
SDA_out();
SCL_L();
I2c_delay(10);
SDA_H();
I2c_delay(10);
SCL_H();
I2c_delay(20);
SDA_L();
I2c_delay(20);
SCL_L();
I2c_delay(10);
}
void I2c_stop(void)
{
SDA_out();
SDA_L();
I2c_delay(10);
SCL_H();
I2c_delay(20);
SDA_H();
I2c_delay(20);
SCL_L();
I2c_delay(10);
}
unsigned char I2c_wait_ack(void)
{
unsigned char i;
unsigned char I2c_bad;
SDA_in();
I2c_delay(20);
SCL_H();
I2c_delay(10);
for(i=0; i<3; i++)
{
if(SDA_High)
{
I2c_bad=1;
}
else
{
I2c_bad=0;
break;
}
I2c_delay(10);
}
SCL_L();
I2c_delay(10);
SDA_out();
I2c_delay(10);
return I2c_bad;
}
void I2c_no_wait_ack(void)
{
SDA_out();
I2c_delay(20);
SDA_H();
I2c_delay(20);
SCL_H();
I2c_delay(20);
SCL_L();
I2c_delay(20);
}
void I2c_wr8bit(unsigned char c)
{
unsigned char i;
SDA_out();
for(i=0; i<8; i++)
{
if(c&0x80)
SDA_H();
else
SDA_L();
I2c_delay(10);
SCL_H();
I2c_delay(20);
SCL_L();
c=c<<1;
I2c_delay(10);
}
SDA_H();
}
unsigned char I2c_rd8bit(void)
{
unsigned char i, val=0;
SDA_in();
I2c_delay(10);
for(i=0x80; i>0;)
{
SCL_H();
I2c_delay(20);
if(SDA_High)
val=(val | i);
I2c_delay(10);
SCL_L();
i>>=1;
I2c_delay(20);
}
return val;
}
void I2c_write(unsigned char Addr,unsigned char Data,unsigned char DeviceID)
{
I2c_start();
I2c_wr8bit(DeviceID&Write);
I2c_wait_ack();
I2c_wr8bit(Addr);
I2c_wait_ack();
I2c_wr8bit(Data);
I2c_wait_ack();
I2c_stop();
}
unsigned char I2c_read(unsigned char Addr,unsigned char Data,unsigned char DeviceID)
{
I2c_start();
I2c_wr8bit(DeviceID&Write);
I2c_wait_ack();
I2c_wr8bit(Addr);
I2c_wait_ack();
I2c_start();
I2c_wr8bit(DeviceID|Read);
I2c_wait_ack();
Data=I2c_rd8bit();
I2c_no_wait_ack();
I2c_stop();
return Data;
}
void I2c_wr8bit_low(unsigned char c)
{
char i;
SDA_out();
for(i=0; i<8; i++)
{
if(c&0x01)
SDA_H();
else
SDA_L();
I2c_delay(10);
SCL_H();
I2c_delay(10);
SCL_L();
c>>=1;
I2c_delay(10);
}
SDA_H();
}
然后我也想分两个字节写入或读取,就
void Write_I2C(INT16U *luwtData,INT16U luwtAddr,INT16U luwtDataLen)
{
unsigned char Len;
unsigned char PageAddr;
unsigned char WriteTimes;
for(Len = 0;Len < luwtDataLen;Len++)
{
PageAddr = ((unsigned char)(luwtAddr>>8))&0x03;
PageAddr <<= 1;
for(WriteTimes = 0;WriteTimes < 5; WriteTimes++)
{
I2c_write(luwtAddr&0xff,(unsigned char)(luwtData&0xff),E2promID|(PageAddr&0x0f));
I2c_wait_ack();
I2c_write(luwtAddr&0xff,(unsigned char)((luwtData>>8)&0xff),E2promID|(PageAddr&0x0f));
I2c_wait_ack();
}
luwtAddr++;
luwtData++;
}
}
void Read_I2C(INT16U* lubtData,INT16U luwtAddr,INT16U luwtDataLen)
{
unsigned char Len;
unsigned char PageAddr;
unsigned char ReadTimes;
for(Len = 0;Len < luwtDataLen;Len++)
{
PageAddr = (unsigned char)((luwtAddr>>8)&0x03);
PageAddr <<= 1;
for(ReadTimes = 0;ReadTimes < 3;ReadTimes++)
{
I2c_read(luwtAddr&0xff,lubtData,E2promID|(PageAddr&0x0f));
I2c_wait_ack();
}
luwtAddr++;
lubtData++;
}
}
在运行中就不对,请问我这样写问题出在哪里?请帮忙解答,谢谢
|