版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
一、I2C相关介绍
- I2C由 荷兰Philips(飞利浦) 公司推出
- I2C Bus——Inter-Integrated Circuit 即集成电路总线
- 速率:普通模式 - 100Kbps;高速模式 - 400Kbps
- I2C总线端口为漏开结构,因此一般需要加上拉电阻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程序
//产生IIC起始信号
void IIC_Start(void)
{
SCL = 1;
SDA = 1; //首先SDA、SCL为高电平
delay_us(5); //起始条件建立时间大于 4.7us
SDA = 0; //START:when SCL is high,SDA change form high to low
delay_us(5); //起始条件锁定时间大于 4us
SCL = 0; //钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
delau_us(5); //结束总线时间大于 4us
SDA = 1; //STOP:when CLK is high DATA change form low to high
delau_us(5); //停止信号时间大于 4.7us
}
//产生ACK应答
void IIC_Ack(void)
{
SDA = 0;
delay_us(2);
SCL = 1;
delay_us(5);
SCL = 0;
}
//不产生ACK应答
void IIC_NAck(void)
{
SDA = 1;
delay_us(2);
SCL = 1;
delay_us(5);
SCL = 0;
}
//IIC读取1个字节,ack=1时,发送ACK,ack=0,发送nACK
//若还需要继续接收就需要产生应答位
unsigned char IIC_Read_Byte(unsigned char ack)
{
unsigned char data = 0;
SDA = 1;
for(char i = 0;i < 8;i++)
{
SCL = 0; //SCL低电平 SDA数据线才能变化
delay_us(2);
SCL = 1; //SCL高电平,读取SDA数据线
data <<= 1; //数据左移(先接收到的数据为高位)
data |= SDA;
}
if(ack)
IIC_Ack(); //发送ACK
else
IIC_NAck();//发送NACK
return data;
}
//IIC发送一个字节
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);
}
}