(3)读写单个字节的段
u8 I2C_Send_Byte(u8 bytedata)
{
u8 i,ack;
I2C_SDA_Mode(1); //SDA输出
I2C_SCL_OUTP();
for (i = 0; i < 8; i++)
{
if (bytedata & 0x80)
{
I2C_SDA_Output(1);
}
else
{
I2C_SDA_Output(0);
}
bytedata <<= 1;
I2C_SCL_Output(1);
udelay(3);
I2C_SCL_Output(0);
udelay(1);
}
I2C_SDA_Output(1); //release
udelay(3);
I2C_SDA_Mode(0); //设定SDA输入
I2C_SCL_Output(1);
udelay(3);
ack = I2C_SDA_Read(); //读应答
I2C_SDA_Mode(1);
I2C_SCL_Output(0);
udelay(3);
return ack;
}
u8 I2C_Receive_Byte(void)
{
u8 i;
u8 bytedata = 0x00;
u8 temp;
I2C_SDA_Mode(0);
for ( i = 0; i < 8; i++)
{
I2C_SCL_Output(1);
udelay(3);
bytedata <<= 1;
temp = I2C_SDA_Read();
printk("reda SDA'value is:%d\n",temp);
if (temp)
bytedata |= 0x01;
printk(" bytedata is:%x\n",bytedata);
I2C_SCL_Output(0);
udelay(1);
}
I2C_SDA_Mode(1);
return bytedata;
}
(4)读写单个字节的I2C应用函数
u8 I2C_Byte_Write(u8 device_ID,u8 address,u8 bytedata)
{
u8 ack;
printk("device_ID is:%x\n",device_ID);
printk("address is:%x\n",address);
printk("date is:%x\n",bytedata);
I2C_Start();
ack=I2C_Send_Byte(device_ID);
printk("ack is:%d\n",ack);
if(ack)
I2C_Stop();
I2C_Send_Byte(address);
I2C_Send_Byte(bytedata);
I2C_Stop();
I2C_Wait();
return 0;
}
u8 I2C_Byte_Read(u8 device_ID,u8 address)
{
u8 bytedata;
I2C_Start();
I2C_Send_Byte(device_ID);
I2C_Send_Byte(address);
I2C_Start();
I2C_Send_Byte(device_ID+1);
bytedata = I2C_Receive_Byte(); //读单个字节,不需要再发应答
I2C_Stop();
return bytedata;
}
(5)类似可以完成读写多个字节的函数,暂不补充。