IIC通信协议总结

article/2025/6/23 14:28:24

(1)概述

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

经常IIC和SPI接口被认为指定是一种硬件设备,但其实这样的说法是不尽准确的,严格的说他们都是人们所定义的软硬结合体,分为物理层(四线结构)和协议层(主机,从机,时钟极性,时钟相位)。

IIC,SPI的区别不仅在与物理层,IIC比SPI有着一套更为复杂的协议层定义。下面来分别说明一下IIC的物理层和协议层。

(2)IIC的物理层

a.只要求两条总线线路,一条是串行数据线SDA,一条是串行时钟线SCL。(IIC是半双工,而不是全双工)。

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

c.IIC是真正的多主机总线,(而这个SPI在每次通信前都需要把主机定死,而IIC可以在通讯过程中,改变主机),如果两个或更多的主机同时请求总线,可以通过冲突检测和仲裁防止总线数据被破坏。

d.传输速率在标准模式下可以达到100kb/s,快速模式下可以达到400kb/s。

e.连接到总线的IC数量只是受到总线的最大负载电容400pf限制。

一个典型的IIC接口如下图(1)所示


图(1)

(3)IIC的协议层

IIC的协议层才是掌握IIC的关键。现在简单概括如下:

a.数据的有效性

在时钟的高电平周期内,SDA线上的数据必须保持稳定,数据线仅可以在时钟SCL为低电平时改变。

如图(2)所示:


      图(2)

b.起始和结束条件

起始条件:当SCL为高电平的时候,SDA线上由高到低的跳变被定义为起始条件,结束条件:当SCL为高电平的时候,SDA线上由低到高的跳变被定义为停止条件,要注意起始和终止信号都是由主机发出的,连接到I2C总线上的器件,若具有I2C总线的硬件接口,则很容易检测到起始和终止信号。总线在起始条件之后,视为忙状态,在停止条件之后被视为空闲状态,对起始条件和结束条件的描述如下图(3)所示。


图(3)

c.应答

每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据,从机应答主机所需要的时钟仍是主机提供的,应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答,1表示非应答,如图(4)所示。


图(4)

d.数据帧格式

I2C总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。
在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向位(R/T),用“0”表示主机发送数据(T),“1”表示主机接收数据(R)。{这里小编在驱动MPU6050模块的时候,就犯过这样的错误,它写的MPU6050从机地址是0x68,因为发送从机地址的时候,要加一位读写方向位,因为刚开始应该是向这个MPU6050里写从机里某个寄存器的地址,所以应该是7位地址   0x68(1101000)+二进制位0=11010000)也就是0xD0,表示要向该IIC设备里写东西,然后再紧接着写入IIC设备里的寄存器地址,而我直接写入了0x68,导致出错}每次数据传送总是由主机产生的终止信号结束。但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。
在总线的一次数据传输过程中,可以有以下几种组合方式:
[1]
主机向从机发送数据,数据传送方向在整个传送过程中不变:

注:有阴影部分表示数据由主机向从机传送,无阴影部分则表示 数据由从机向主机传送。
    A 表示应答(低电平), A 非表示非应答(高电平)。 S 表示起始信号, P 表示终止信号。
[2]主机在第一个字节后,立即从从机读数据:

[3]在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好反相:


一般情况下,[3]是比较常见的,比如MPU6050模块,
发送起始信号
等待从机应答
写一个从机地址+0(表示写),
等待从机应答
发送一个字节的MPU6050加速度存储寄存器地址,
等待从机应答
再发送一次起始信号
等待从机应答
写一个从机地址+1(表示读)
等待从机应答
读取MPU6050传感器数据
主机非应答
e.IIC信号的模拟
主机可以采用不带I2C总线接口的单片机,如80C51、AT89C2051等单片机,利用软件实现I2C总线的数据传送,即软件与硬件结合的信号模拟。即使是含有IIC硬件的单片机(如stm32 103系列)也有一定的缺陷,所以一般也会模拟IIC的时序。现将具体时间截图如下:

具体的程序代码如下:

//产生起始信号
void I2C_Start(void)
{
    I2C_SDA_OUT();//配置一下引脚,引脚设置为输出

I2C_SDA_H;//把数据线拉高
I2C_SCL_H;//把时钟线拉高
delay_us(5);//延时5微秒,要求大于4.7微秒
I2C_SDA_L; //拉低,产生下降沿
delay_us(6);//这个过程大于4微秒
I2C_SCL_L;//最后一定要把这个时钟线拉低,因为只有时钟线拉低的时候才允许数据变化。
}
//产生停止信号
void I2C_Stop(void)
{
   I2C_SDA_OUT();


   I2C_SCL_L;
   I2C_SDA_L;
   I2C_SCL_H;
   delay_us(6);
   I2C_SDA_H;
   delay_us(6);
}
//主机产生应答信号ACK
void I2C_Ack(void)
{
   I2C_SCL_L;
   I2C_SDA_OUT();
   I2C_SDA_L;
   delay_us(2);
   I2C_SCL_H;
   delay_us(5);
   I2C_SCL_L;
}


//主机不产生应答信号NACK
void I2C_NAck(void)
{
   I2C_SCL_L;
   I2C_SDA_OUT();
   I2C_SDA_H;
   delay_us(2);
   I2C_SCL_H;
   delay_us(5);
   I2C_SCL_L;
}
//等待从机应答信号,我们只负责主机应答信号的产生,从机应答信号
//我们不控制。
//返回值:1 接收应答失败
//  0 接收应答成功
u8 I2C_Wait_Ack(void)
{
u8 tempTime=0;


I2C_SDA_IN(); //配置为上拉输入。


I2C_SDA_H; //主机释放数据总线,等待从机产生应答信号
delay_us(1);
I2C_SCL_H;
delay_us(1);
//等待从机对数据总线的操作。低电平代表应答
while(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA))
{
tempTime++;
//这个属于软件延时,不一定准确。
if(tempTime>250) //如果时间超时,没有应答就停止。
{
I2C_Stop();
return 1;  //没有响应的话返回1.
}  
}


I2C_SCL_L;
return 0; //如果有响应的话就返回0.
}






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

相关文章

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

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

IIC通讯协议

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

水仙花数的求解思路

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

计算水仙花数有哪些

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

水仙花数

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

prgrmz的作品集

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

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

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

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

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

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

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

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

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