资讯专栏INFORMATION COLUMN

I2C 协议 代码详解

BakerJ / 1395人阅读

摘要:对应代码为读取口线状态拉低总线发送信号根据上方时序图可以知道在为高电平期间,发送数据,发送次数据,数据为被拉高,被拉低,数据为,被拉低。

I2C 协议

I2C 简要介绍

I2C 总线(I2C bus,Inter-IC bus)是一个双向的两线连续总线,提供集成电路(ICs)之间的通信线路。I2C总线是一种串行扩展技 术,最早由 Philips 公司推出,广泛应用于电视,录像机和音频等设备。I2C总线的意思:“完成集成电路或功能单元之间信息交换的规范或协议”。Philips公司推出的 I2C 总线采用一条数据线(SDA),加一条时钟线(SCL)来完成数据的传输及外围器件的扩展;对各个节点的寻址是软寻址方式,节省了片选线,标准的寻址字节 SLAM 为7位,可以寻址127个单元。

1. 延时信号

static void i2c_Delay(void){	uint8_t i;	for (i = 0; i < 10; i++);}

逻辑分析测试得出

​ 条件: CPU 主频 72MHZ ,MDK 编译, 1级优化

​ 循环次数 10 ,SCL 频率 = 205 KHZ

​ 循环次数 7 ,SCL 频率 = 347 KHZ, SCL 高电平时间 1.5us, SCL 低电平时间 2.87us

​ 循环次数 5 ,SCL 频率 = 421 KHZ ,SCL 高电平时间 1.25us, SCL 低电平时间 2.37us

2.起始信号

根据上方时序图可以知道

​ I2C 起始信号:当 SCL 高电平时,SDA 出现一个下跳沿表示 I2C 总线启动信号

​ 对应代码为:

void i2c_Start(void){	OLED_I2C_SDA_1();			//SDA 总线置1	OLED_I2C_SCL_1();			//SCL 总线置1	i2c_Delay();				//延时信号	OLED_I2C_SDA_0();			//置 0 	i2c_Delay();	OLED_I2C_SCL_0();			//SCL 置0	i2c_Delay();}

3. 停止信号

根据上方时序图可以知道

​ I2C 结束信号:当 SCL 高电平时,SDA 出现一个上跳沿表示 I2C 总线停止信号

​ 对应代码为:

void i2c_Stop(void){	OLED_I2C_SDA_0();	OLED_I2C_SCL_1();	i2c_Delay();	OLED_I2C_SDA_1();}

4. 等待应答信号

根据上方时序图可以知道

​ I2C等待应答信号:当 SDA 高电平,SCL 也处在高电平,这时候 SDA 返回的数据, 1 代表无器件应答,0 代表正确应答。

​ 对应代码为:

uint8_t i2c_WaitAck(void){	uint8_t re;	OLED_I2C_SDA_1();		i2c_Delay();	OLED_I2C_SCL_1();		i2c_Delay();	if (OLED_I2C_SDA_READ())	//读取 SDA 口线状态	{		re = 1;						}	else	{		re = 0;	}	OLED_I2C_SCL_0();			//拉低 SCL 总线	i2c_Delay();	return re;}

5. 发送信号

根据上方时序图可以知道

​ 在SCL为高电平期间,发送数据,发送8次数据,数据为1,SDA被拉高,SDA被拉低,数据为0,SDA被拉低。

void i2c_SendByte(uint8_t _ucByte){	uint8_t i; 							//先传输高位 bit7	for (i = 0; i < 8; i++)	{				if (_ucByte & 0x80)   			//判断 高位		{			OLED_I2C_SDA_1();			//设置 SDA 传输数据 		}		else		{			OLED_I2C_SDA_0();					}		i2c_Delay();		OLED_I2C_SCL_1();				//拉高 SCL ,发送数据		i2c_Delay();			OLED_I2C_SCL_0();				//拉低 SCL ,改变 SDA 数据,左移 _ucByte ,再次判断 高位 bit6 等等		if (i == 7)		{			 OLED_I2C_SDA_1(); 			//退出传输, SDA 置 1		}		_ucByte <<= 1;			i2c_Delay();	}}

6. 读取信号

uint8_t i2c_ReadByte(void){	uint8_t i;	uint8_t value;	value = 0;          	for (i = 0; i < 8; i++)	{		value <<= 1;					//左移 1 位		OLED_I2C_SCL_1();				// SCL 置 1 		i2c_Delay();		if (OLED_I2C_SDA_READ())		//读取 SDA 口数据		{			value++;                    //每次都左移一位,value++,就等于 |          		}		OLED_I2C_SCL_0();				//SCL 置 0 ,改变 SDA 数据		i2c_Delay();	}	return value;						//返回读取到的数据}

SCL 置 1,SDA数据稳定,SCL 置 0,可以改变 SDA数据

最后

 第一次尝试编写博客,若是有什么建议,欢迎批评指出。

后续会逐步分块更新,并会在最后一篇文章上传源代码。

 若是该文章对你有作用或是觉得文章写得还行,帮忙点点赞,三连!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121622.html

相关文章

  • stm32通过I2C接口实现温湿度(AHT20)的采集

    摘要:如图所示在了解起始条件和停止条件后,我们再来看看在这个过程中数据的传输是如何进行的。四参考资料通过接口实现温湿度的采集硬件和软件区别 stm32通过I2C接口实现...

    chengtao1633 评论0 收藏0
  • OLED 显示模块程序详解

    摘要:显示模块如果还没有看过协议的,请移步先看下面这篇文章协议好的,现在我们进入正题向寄存器地址写入一个的数据开启发送设备地址读写控制,采用宏定义方式一般地址为,不行就尝试下传入参数,为寄存器参数,根据手册,写入命令寄 ...

    Wildcard 评论0 收藏0
  • 串口I2C通信详解介绍(小白初学,浅显易懂,基本知识)

    摘要:每个字节后必须跟一个响应位。低速率一般是同一个板子上的两个芯片间通信,数据量不大,速率低。速率几百,速率可能不同,不能超过的最高速率。 介绍:I2C通讯协议(Inter-Integrated Circuit)引脚少,硬件实现简单,可扩展性强,不需要USART、CAN等通讯协议的外部收发设备,...

    wua_wua2012 评论0 收藏0
  • IIC协议详解,附单片机软件模拟源码

    摘要:协议物理层原理总体特征协议层起始和停止条件数据有效性响应应答寻址读数据写数据单片机通讯软件模拟硬件外设一物理层原理总线,分别由串行数据线和串行时钟线及上拉电阻组成。第八步,主机发送一个校验码,此校验值为步数据产生的校验码。 ...

    CrazyCodes 评论0 收藏0
  • FPAG学习笔记——I2C接口实现

    摘要:总线空闲和均为高电平协议起始位为高电平时,出现下降沿协议终止位为高电平时,出现上升沿。主设备产生所有时钟脉冲,包括确认位第九个时钟脉冲。当在第个时钟脉冲期间保持高时,这被定义为非应答信号。 ...

    DevTalking 评论0 收藏0

发表评论

0条评论

BakerJ

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<