目录

引言

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】芯路恒开发板教程;

IIC 通信协议 (一)相关推荐

  1. IIC 通信协议 (二)

    目录 引言 子模块设计 思路 单字节 IIC 发送模块 思路 Verilog 源码 多字节发送控制模块 思路 Verilog 源码 仿真 思路 test bench 仿真结果 参考声明 引言 本篇博文 ...

  2. IIC通信协议详解 PCF8591应用(Verilog实现FPGA)

    IIC通信协议详解 & PCF8591应用(Verilog实现/FPGA) 该文章结合PCF8591 8-bit AD/DA 模数/数模转换器来详细介绍IIC通信协议,尽量做到条理清晰,通俗易 ...

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

    IIC通信协议 什么是IIC协议 协议层 起始信号和停止信号 数据的有效性 什么是IIC协议 I2C(Inter-Integrated Circuit)通讯协议是由 Phiilps 公司开发的两线式串 ...

  4. 基于STM32F103C8T6的IIC通信协议及硬件通信和软件OLED温度显示项目

    #一.IIC协议简介 #二.IIC总线系统结构 #三.IIC总线物理层特点 #四.软/硬件IIC总线 #五.IIC总线协议层 #六.IIC通信结构 ##1.空闲状态 ##2.开始信号 ##3.停止信号 ...

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

    注:公众号后台发送 "IIC" 即可获取基于STM32上实现软件模拟IIC的完整代码. I2C(IIC)属于两线式串行总线,由飞利浦公司开发用于微控制器(MCU)和外围设备(从设备 ...

  6. STM32基于IIC通信协议的OLED模块使用(详解)

    目录 前言 一.项目内容 实验简介 二.IIC模块 1.IIC协议简介 2.物理层 3.协议层 4.硬件IIC代码配置 5.软件模拟IIC配置 1.起始信号与停止信号 2.从机应答信号 3.数据的有效 ...

  7. 51单片机IIC通信协议

    IIC头文件 /*------------------------------------------------------------------------------* @file I2C.H ...

  8. 进阶项目(9)IIC通信协议程序设计讲解

    写在前面的话 IIC的通信协议和通信接口在很多工程中有广泛的应用,如数据采集领域的串行AD,图像处理领域的摄像头配置,工业控制领域的X射线管配置等等.除此之外,由于IIC协议占用的IO资源特别少,连接 ...

  9. IIc通信协议(一)

    -->物理结构: -->通信原理:通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递.在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高 ...

最新文章

  1. 基克的聚合 机器人_新版本辅助装大改 基克的聚合不能错过
  2. 【带你玩转主题模型Topic Model】—— 之 利用sklearn 实现Latetnt Dirichlet Allocation(LDA)主题模型
  3. android sql 顺序执行问题,怎么才能执行第一个完毕,才能继续执行第二个
  4. ASP.NET AJAX Client Library: 更繁?更简?
  5. vim中开shell
  6. POJ 3250 Bad Hair Day (单调栈)
  7. python实时数据流设计_Python读取实时数据流示例
  8. Kubernetes之yaml文件详解(汇总-详细)
  9. mysql 插入当前时间_MySql优化之前期探索
  10. 基本属性---Linux
  11. vue多选框点击其中一个控制div隐藏_Vue 零碎知识点
  12. 学计算机的专属表白方式,九个学科专属表白句子-花式表白公式【蜜匠婚礼】...
  13. 基于JAVA+Servlet+JSP+MYSQL的航空订票系统
  14. android - 调用系统分享功能分享图片
  15. ASP.NET Core管道深度剖析
  16. 数据库设计三范式的举例及四大特性说明
  17. LeetCode题解(1818):绝对差值和(Python)
  18. magic4升级鸿蒙系统,Magic UI 4.0将于9月中旬内测招募 后续可升鸿蒙系统
  19. 【今日爆点】华为HDC开发者大会上正式发布深度欧拉V1.0
  20. keepalive+nginx搭建主从负载服务器

热门文章

  1. Linux文件上传不成功的问题解决
  2. ListView具体使用
  3. 20179311《网络攻防实践》第八周作业
  4. 【笔记】Ueditor1_4_3_3-utf8-jsp使用步骤
  5. xynuoj 灯光问题 酒馆浪人的博客
  6. 16-20.Python语言进阶
  7. 表格如何嵌套表单,如何在用表格给表单排版
  8. 如何删除word文件中的空白页?
  9. Postman打开一直转圈
  10. Elasticsearch 2014年10月简报