三大通信协议(二):IIC通信协议

article/2025/6/24 9:57:24

目录

  • 1. 概念
  • 2. 硬件连接
  • 3. 数据传输协议
    • 3.1 开始信号
    • 3.2 地址位
    • 3.3 读写位(R/W)
    • 3.4 应答位(ACK / NACK)
    • 3.5 数据位(8Bit)
    • 3.6 停止信号
  • 4. 软件编写
    • 4.1 初始化
    • 4.2 开始信号
    • 4.3 IIC发送一个字节数据
    • 4.4 IIC读取一个字节
    • 4.5 停止信号
  • 参考资料

1. 概念

  • 是什么?

I²C(Inter-Integrated Circuit),中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,是由飞利浦公司在1980年代初设计的,方便了主板、嵌入式系统或手机与周边设备组件之间的通讯。由于其简单性,它被广泛用于微控制器与传感器阵列,显示器,IoT设备,EEPROM等之间的通信。

  • 优点
    1. 仅需要两条总线即可通讯(大大的节约了IO口资源)
    2. 最大主机数量:无限制。最大从机限制:理论127
      (一个主机多个从机,一对多,多对一,多对多)

2. 硬件连接

  • I²C协议仅需要一个SDA(串行数据线)和SCL(串行时钟线)引脚。这两条数据线需要接上拉电阻
  • 上拉电阻使用典型的4.7kΩ
  • 使用I2C设备灌电流不得超过3mA
  • 逻辑0电压不得高于0.4V
    在这里插入图片描述

I²C总线(SDA,SCL)内部都使用漏极开路驱动器(开漏驱动),因此SDA和SCL 可以被拉低为低电平,但是不能被驱动为高电平,所以每条线上都要使用一个上拉电阻,默认情况下将其保持在高电平;
在这里插入图片描述

3. 数据传输协议

主设备和从设备进行数据传输时遵循以下协议格式。
数据通过一条SDA数据线在主设备和从设备之间传输0和1的串行数据。串行数据序列的结构可以分为,开始条件,地址位,读写位,应答位,数据位,停止条件,具体如下所示;

在这里插入图片描述

  1. 主机(Master)发送开始信号给从机(Slave),唤醒所有主从机
  2. 主机发送7位的地址位和1位的读写位给从机
  3. 等待地址匹配从机的应答信号
  4. 主机发送或接收数据到从机
  5. 在传输完每个数据帧后,接收设备将另一个ACK位返回给发送方,以确认已成功接收到该帧:
  6. 结束之后主机发出停止信号

3.1 开始信号

当主设备决定开始通讯时,需要发送开始信号,需要执行以下动作:

  1. 先将SDA线从高压电平切换到低压电平;
  2. 然后将SCL从高电平切换到低电平;

在主设备发送开始条件信号之后,所有从机即使处于睡眠模式也将变为活动状态,并等待接收地址位。
在这里插入图片描述

3.2 地址位

7位组成的地址位
主设备如果需要向从机发送/接收数据,首先要发送对应从机的地址,然后会匹配总线上挂载的从机的地址;

3.3 读写位(R/W)

该位指定数据传输的方向:

  • 如果主设备需要将数据发送到从设备,则该位设置为 0
  • 如果主设备需要往从设备接收数据,则将其设置为 1

3.4 应答位(ACK / NACK)

主机每次发送完数据之后会等待从设备的应答信号ACK:

  • 在第9个时钟信号,如果从设备发送应答信号ACK,则SDA会被拉低;
  • 若没有应答信号NACK,则SDA会输出为高电平,这过程会引起主设备发生重启或者停止;
    在这里插入图片描述

3.5 数据位(8Bit)

传输的数据总共有8位,由发送方设置,它需要将数据位传输到接收方。(这个则是cmd或者data)

发送之后会紧跟一个ACK / NACK位,如果接收器成功接收到数据,则设置为0。否则,它保持逻辑1。

  • 8DataBit+AckBit、8DataBit+AckBit…直到数据发送完进行下一次才接上Stop信号

3.6 停止信号

当主设备决定结束通讯时,需要发送开始信号,需要执行以下动作:

  1. 先将SDA线从低电压电平切换到高电压电平;
  2. 再将SCL线从高电平拉到低电平;

具体如下图所示:
在这里插入图片描述

4. 软件编写

4.1 初始化

void IIC_init()//IIC初始化
{SCL=1; //首先把时钟线拉高delay_us(4);//延时函数SDA=1; //在SCL为高的情况下把SDA拉高delay_us(4); //延时函数
}

4.2 开始信号

//产生IIC起始信号
//1.先拉高SDA,再拉高SCL,空闲状态
//2.拉低SDA
void IIC_Start()//启动信号
{SDA=1; //确保SDA线为高电平delay_us(5);SCL=1;  //确保SCL高电平delay_us(5);//以下这一步产生了开始信号的脉冲SDA=0; //在SCL为高时拉低SDA线,即为起始信号delay_us(5);
}

4.3 IIC发送一个字节数据

