文章目录
一、I2C相关介绍二、I2C时序图三、GPIO简单模拟I2C程序
一、I2C相关介绍
I2C由 荷兰Philips(飞利浦) 公司推出I2C Bus——Inter-Integrated Circuit 即集成电路总线速率:普通模式 - 100Kbps;高速模式 - 400KbpsI2C总线端口为漏开结构,因此一般需要加上拉电阻Rp,通常选用5K~10KΩI2C总线以字节为单位收发数据,一个字节为一帧,数据传输的次序为从最高位到最低位I2C应答位遵循“谁接收谁产生”的原则若还需要继续接收就需要产生应答位I2C器件地址的分配由I2C总线委员会协调确定
I2C器件的从机地址由4位器件地址,2~3位引脚地址和1位方向位(读写位)【0写1读】
以AT24cxx芯片为例:
I2C由 数据线(SDA)与时钟线(SCL)组成
SDA:Synchronous Data Adapter (同步数据衔接器)SCL:Serial Communication Loop(串行通讯环路)
二、I2C时序图
三、GPIO简单模拟I2C程序
void IIC_Start(void)
{
SCL
= 1;
SDA
= 1;
delay_us(5);
SDA
= 0;
delay_us(5);
SCL
= 0;
}
void IIC_Stop(void)
{
SDA
= 0;
SCL
= 1;
delau_us(5);
SDA
= 1;
delau_us(5);
}
void IIC_Ack(void)
{
SDA
= 0;
delay_us(2);
SCL
= 1;
delay_us(5);
SCL
= 0;
}
void IIC_NAck(void)
{
SDA
= 1;
delay_us(2);
SCL
= 1;
delay_us(5);
SCL
= 0;
}
unsigned char IIC_Read_Byte(unsigned char ack
)
{
unsigned char data
= 0;
SDA
= 1;
for(char i
= 0;i
< 8;i
++)
{
SCL
= 0;
delay_us(2);
SCL
= 1;
data
<<= 1;
data
|= SDA
;
}
if(ack
)
IIC_Ack();
else
IIC_NAck();
return data
;
}
void IIC_Send_Byte(unsigned char data
)
{
SCL
= 0;
for(char i
= 0;i
< 8;i
++)
{
SCL
= 0;
delay_us(2);
SDA
= (data
& 0x80) >> 7;
data
<<= 1;
SCL
= 1;
delay_us(2);
}
}