一文教你彻底学会IIC协议

news2024/11/24 19:43:51

一文教你如何看懂I2C协议

  • 一.序言
  • 二.IIC读写过程
    • 2.1主机向从机写入数据
    • 2.2主机向从机读取数据
    • 2.3 I2C起始信号和停止信号
  • 三. 数据的有效性
  • 四.时序要求
    • 4.1 起始信号
    • 4.2 终止信号
    • 4.3 应答信号
    • 4.4 非应答信号
    • 读取数据
    • 五.代码实例
  • 结语

一.序言

背景知识:I2C总线上是通过上拉电阻接到电源。当I2C设备空闲时,会输出高阻态,当所有设备都空闲时,由上拉电阻把总线拉成高电平。所以默认总线上是高电平。
I2C设备之间常见的连接方式。
在这里插入图片描述

二.IIC读写过程

注:一般单片机是主机,各种模块是从机(eeprom,oled显示屏,以及各种传感器)

2.1主机向从机写入数据

首先给一个起始信号,然后发送从机地址(地址最后一位决定是写数据还是读数据)这里给的是 ‘0’,表示写入数据。写入从机地址后,等待从机给响应信号。主机接收到响应数据后才可以开始传输数据了,如果主机不想传输数据了,就给出停止信号。数据传输结束
在这里插入图片描述

2.2主机向从机读取数据

这边同写入数据一样,先给一个起始信号,再发送从机地址(地址最后一位表示读还是写)这里是 ‘1’,表示读取数据。等待从机响应。响应后就可以读取数据了。读取数据后,要发送一个应答信号(告诉从机数据已经被读取),从机收到应答信号后就可以继续发送数据给主机。如果主机不想再接收数据了,就发送一个非应答信号(告诉从机不要发送数据了),主机给出停止信号。数据读取完成。
在这里插入图片描述

2.3 I2C起始信号和停止信号

起始信号是SCL时钟线在高电平时,SDA由高拉低,产生一个下降沿。表示起始信号。
停止信号是SCL时钟线在高电平时,SDA由低电平拉到高电平,产生一个上升沿。表示停止信号
在这里插入图片描述

三. 数据的有效性

我们知道I2C是时钟线和数据线协同工作的。那么I2C是如何表示有效数据的呢?
其实就是在SCL保持高电平的时候,SDA的数据才是有效的,正确的。这时候才能去读取SDA的数据(同时这时候不能去改变SDA的数据)不然可能会读取到错误数据,那么SCL低电平时是在干嘛? SCL低电平时SDA进行数据变化(此时并不会读取SDA的数据),等SDA数据稳定后,在拉高SCL,进行数据读取。
在这里插入图片描述

四.时序要求

前面我们只是讲了大概流程,其实I2C对时序也是要求严格的。下面我就给大家讲解时序。

4.1 起始信号

起始产生时,SCL高电平时,SDA高电平至少维持4.7us,此时拉低SDA产生下降沿,至少维持4us.

4.2 终止信号

终止信号产生时,SCL高电平时,SDA低电平至少维持4us,再拉高SDA产生上升沿。维持SDA至少4.7us

4.3 应答信号

当SCL是高电平时,且至少维持4us,SDA数据线是0,此时表示应答信号

4.4 非应答信号

当SCL是高电平时,且至少维持4us,SDA数据线是1,此时表示非应答信号

在这里插入图片描述

读取数据

我们可以参考下图,当读取数据时SCL保持时间为tHIGH最少4ms。当SDA变化数据是,SCL保持低电平的时间tLow至少保持4.7us,此时可以改变SDA上的数据。
在这里插入图片描述
在这里插入图片描述

五.代码实例

void I2C_Start(void)
{
	
	IIC_SDA = 1;      
	IIC_SCL = 1; //高电平         
	delay_us(5); //保持4.7us以上,这里5us     
	IIC_SDA = 0; //拉低,下降沿  
	delay_us(5); //保持低电平      
	IIC_SCL = 0; //拉低   
}
 

void I2C_Stop(void)
{
	
	IIC_SDA = 0;        
	IIC_SCL = 1;           
	delay_us(5);//保持高电平        
	IIC_SDA = 1; //拉高,上升沿      
	delay_us(5);            
}
 