//IIC发送一个字节
//返回: 从机有无应答
//1,有应答
//0,无应答            //只有当SCL被拉低后,SDA才能被改变
//总结:在SCL为低电平期间,发送数据,发送8次数据,数据为1,SDA被拉高,数据为0,SDA被拉低。
//传输期间保持传输稳定,所以数据线仅可以在时钟SCL为低电平时改变。
void IIC_Send_Byte(u8 txd)
{                        u8 t;   SDA_OUT();         IIC_SCL=0;//拉低时钟开始数据传输for(t=0;t<8;t++){              //IIC_SDA=(txd&0x80)>>7;   //获取最高位//获取数据的最高位,然后左移7位//如果某位为1,则SDA为1,否则相反if((txd&0x80)>>7)IIC_SDA=1;elseIIC_SDA=0;txd<<=1;       delay_us(2);   IIC_SCL=1;delay_us(2); IIC_SCL=0;    delay_us(2);}     
}       

4.4 IIC读取一个字节


//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 IIC_Read_Byte(unsigned char ack)
{unsigned char i,receive=0;SDA_IN();        //SDA设置为输入for(i=0;i<8;i++ ){IIC_SCL=0; delay_us(2);IIC_SCL=1;receive<<=1;if(READ_SDA)receive++;   delay_us(1); }					 if (!ack)IIC_NAck();        //发送nACK,表示不再接收数据elseIIC_Ack();         //发送ACK   return receive;
}

4.5 停止信号

//产生IIC停止信号
//1.先拉低SDA,再拉低SCL
//2.拉高SCL
//3.拉高SDA
//4.停止接收数据
void IIC_Stop(void)
{IIC_SCL=0;IIC_SDA=0;    //STOP:当SCL高时,数据由低变高delay_us(4);IIC_SCL=1; IIC_SDA=1;    //发送I2C总线结束信号delay_us(4);							   	
}

参考资料

I2C协议靠这16张图彻底搞懂(超详细)
IIC原理超详细讲解—值得一看


http://chatgpt.dhexx.cn/article/6qS9CWTw.shtml

相关文章

IIC通信协议总结

&#xff08;1&#xff09;概述 I2C(Inter-Integrated Circuit BUS) 集成电路总线&#xff0c;该总线由NXP&#xff08;原PHILIPS&#xff09;公司设计&#xff0c;多用于主控制器和从器件间的主从通信&#xff0c;在小数据量场合使用&#xff0c;传输距离短&#xff0c;任意时…

IIC通信协议,搞懂这篇就够了

注&#xff1a;公众号后台发送 “IIC” 即可获取基于STM32上实现软件模拟IIC的完整代码。 I2C(IIC)属于两线式串行总线&#xff0c;由飞利浦公司开发用于微控制器(MCU)和外围设备(从设备)进行通信的一种总线&#xff0c;属于一主多从(一个主设备(Master)&#xff0c;多个从设备…

IIC通讯协议

一、简介 IIC&#xff08;Inter-integerted Circuit&#xff09;集成电路总线&#xff0c;该通信协议由NXP&#xff08;原PHILIPS&#xff09;公司设计&#xff0c;多用于主控制器和从器件间的主从通信&#xff0c;在小数据量场景下使用&#xff0c;传输距离短&#xff0c;任意…

搜狗搜索正式接入微信公众号

搜狗搜索正式接入微信公众号 6月9日中午消息&#xff0c;搜狗搜索今日宣布正式接入微信公众号数据。用户将在搜狗搜索页面查询和浏览微信公众号文章。 据悉&#xff0c;在搜狗搜索框中输入微信公众号关键词&#xff0c;便可在搜索结果页中查看相关微信公众号的文章列表&#xf…

Python爬虫 selenium自动化 利用搜狗搜索爬取微信公众号文章信息

少年最好的地方就是:虽然嘴上说要放弃,心底却总会憋着一口气。——刘同 文章目录 一、需求和网页分析二、selenium爬虫一、需求和网页分析 URL:https://weixin.sogou.com/ 你是否有特别喜欢的一些公众号文章,比如说关于网易云热评的。 我那么多遗憾,那么多期盼,你知道…

RSS订阅微信公众号初探-feed43

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

python爬虫爬取微信公众号历史文章链接

一、最近公司有了要爬取微信公众号文章链接的需求&#xff0c;之前最初接触爬公众号文章的时候&#xff0c;用的是搜狗微信&#xff0c;在这个上面可以搜到相关的微信公众号文章&#xff0c;但是这些链接是有时效性的&#xff0c;第二天链接就打不开了&#xff08;不知道现在是…

python抓取搜狗微信公众号文章

初学python&#xff0c;抓取搜狗微信公众号文章存入mysql mysql表&#xff1a; 代码&#xff1a; import requests import json import re import pymysql# 创建连接 conn pymysql.connect(host你的数据库地址, port端口, user用户名, passwd密码, db数据库名称, charsetut…

搜狗微信文章采集php,[造轮子]爬取搜狗微信公众号文章

