I2C协议怎么写?
发布网友
发布时间:2022-05-30 06:22
我来回答
共1个回答
热心网友
时间:2023-10-12 12:05
void delay_scl()
{
unsigned data i=10;
do
{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
while(--i);
}
void delay(unsigned char data k)//精确延时k*0.1us
{
unsigned char data i=250;
do{do{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}//执行一个nop为1个时钟周期
while(--i);}
while(--k);//执行一个while为2个时钟周期
}
void i2c_init() //I2C的初始化:SDA和SCL都为高电平
{
sda=1;
delay_scl();
scl=1;
delay_scl();
}
void i2c_start() //开始信号
{
i2c_init();
sda=0;
delay_scl();
}
void i2c_stop() //停止信号
{
sda=0;
delay_scl();
scl=1;
delay_scl();
sda=1;
delay_scl();
}
void i2c_response() //应答信号
{
unsigned char xdata i;
scl=1;
delay_scl();
while((sda==1)&&(i<250))i++;
scl=0;
delay_scl();
}
void i2cwrite_byte(unsigned char data dat) //写1个字节
{unsigned char xdata i,temp;
temp=dat;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay_scl();
sda=CY;
delay_scl();
scl=1;
delay_scl();
}
scl=0;
delay_scl();
sda=1;
delay_scl();
}
unsigned char i2cread_byte() //读1个字节
{
unsigned char xdata i,k;
scl=0;
delay_scl();
sda=1;
delay_scl();
for(i=0;i<8;i++)
{
scl=1;
delay_scl();
k=(k<<1)|sda;
scl=0;
delay_scl();
}
return k;
}
void i2cwrite_add(unsigned char data address,unsigned char data dat) //写数据,1个字节地址位,1个字节数据
{
i2c_start();
i2cwrite_byte(0xEE);// 16进制Oxa0转成8bit二进制数:前7位是设备号,末位"0"表示向设备写入。
i2c_response();
i2cwrite_byte(address);//写地址
i2c_response();
i2cwrite_byte(dat);//写数据
i2c_response();
i2c_stop();
delay(100);//收到stop命令后,需twr时间来写数据,此期间不接收任何信息
}
unsigned char I2Cread_add(unsigned char data address) //读数据,1个字节地址位,函数返回数据值
{
unsigned char xdata dat;
i2c_start();
i2cwrite_byte(0xEE); //16进制Oxa0转成8bit二进制数:前7位是设备号,末位"0"表示向设备写入。
i2c_response();
i2cwrite_byte(address);//向设备写入需要查找的地址(移动设备内指针)
i2c_response();
i2c_start(); //刷新,再次查找设备
i2cwrite_byte(0xEF);// 16进制Oxa0转成8bit二进制数:前7位是设备号,末位"1"表示从设备读取。
i2c_response();
dat=i2cread_byte();//读取数据
i2c_stop();//读完后主机返回"非应答"(高电平),并直接发出终止信号
delay(10);
return dat;
}