【通信方式】I2C总线

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_39492932/article/details/90448987

一、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);
	}
}

猜你喜欢

转载自blog.csdn.net/qq_39492932/article/details/90448987