背景&#xff1a;想做一个公众号文章资源APP&#xff0c;发现搜狗有搜索公众号文章功能&#xff0c;果断开撸。http://wxiread.com (用CMS搭了个简易的站)。 Step1.分析栏目及接口 搜狗分了20个栏目&#xff0c;分别是 热门,推荐,段子手,养生堂,私房话… 对应地址从 /pcindex/p…

微信公众号的“温柔一刀”,搜狗微信搜索部分功能将被下线

作为搜狗的单一最大股东&#xff0c;腾讯与搜狗之间的联系向来就很紧密&#xff0c;其中包括搜搜被并入搜狗、微信公众号的搜索功能划分给搜狗、腾讯新闻、QQ浏览器等腾讯系产品的搜索功能全部换成搜狗。腾讯对搜狗的支持是显而易见的&#xff0c;但若有利益冲突的情况下&#…

【scrapy爬虫】最新sogou搜狗搜索 机智操作绕过反爬验证码(搜狗微信公众号文章同理)

前情提要 此代码使用scrapy框架爬取特定“关键词”下的搜狗常规搜索结果&#xff0c;保存到同级目录下csv文件。并非爬取微信公众号文章&#xff0c;但是绕过验证码的原理相同。如有错误&#xff0c;希望大家指正。 URL结构 https://www.sogou.com/web?query{关键词}&p…

利用搜狗抓取微信公众号文章

微信一直是一个自己玩的小圈子&#xff0c;前段时间搜狗推出的微信搜索带来了一丝曙光。搜狗搜索推出了内容搜索和公众号搜索两种&#xff0c;利用后者可以抓取微信公众号的最新内容&#xff0c;看了下还是比较及时的。 每个公众号都有一个openid&#xff0c;最早可以直接利用…

html语言判断水仙花数,水仙花数判断讲解

今天要讲解的这道题是 水仙花数判断 题目要求 本题要求实现一个函数&#xff0c;判断任一整数是否为水仙花数(必须是三位数&#xff0c;且数的每一位上数字的立方和与数本身相等)。例如1531^35^33^3112527153&#xff0c;而1或155则不是水仙花数。如果是水仙花数&#xff0c;则…

水仙花数的求解思路

目录 水仙花数输入一个数&#xff0c;求解从0到这个数的所有水仙花数 解题思路源代码&#xff1a;注意事项 水仙花数 在以前的博客之中写过求解水仙花数的博客 详情见下面链接&#xff1a; 求解水仙花数 在这里就主要写求解水仙花数的思路 输入一个数&#xff0c;求解从0到这…

计算水仙花数有哪些

计算水仙花数有哪些 一、介绍水仙花数二、使用while循环计算水仙花数1.源代码2.运行结果 三、使用for循环计算水仙花数1.执行代码部分2.运行结果3.源代码 一、介绍水仙花数 水仙花数指的是三位整数中每个数的立方之和等于本身的数 二、使用while循环计算水仙花数 1.源代码 …

水仙花数

一、描述&#xff1a; 所谓的“水仙花数”是指一个三位数其各位数字的立方和等于该数本身。 例如153是“水仙花数”&#xff0c;因为&#xff1a;153 13 53 33。 在数论中&#xff0c;水仙花数&#xff08;Narcissistic number&#xff09;也称为自恋数、自幂数、阿姆斯壮…

prgrmz的作品集

符号化执行(基于klee)生成测试用例初探 lstm广告点击量预测案例 一般蔬菜类果实无人采摘方案&#xff08;算法&#xff09; 分页页面通用爬虫建模(一般优化问题) 机器学习练习 概率图模型应用例子&#xff1a;图像分割 概率图模型应用例子&#xff1a;立体视觉 概率图模型…

全干工程师的自我修养---vue第一部分

全干工程师的自我修养—vue第一部分 1、环境搭建 主要是搭建nodejs环境&#xff0c;设置淘宝源及安装cnpm&#xff0c;在之前的文章中有提到过&#xff0c;就不再赘述。 接下来全局安装vue脚手架&#xff1a; cnpm install vue-cli -g这样就可以成功安装了&#xff0c;安装…

从业两年时间,我被一个女前端鄙视了!

学测试一定要找准方向&#xff0c;避免做无用功&#xff0c;可以看看现在的测试行业市场行情&#xff1a;测试行业现状分析及测试人员能力标准 早在四年前在深圳打拼的日子&#xff0c;第一家企业我就被一个女前端深深上了一课&#xff01; 看似很平常的几句话&#xff0c;其实…

职场摸爬滚打的卑微软件测试工!外包干了三年后,我废了...

去年国庆&#xff0c;我分享了一次一位阿里朋友的技术生涯&#xff0c;大家反响爆蓬&#xff0c;感觉十分有意思&#xff0c;今天我来分享一下我另一位朋友的真实经历&#xff0c;是不是很想听&#xff1f; 没错&#xff0c;我这位朋友是曾经外包公司的测试开发&#xff0c;而…