IIC 通信协议 (一)

article/2025/7/14 23:02:40




目录

引言

IIC协议

1、历史

2、特点

3、信号线

4、主从关系

5、通信过程

6、协议规范

地址

1、器件地址

2、存储器地址

读写时序

1、写时序

1.1、单字节写时序

1.2、连续写时序

2、读时序

2.1、单字节读时序

2.2、连续读时序

参考声明




引言

这个专栏闲置好久了,最近忙里偷闲想学一下IIC通信的协议以及对应的FPGA实现。顺便以博客的形式记录一下~

本篇博文主要就是介绍与 IIC 通信相关的基础内容。


IIC协议

1、历史

IIC总线由飞利浦公司在上世纪80年代推出的总线协议。

2、特点

IIC总线属于串行、同步、低速、低距、半双工、多主机的通信协议。

3、信号线

2根信号线,一根时钟线(SCL),一根数据(地址)线(SDA)。

4、主从关系

 IIC总线上相互通信的设备,可以分为两类,即主设备和从设备。

主设备有权利主动发起、结束一次通信。从设备只能被动响应。如果总线上有多个设备同时启用总线,IIC有自身的检测和仲裁机制,防止产生错误。

连接在IIC总线上的设备都有一个唯一的地址(典型的地址位宽:7bits,也有10bits),每个设备都可以作为主机或从机,BUT,同一时刻只能有一个主机存在

对于7位地址线位宽的地址寻址:

 

5、通信过程

  1. 主机发送起始信号 启用IIC总线;
  2. 主机发送一个字节数据指示从机地址以及读写方向;
  3. 被寻址的从机发送应答信号回应主机;
  4. 发送器发送一个字节的数据;
  5. 接收器发送应答信号回应接收器;
  6. 重复4 5 步骤;
  7. 主机发送停止信号释放 IIC 总线;

6、协议规范

1、时钟信号为高电平期间,数据总线必须保持稳定,时钟信号为低电平时,数据总线才能变化。示意图如下:

 2、时钟信号为高电平时,数据信号由高电平跳变到低电平为总线的 起始信号;由低电平跳变到高电平为总线的停止信号。示意图:空闲时,SCL信号和SDA信号均为高电平。

 3、当IIC 主机(不一定是发送端还是接受端)将8 位数据或命令传出后,会将数据总线(SDA)释放,然后等待从机应答(低电平0 表示应答,1 表示非应答),此时的时钟仍然是主机提供的。示意图:

 4、数据帧格式,I2C 器件通讯的时候首先是要发送“起始信号”,紧跟着就是七位器件地址,第八位是数据传送方向位(0:代表写,1:代表读),再后面就是等待从机的应答。当然传送结束后,“终止信号”也是由主机来产生的。发送数据的时候是高位先发送。IIC 一帧数据有9位,8个数据位加1个应答位。

地址

1、器件地址

从机的器件地址,一般是器件本身在制造完成就已经确定,或者部分确定。以AT24C64为例:

 

2、存储器地址

这个存储器地址分为单字节和双字节两种:

单字节:

 双字节:

 

读写时序

典型时序图:

1、主机——>从机

 蓝色表示数据源自主机,黄色表示数据源自从机。绿色表示数据循环发送。S表示起始信号,P表示结束信号,A表示应答信号。在主机发送停止信号前的应答信号一般为不应答。

2、从机——>主机

  蓝色表示数据源自主机,黄色表示数据源自从机。绿色表示数据循环发送。S表示起始信号,P表示结束信号,A表示应答信号。在主机发送停止信号前的应答信号一般为不应答。

3、主机——>从机 (先)        从机——>主机 (后)

 注意此处重新发起通信 更改发送方向,主从机并没有改变,可以不发送停止信号。即使从机更改了,主机也可以不发送停止信号,直接与另一个从机开始新的通信。因为如果主机发送了停止信号,总线被释放,释放后可能被其他的主机抢下总线的使用权。

1、写时序

1.1、单字节写时序

单字节 存储器地址:

 

 时序过程描述:

1、主机设置SDA 为输出
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为0,表明为写操作;
4、主机设置SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置SDA 为输出,传输1 字节地址数据;
6、主机设置SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机设置SDA 为输出,传输待写入的数据;
8、设置SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功,主机产生STOP 位,终止传输。

双字节 存储器地址:

时序过程描述:

1、主机设置SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为0,表明为写操作;
4、主机设置SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置SDA 为输出,传输地址数据高字节;
6、主机设置SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机设置SDA 为输出,传输地址数据低字节;
8、设置SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功,主机设置SDA 为输出,传输待写入的数据;
10、设置SDA 为三态门输入,读取从机应答信号;
11、读取应答信号成功,主机产生STOP 位,终止传输。

1.2、连续写时序

单字节 存储器地址:

1、主机设置SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为0,表明为写操作;
4、主机设置SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置SDA 为输出,传输1 字节地址数据;
6、主机设置SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机设置SDA 为输出,传输待写入的第1 个数据;
8、设置SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功后,主机设置SDA 为输出,传输待写入的下一个数据;
10、设置SDA 为三态门输入,读取从机应答信号;n 个数据被写完,转到步骤11,若数据未被写完,转到步骤9;
11、读取应答信号成功,主机产生STOP 位,终止传输。

双字节 存储器地址:

1、主机设置SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为0,表明为写操作;
4、主机设置SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置SDA 为输出,传输地址数据高字节;
6、主机设置SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机设置SDA 为输出,传输地址数据低字节;
8、设置SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功,主机设置SDA 为输出,传输待写入的第1 个数据;
10、设置SDA 为三态门输入,读取从机应答信号;
11、读取应答信号成功后,主机设置SDA 为输出,传输待写入的下一个数据;
12、设置SDA 为三态门输入,读取从机应答信号;n 个数据被写完,转到步骤13,若数据未被写完,转到步骤11;
13、读取应答信号成功,主机产生STOP 位,终止传输。
 

2、读时序

2.1、单字节读时序

单字节 存储器地址:

1、主机设置SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为0,表明为写操作;

4、主机设置SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置SDA 为输出,传输1 字节地址数据;
6、主机设置SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机发起起始信号;
8、主机传输器件地址字节,其中最低位为1,表明为读操作;
8、设置SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功,主机设置SDA 为三态门输入,读取SDA 总线上的一个字节的数据;
10、产生无应答信号(高电平)(无需设置为输出高电平,因为总线会被自动拉高);
11、主机产生STOP 位,终止传输。

双字节 存储器地址:

1、主机设置SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为0,表明为写操作;
4、主机设置SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置SDA 为输出,传输地址数据高字节;
6、主机设置SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机设置SDA 为输出,传输地址数据低字节;
8、设置SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功,主机发起起始信号;
10、主机传输器件地址字节,其中最低位为1,表明为读操作;
11、设置SDA 为三态门输入,读取从机应答信号;
12、读取应答信号成功,主机设置SDA 为三态门输入,读取SDA 总线上的一个字节的
数据;
13、主机设置SDA 输出,产生无应答信号(高电平)(无需设置为输出高电平,因为总
线会被自动拉高);
14、主机产生STOP 位,终止传输。

2.2、连续读时序

单字节 存储器地址:

 

1、主机设置SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为0,表明为写操作;
4、主机设置SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置SDA 为输出,传输1 字节地址数据;
6、主机设置SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机发起起始信号;
8、主机传输器件地址字节,其中最低位为1,表明为读操作;
9、设置SDA 为三态门输入,读取从机应答信号;
10、读取应答信号成功,主机设置SDA 为三态门输入,读取SDA 总线上的第1 个字节的数据;
11、主机设置SDA 输出,发送一位应答信号;
12、设置SDA 为三态门输入,读取SDA 总线上的下一个字节的数据;若n 个字节数据
读完成,跳转到步骤13,若数据未读完,跳转到步骤11;(对于AT24Cxx,一次读取长度最大为32 字节,即n 不大于32)
13、主机设置SDA 输出,产生无应答信号(高电平)(无需设置为输出高电平,因为总线会被自动拉高);
14、主机产生STOP 位,终止传输。

双字节 存储器地址:

 

1、主机设置SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为0,表明为写操作;
4、主机设置SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置SDA 为输出,传输地址数据高字节;
6、主机设置SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机设置SDA 为输出,传输地址数据低字节;
8、设置SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功,主机发起起始信号;
10、主机传输器件地址字节,其中最低位为1,表明为读操作;
11、设置SDA 为三态门输入,读取从机应答信号;
12、读取应答信号成功,主机设置SDA 为三态门输入,读取SDA 总线上的第1 个字节的数据;
13、主机设置SDA 输出,发送一位应答信号;
14、设置SDA 为三态门输入,读取SDA 总线上的下一个字节的数据;若n 个字节数据读完成,跳转到步骤15 ,若数据未读完,跳转到步骤 13 ;(对于 AT24Cxx ,一次读取长度最大为 32 字节,即 n 不大于 32

15、主机设置 SDA 输出,产生无应答信号(高电平)(无需设置为输出高电平,因为总线会被自动拉高);
16、主机产生 STOP 位,终止传输。

参考声明

【1】 创客学院视频;

【2】芯路恒开发板教程;


http://chatgpt.dhexx.cn/article/4dlwnZ7f.shtml

相关文章

基础通信协议之 IIC (I2C) 详细讲解

IIC是当今嵌入式应用中最常见的串行通信协议之一。对比OneWire严苛的时序要求,SPI等更多的线缆要求,IIC处于一个折中的位置:不那么多的2根线缆的硬件要求,不那么复杂严苛的时序要求,便可进行多主多从的双向通信&#x…

IIC 通信协议 (二)

目录 引言 子模块设计 思路 单字节 IIC 发送模块 思路 Verilog 源码 多字节发送控制模块 思路 Verilog 源码 仿真 思路 test bench 仿真结果 参考声明 引言 本篇博文承接前文,继续做 IIC 通信协议 FPGA实现相关的内容。用Verilog 编写一个 IIC 通信控…

IIC通信协议(硬件实现IIC通信详解I)

IIC通信协议 什么是IIC协议协议层起始信号和停止信号数据的有效性 什么是IIC协议 I2C(Inter-Integrated Circuit)通讯协议是由 Phiilps 公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准…

详解通信协议之IIC通信协议

详解通信协议之IIC通信协议 本文结合AT24C02对IIC通信协议原理进行了描述。 IIC通信协议(以AT24C02为例) IIC通讯协议(Inter-Integrated Circuit)是由 Philips 公司开发双向同步半双工串行总线,只需要两根线(SDA、SCL)即可在连接于总线上的器件之间传…

IIC(I2C)通信协议详解

简介 I2C 是飞利浦公司设计的,一种很常见的总线协议, I2C 使用两条线在主控制器和从机之间进行数据通信。一条是 SCL(串行时钟线),另外一条是SDA(串行数据线),这两条数据线需要接上拉电阻,总线空闲的时候 SCL 和 SDA …

IIC 通信协议

一、IIC 通信协议介绍 IIC(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。 如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,以管理系统…

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

目录 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读…

IIC通信协议总结

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

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则不是水仙花数。如果是水仙花数,则…