方便移植,不用考虑不同的单片机下不同的配置方法。
一般I2C只需要实现5种时序:开始、停止、应答与非应答、写字节、读字节
/*
I2C Start
起始信号:时钟信号在高电平状态时候,数据线产生一个下降沿表示开始信号
*/
void I2C_Start()
{
IO_SCL_SET_H();
IO_SDA_SET_H();
IO_SDA_SET_L();
}
/*
I2C Stop
停止信号:时钟信号在高电平状态时候,数据线产生一个上升沿表示停止
*/
void I2C_Stop()
{
IO_SCL_SET_H();
IO_SDA_SET_L();
IO_SDA_SET_H();
}
/*
I2C ACK/NACK
应答信号:第九个时钟周期的时钟高电平时候读取SDA数据,如果SDA此时为0,则表示应答,如果为1则表示非应答。
*/
void I2C_ACK()
{
IO_SDA_SET_H();
IO_SCL_SET_H();
if(Get_IO_SDA()==0)
IO_SCL_SET_L();
else
while(Get_IO_SDA()==1);
IO_SCL_SET_L();
}
/*
I2C 上发送一个字节数据
发送字节:发送字节是时钟信号的低电平时候修改数据,发送完要让时钟总线保持在低电平。
*/
void Write_I2C_Byte(unsigned char I2C_Byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
IO_SCL_SET_L();
if((I2C_Byte<<i)&0x80)
IO_SDA_SET_H();
else
IO_SDA_SET_L();
IO_SCL_SET_H();
}
IO_SCL_SET_L();
}
|