void I2C_SendACK(char ack)
{
	 	
	IIC_SCL = 0;            
	if(ack) IIC_SDA = 1; 
	else IIC_SDA = 0;   
	delay_us(2);  //短延时等待SDA稳定            
	IIC_SCL = 1;  //拉高SCL         
	delay_us(5);  //延时,从机读取SDA           
	IIC_SCL = 0;              
 

char I2C_RecvACK(void)
{
	unsigned char cnt=0;
	
	IIC_SDA=1; //释放数据线
	delay_us(1);
	IIC_SCL=1; //时钟线拉高
	delay_us(1);
	while(IIC_SDA) //等待从机把SDA拉低,产生应答信号
	{
		cnt++;
		delay_us(1);
		if(cnt>=250)
		{
			I2C_Stop();
			
			return 1;
		}
	}
	IIC_SCL=0; 
	return 0;
}
 

void I2C_SendByte(unsigned char data)
{   
//data高位先发。
	unsigned char  i;
	IIC_SCL = 0;  //拉低SCL
	delay_us(2);  
	for (i=0;i<8;i++) 
	{
		if(data&0x80) IIC_SDA=1;//给SDA赋值
		else IIC_SDA=0;
		data <<= 1;
		IIC_SCL = 1; //拉高时钟线
		delay_us(2); //延时,从机读取SDA数据
		IIC_SCL = 0;
		delay_us(2);
	}
}

unsigned char I2C_RecvByte(void)
{
//低位先接收
	unsigned char  i;
	unsigned char  data = 0;
	
	for (i=0;i<8;i++)
	{
		IIC_SCL=0;//拉低时钟线
		delay_us(2);//此时从机改变SDA数据
		IIC_SCL=1; //拉高时钟线
		data <<= 1;
		IIC_SCL = 1;
		if(IIC_SDA) data|=0x01;  //读取数据线            
		delay_us(1);
		//因为默认是0,所以IIC_SDA为0是可以不赋值0
	}
	IIC_SCL=0; 
	return data;
}

结语

本次也是结合I2C的时序图讲述了如何产生起始信号,停止信号,应答信号,非应答信号,向从机读取数据,向从机写入数据等。最后也是给出了代码实例,理论和实践结合用,帮助读者深入理解IIC。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/648413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

顶奢好文:3W字,穿透Spring事务原理、源码,至少读10遍

说在前面 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、美团、极兔、有赞、希音的面试资格&#xff0c;Spring事务源码的面试题&#xff0c;经常遇到&#xff1a; (1) spring什么情况下进行事务回滚&#xff1f; (2) spring 事务…

微服务springcloud 04. 远程调用,负载平衡,重试,ribbon框架

01.springcloud中关于远程调用&#xff0c;负载平衡。 02.远程调用 ribbon 提供了负载均衡和重试功能, 它底层是使用 RestTemplate 进行 Rest api 调用RestTemplate&#xff0c;RestTemplate 是SpringBoot提供的一个Rest远程调用工具。 它的常用方法: getForObject() - 执行…

「深度学习之优化算法」(六)遗传算法

1. 遗传算法简介 遗传算法(Genetic Algorithms&#xff0c;GA)是一种模拟自然中生物的遗传、进化以适应环境的智能算法。由于其算法流程简单&#xff0c;参数较少优化速度较快&#xff0c;效果较好&#xff0c;在图像处理、函数优化、信号处理、模式识别等领域有着广泛的应用。…

电气火灾探测器在智慧城市消防安全的应用 安科瑞 许敏

【摘要】智慧消防应用是重要的建设内容之一。根据固定资产投资额和消防经费测算&#xff0c;2017年消防市场容量合计约2761.65亿元&#xff0c;2020年消防市场规模可达5200亿元。通过梳理各地政府招标项目&#xff0c;预计全国政府智慧消防项目的投入总额可达92.8亿元。 【关键…

基于Java校园美食交流系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

crontab执行时间与系统时间不一致

crontab执行时间与系统时间不一致 一&#xff1a;问题查找&#xff1a; 问题描述&#xff1a;今天新发现一个问题&#xff0c;定时任务写了之后一直不执行&#xff0c;查看日志才发现&#xff0c;执行的时间给我定时的时间相差了12个小时。 1、查看定时任务的相关日志&#…

Nik Color Efex 滤镜详解(1/5)

双色滤镜 Bi-Color Filter 混合两种颜色然后将混合结果添加到图像&#xff0c;以此模拟传统的双色玻璃滤镜效果。 颜色组合 Color Set 提供棕色、冷/暖、绿色/棕色、青苔色、紫色/粉红色等多种颜色组合&#xff0c;每个颜色组合又有 4 种版本可供选择。 不透明度 Opacity 调整…

Stuart Russell对话姚期智:为全人类设计AI系统,可以借鉴墨子「兼爱」思想丨2023智源大会AI安全与对齐论坛...

导读 在2023智源大会「AI安全与对齐论坛」的对话环节&#xff0c;加州大学伯克利分校教授Stuart Russell与图灵奖得主、中国科学院院士姚期智针对「如何设计对人类有益的AI」、「如何管控AI技术」&#xff0c;以及「LLM内在目标与意识」等话题进行了深度探讨&#xff0c;其中St…

一键式 RLHF 训练 DeepSpeed Chat(二):实践篇

一键式 RLHF 训练 DeepSpeed Chat&#xff08;二&#xff09;&#xff1a;实践篇 之前给大家分享了一键式 RLHF 训练 DeepSpeed Chat&#xff08;一&#xff09;&#xff1a;理论篇&#xff0c;本文给大家分享如何使用DeepSpeed Chat进行RLHF训练。 DeepSpeed Chat 的 RLHF 训…

每日算法(第二十三期)

先来回顾一下上期的问题及答案&#xff1a; 2023年6月14日 「最接近的三数之和」&#xff08;3Sum Closest&#xff09;。以下是题目的描述&#xff1a; 给定一个包括 n 个整数的数组 nums 和一个目标值 target。找出 nums 中的三个整数&#xff0c;使得它们的和与 target 最接…

活动预告 | Hugging Face 音频 AI 派对直播

嘿嘿嘿&#xff0c;&#x1f917; 宝子们&#xff01;我们正在准备一个超级激动人心的音频 AI 派对&#xff0c;千万别错过&#xff01;为了庆祝 Hugging Face 新开设的免费开源 Audio Transformers 课程的启动&#xff0c;我们组织了一场不容错过的网络直播活动&#xff01; &…

Docker 容器入侵排查

随着越来越多的应用程序运行在容器里&#xff0c;各种容器安全事件也随之发生&#xff0c;例如攻击者可以通过容器应用获取容器控制权&#xff0c;利用失陷容器进行内网横向&#xff0c;并进一步逃逸到宿主机甚至攻击K8s集群。 容器的运行环境是相对独立而纯粹&#xff0c;当容…

redis客户端连接不上redis

总结 我先说一下&#xff0c;我觉得最有效就是把Linux防火墙tm的关了&#xff0c; 当我成功后&#xff0c;第二次连接时&#xff0c;防火墙开着&#xff0c;但是我能连接。 systemctl stop firewalled # 关闭防火墙 systemctl start firewalled # 开启防火墙 systemctl status …

利用DPU/IPU 卸载容器镜像以及文件系统的相关操作

1、背景和动机 随着云原生(Cloud Native)被工业界广泛接受&#xff0c;容器(container)在数据中心被广泛部署&#xff0c;其地位正在逐步取代传统的虚拟机(Virtual Machine)。当然目前依然存在用轻量虚拟机来运行和部署容器&#xff0c;比如使用Kata Containers。简单来讲&…

FPGA实现USB3.0 UVC 相机OV5640摄像头输出 基于FT602驱动 提供工程源码和QT上位机源码

目录 1、前言2、UVC简介3、FT602芯片解读4、我这儿的 FT601 USB3.0通信方案5、详细设计方案基于FT602的UVC模块详解 6、vivado工程详解7、上板调试验证8、福利&#xff1a;工程代码的获取 1、前言 目前USB3.0的实现方案很多&#xff0c;但就简单好用的角度而言&#xff0c;FT6…

2023 年 8 个最佳 React UI 组件库和框架

将展示八个最好的 React UI 组件库和框架&#xff0c;如下表所示&#xff1a;&#xff08;星标加关注&#xff0c;开车不迷路&#xff09; 「React Bootstrap&#xff1a;」一个与 Bootstrap 框架集成的实用的 React UI 库。「Grommet&#xff1a;」如果您想在设计中实现可访问…

基于Servlet+mysql+jsp学生宿舍信息管理系统

基于Servletmysqljsp学生宿舍信息管理系统 一、系统介绍二、功能展示1.用户登陆2.学生-主页面3.学生-缺勤记录4.学生-修改密码5.宿舍管理员-主页面6.宿舍管理员-学生查看7.宿舍管理员-缺勤记录8.系统管理员-宿舍管理员管理9.系统管理员-学生管理10.系统管理员-宿舍楼管理11.系统…

中高级前端面试秘籍,为你保驾护航金三银四

引言 各位大佬在评论中指出的种种问题小弟万分感谢。由于这一年来&#xff0c;出了不少变动&#xff0c;所以才一直耽搁&#xff0c;现已修复各位大佬指出的问题和建议。请大家放心食用&#xff01;感恩~&#x1f973; 当下&#xff0c;正面临着近几年来的最严重的互联网寒冬&a…

《文渊》期刊简介及投稿邮箱

《文渊》期刊简介及投稿邮箱 《文渊》是正规国家级连续型电子期刊&#xff0c;新闻出版广电总局可查&#xff0c;国家级教育核心刊物、中国核心期刊数据库收录期刊。 主管单位&#xff1a;中国出版传媒股份有限公司 主办单位&#xff1a;中国出版传媒股份有限公司 文渊&…

变量的线程安全分析

目录 变量的线程安全 常见线程安全类 变量的线程安全 成员变量和静态变量是否线程安全&#xff1f; 如果它们没有共享&#xff0c;则线程安全 如果它们被共享了&#xff0c;根据它们的状态是否能够改变&#xff0c;又分两种情况 如果只有读操作&#xff0c;则线程安全如果…