📄 i2c.h
字号:
//i2c driver
#define x2402dev 0xa0
#define CHECK_I2C_TIME 0x32
sbit I2C_SCL = P1^7;
sbit I2C_ACK = P1^6;
sbit I2C_SDA = P1^6;
unsigned char i2c_data;
void delay5us()
{
// unsigned char i;
// for(i=0;i<1;i++)
// {}
_nop_();
_nop_();
_nop_();
}
void delay100us()
{unsigned char i;
// EA=0;
// for(i=0;i<30;i++)
// for(i=0;i<10;i++)
for(i=0;i<9;i++)
{}
}
void delay30ms()
{unsigned int i;
EA=0;
for(i=0;i<330;i++)
delay100us();
EA=1;
}
i2c_delay()
{
// unsigned char j;
// for(j=0;j<5;j++)
delay5us();
}
void i2c_init()
{
I2C_SDA = 1;//0; //SDA = 1
I2C_SCL = 1;//0 //SCL = 1
delay30ms();
}
void i2c_startcode(void)
{
I2C_SDA = 1;//0; // SDA = 1
I2C_SCL = 1;//0; // SCL = 1
i2c_delay();
I2C_SDA = 0;//1; // SDA = 0
i2c_delay();
}
void i2c_stopcode()
{
I2C_SDA = 0;//1; // SDA = 0
i2c_delay();
I2C_SCL = 1;//0; // SCL = 1
i2c_delay();
I2C_SDA = 1;//0; // SDA = 1
i2c_delay();
}
unsigned char i2c_check_ack()
{
unsigned char i,j;
I2C_SCL = 0;//1; //SCL = 0
I2C_SDA = 1;//0; //SDA = 1
i2c_delay();
I2C_SCL = 1;//0; //SCL = 1
for(i=0;i<CHECK_I2C_TIME;i++)
for(j=0;j<5;j++)
{
i2c_delay();
// if(I2C_ACK!=0) //SDA ==1
if(I2C_ACK!=1) //SDA ==1
{
I2C_SCL = 0;//1; //SCL = 0
i2c_delay();
return 1;
}
}
return 0;
}
void send_Unack()
{
unsigned char i,j;
I2C_SCL = 0;//1; //SCL = 0
I2C_SDA = 1;//0; //SDA = 1
i2c_delay();
I2C_SCL = 1;//0; //SCL = 1
i2c_delay();
I2C_SCL =0;//1 ; // SCL = 0
}
char i2c_read(unsigned char dev_addr,unsigned char sub_addr)
{
unsigned char i;
unsigned char datacode;
EA=0;
//STARTCODE
i2c_startcode();
//send dev addr
datacode = dev_addr;
for(i=0;i<8;i++)
{
I2C_SCL = 0;//1; //SCL = 0
i2c_delay();
if(datacode&0x80)
I2C_SDA = 1;//0; //SDA = 1
else
I2C_SDA = 0;//1; //SDA = 0
i2c_delay();
I2C_SCL = 1;//0; //SCL = 1
i2c_delay();
datacode<<=1;
}
//receive ack
//error return
if(i2c_check_ack()==0)
{
i2c_stopcode();
EA =1;
return 0;
}
//write sub_addr
datacode = sub_addr;
i2c_delay();
for(i=0;i<8;i++)
{
I2C_SCL = 0;//1; //SCL = 0
i2c_delay();
if(datacode&0x80)
I2C_SDA = 1;//0; //SDA = 1
else
I2C_SDA = 0;//1; //SDA = 0
i2c_delay();
I2C_SCL = 1;//0; //SCL = 1
i2c_delay();
datacode<<=1;
}
//receive ack
//error return
if(i2c_check_ack()==0)
{
i2c_stopcode();
EA = 1;
return 0;
}
//START
i2c_startcode();
//send dev_addr for read data
datacode = dev_addr|0x01;
i2c_delay();
for(i=0;i<8;i++)
{
I2C_SCL = 0;//1; //SCL = 0
i2c_delay();
if(datacode&0x80)
I2C_SDA = 1;//0; //SDA = 1
else
I2C_SDA = 0;//1; //SDA = 0
i2c_delay();
I2C_SCL = 1;//0; //SCL = 1
i2c_delay();
datacode<<=1;
}
//receive ack
//error return
if(i2c_check_ack()==0)
{
i2c_stopcode();
EA =1;
return 0;
}
//read data from I2C bus
i2c_delay();
datacode = 0;
for(i=0;i<8;i++)
{
datacode = datacode <<1;
I2C_SCL = 0;//1; //SCL = 0
i2c_delay();
I2C_SCL = 1;//0; //SCL = 1
i2c_delay();
// if(I2C_ACK == 0) //ACK ==1
if(I2C_ACK == 1) //ACK ==1
datacode = datacode | 0x01;
}
i2c_data = datacode;
// send no_ack
send_Unack();
//STOP
i2c_stopcode();
EA = 1;
return 1;
}
char i2c_read_without_subaddr(unsigned char dev_addr)
{
unsigned char i;
unsigned char datacode;
EA=0;
//START
i2c_startcode();
//send dev_addr for read data
datacode = dev_addr|0x01;
i2c_delay();
for(i=0;i<8;i++)
{
I2C_SCL = 0;//1; //SCL = 0
i2c_delay();
if(datacode&0x80)
I2C_SDA = 1;//0; //SDA = 1
else
I2C_SDA = 0;//1; //SDA = 0
i2c_delay();
I2C_SCL = 1;//0; //SCL = 1
i2c_delay();
datacode<<=1;
}
//receive ack
//error return
if(i2c_check_ack()==0)
{
i2c_stopcode();
EA =1;
return 0;
}
//read data from I2C bus
i2c_delay();
datacode = 0;
for(i=0;i<8;i++)
{
datacode = datacode <<1;
I2C_SCL = 0;//1; //SCL = 0
i2c_delay();
I2C_SCL = 1;//0; //SCL = 1
i2c_delay();
// if(I2C_ACK == 0) //ACK ==1
if(I2C_ACK == 1) //ACK ==1
datacode = datacode | 0x01;
}
i2c_data = datacode;
// send no_ack
send_Unack();
//STOP
i2c_stopcode();
EA = 1;
return 1;
}
char i2c_write(unsigned char dev_addr,unsigned char sub_addr)
{
unsigned char i;
unsigned char datacode;
EA=0;
//START
i2c_startcode();
//send dev addr
datacode = dev_addr;
for(i=0;i<8;i++)
{
I2C_SCL = 0;//1; //SCL = 0
i2c_delay();
if(datacode&0x80)
I2C_SDA = 1;//0; //SDA = 1
else
I2C_SDA = 0;//1; //SDA = 0
i2c_delay();
I2C_SCL = 1;//0; //SCL = 1
i2c_delay();
datacode<<=1;
}
//receive ack
//error return
if(i2c_check_ack()==0)
{
i2c_stopcode();
EA =1;
return 0;
}
//write sub_addr
datacode = sub_addr;
i2c_delay();
for(i=0;i<8;i++)
{
I2C_SCL = 0;//1; //SCL = 0
i2c_delay();
if(datacode&0x80)
I2C_SDA = 1;//0; //SDA = 1
else
I2C_SDA = 0;//1; //SDA = 0
i2c_delay();
I2C_SCL = 1;//0; //SCL = 1
i2c_delay();
datacode<<=1;
}
//receive ack
//error return
if(i2c_check_ack()==0)
{
i2c_stopcode();
EA =1;
return 0;
}
//send data
datacode = i2c_data;
i2c_delay();
for(i=0;i<8;i++)
{
I2C_SCL = 0;//1; //SCL = 0
i2c_delay();
if(datacode&0x80)
I2C_SDA = 1;//0; //SDA = 1
else
I2C_SDA = 0;//1; //SDA = 0
i2c_delay();
I2C_SCL = 1;//0; //SCL = 1
i2c_delay();
datacode<<=1;
}
//receive ack
//error return
if(i2c_check_ack()==0)
{
i2c_stopcode();
EA =1;
return 0;
}
//STOP
i2c_stopcode();
EA = 1;
return 1;
}
char i2c_write_without_subaddr(unsigned char dev_addr)
{
unsigned char i;
unsigned char datacode;
EA=0;
//START
i2c_startcode();
//send dev addr
datacode = dev_addr;
for(i=0;i<8;i++)
{
I2C_SCL = 0;//1; //SCL = 0
i2c_delay();
if(datacode&0x80)
I2C_SDA = 1;//0; //SDA = 1
else
I2C_SDA = 0;//1; //SDA = 0
i2c_delay();
I2C_SCL = 1;//0; //SCL = 1
i2c_delay();
datacode<<=1;
}
//receive ack
//error return
if(i2c_check_ack()==0)
{
i2c_stopcode();
EA =1;
return 0;
}
//send data
datacode = i2c_data;
i2c_delay();
for(i=0;i<8;i++)
{
I2C_SCL = 0;//1; //SCL = 0
i2c_delay();
if(datacode&0x80)
I2C_SDA = 1;//0; //SDA = 1
else
I2C_SDA = 0;//1; //SDA = 0
i2c_delay();
I2C_SCL = 1;//0; //SCL = 1
i2c_delay();
datacode<<=1;
}
//receive ack
//error return
if(i2c_check_ack()==0)
{
i2c_stopcode();
EA =1;
return 0;
}
//STOP
i2c_stopcode();
EA = 1;
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -