IIC通讯协议

article/2025/6/24 10:00:47

一、简介

IIC(Inter-integerted Circuit)集成电路总线,该通信协议由NXP(原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量场景下使用,传输距离短,任意时刻只能有一个主机的特性。

二、物理层

  1. IIC通信要求需要两条线路完成数据传输,一条是串行时钟线SCL和一条串行数据线SDA

使用线路:
时钟线 – SCL
数据线 – SDA
(IIC为半双工通信)

  1. 每个连接到总线上的设备都可以通过唯一的地址和其他器件通信,主机/从机角色和地址可以配置,主机可以作为主机发送器和主机接收器

三、协议内容

IIC通信协议把信息分为两种类型的帧

  1. 地址帧:用于Master指明信息该发往哪个Slave。(从设备地址)

  2. 数据帧:由Master发往Slave的数据或是Master接收到来自于Slave的数据(一次读写单位为8bit,高位先发)

四、数据传输状态

(1)数据为有效性规定

  1. 时钟信号为高电平(High)期间,数据线上的数据必须保持稳定

  2. 时钟信号为低电平(Low)期间,数据线上方才允许变化

即:数据在时钟线SCL的上升沿到来之前就需准备好,并在下降沿到来之前必须保持稳定

(2)空闲状态

逻辑解析:当IIC总线的数据线SDA和时钟信号当IIC总线的数据线SDA和时钟线SCL同时处于高电平(High)时,规定总线为空闲状态

此时各个器件输出及场效均处在截至状态

即:由两条信号线的上拉电阻把电平拉高

(3)起始信号

逻辑解析:时钟线SCL为高电平期间(High),数据线SDA由高电平向低电平变化(下降沿)表示起始信号
(在时钟线SCL为高电平时,拉低数据线SDA)
在这里插入图片描述

程序逻辑实现:

void IIC_Start(void)
{IIC_SDA_OUT();IIC_SDA = 1;IIC_SCL = 1;delay_us(5);IIC_SDA = 0;	// Start:在SCL为高电平时拉低SDAdelay_us(5);IIC_SCL = 0;
}

(4)终止信号

逻辑解析:时钟线SCL为高电平期间(High),数据线SDA由低电平向高电平变化(上升沿) 表示终止信号
(在时钟线SCL为高电平时,拉高数据线SDA)
在这里插入图片描述

程序逻辑实现:

void IIC_Stop(void)
{IIC_SDA_OUT();SCL = 0;SDA = 0;delay_us(5);SCL = 1;delay_us(5);SDA = 1;	// Stop:在SCL为高电平时,拉高SDAdelay_us(5);
}

(5)应答信号

逻辑解析:发送器每发送一个字节(8bit),就在第 9个时钟脉冲期间释放数据线,由接收器反馈一个应答信号。

  1. 应答位为低电平(Low Level)时,规定为有效应答位(ACK,简称应答位)

表示接收器已经成功接收了该字节数据

  1. 应答位为高电平(High Level)时,规定为无效应答位(nACK)

一般表示接收器没有接收成功该字节数据

对反馈有效应答信号的ACK的要求是:

  1. 接收器在第9个时钟脉冲之前的时钟线SCL低电平期间将数据线SDA拉低(Low),并且确保在该时钟的高电平期间为稳定的低电平(Low Level)

  2. 如果接收器是Master,则在它收到最后一个字节后发送一个nACK信号,以通知被控发送器结束数据发送,并释放数据线SDA,以便主控制器发送一个停止信号

程序逻辑实现:

// 1、Master接收ACK信号
uint8_t IIC_MasterWaitACK(void)
{uint8_t uErrTime = 0;IIC_SDA_OUT();IIC_SDA = 1;delay_us(2);IIC_SCL = 1;delay_us(2);IIC_SDA_IN();while(IIC_SDAin){uErrTime++;if(uErrTime > 300){IIC_SDA_OUT();IIC_Stop();return 1;	// 应答失败}}IIC_SDA_OUT();IIC_SCL = 0;return 0;	// 应答成功
}
// 2、Master发送ACK信号
void Master_SendAck(void)
{IIC_SCL=0;IIC_SDA_OUT();IIC_SDA=0;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}
// 3、Master不发送ACK信号
void Master_SendnAck(void)
{IIC_SCL = 0;IIC_SDA_OUT();IIC_SDA = 1;delay_us(2);IIC_SCL = 1;delay_us(2);IIC_SCL = 0;
}			

(6)数据传输格式

字节传输与应答

  1. 每一个字节必须保证是8bit长度

  2. 数据传送时先传最高位(MSB)

  3. 每一个被传送的字节后面都必须跟随1bit的应答位(即每一帧数据共9bit)

在IIC总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制)

即:在时钟线SCL串行时钟的配合下,在数据线SDA上逐位的串行传送每一位数据

数据位传输是边沿触发

(7)总线寻址

IIC协议采用7bit的寻址字节(寻址字节是起始信号的第一个字节)

数据位定义:

| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |

D7 ~ D1位:从机地址
D0位:数据传输方向(读写位)

  0:表示主机向从机写数据1:表示主机向从机读数据

主机向从设备中写寄存器(数据格式)

在这里插入图片描述

主机向从设备中读寄存器值(数据格式)

在这里插入图片描述

(8)数据收发

使用IIC通讯协议进行数据的接收与发送逻辑(单字节实现)

程序逻辑实现

void IIC_SendByte(uint8_t Data)
{uint8_t i;IIC_SDA_OUT();IIC_SCL = 0;for(i=0; i<8; i++){IIC_SDA = ((Data&0x80)==0x80)?1:0;Data <<= 1;delay_us(2);IIC_SCL = 1;delay_us(5);IIC_SCL = 0;delay_us(2);}
}
uint8_t IIC_ReadByte(uint8_t ack)
{uint8_t i,receive=0;IIC_SDA_IN();for(i=0; i<8; i++){ IIC_SCL = 0; delay_us(2);        IIC_SCL   = 1;	 receive <<= 1;if(IIC_SDAin)receive |= 0x01; delay_us(2);		}	  if(!ack)Master_nAckCTP();elseMaster_AckCTP();IIC_SDA_OUT();return receive;
}

http://chatgpt.dhexx.cn/article/thBX9gTq.shtml

相关文章

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

搜狗搜索正式接入微信公众号 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;而…

从哪一刻开始,我成了资深工程师

“ 我成了资深工程师&#xff01;” 当说这句话时&#xff0c;我们可能同时表达了两层含义&#xff1a;我在能力素质上是一位资深工程师了&#xff1b;我的 Title 更新为资深工程师了。 这两者之间有着必然联系。虽然 Title 的更新是一瞬间的事儿&#xff0c;但在其背后&…

一名测试开发工程师的内心自白,被裁员之前,没得到任何风声,措手不及......

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结 前言 一个码农&#xff08;测试开发&#xff09;的自白 小…

前端小白奋斗史07

em 倾斜标签 ins 下划线标签 alter 替换文本 title 提示文本 target 目标窗口弹出方式 _blank _self 锚点链接 快速定位页面位置 特殊标签 空格 &#xff06;nbsp 你不是胖 &#xff1c; &#xff06;it &#xff1e; &gt element语法 父子记关系标签 ul&#xff1…