1.IIC 通信协议简介

I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的, 由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备, 被广泛地使用在多个集成电路(IC)间的通讯。

1.1 IIC 物理层

它的物理层有如下特点:

  • 它是一个支持多设备的总线。“总线”指多个设备共用的信号线。 在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。

  • 一个 I2C 总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线 (SCL)。 数据线即用来表示数据,时钟线用于数据收发同步。

  • 每个连接到总线的设备都有一个独立的设备地址,主机可以利用这个地址进行不同设备之间的访问。 其中地址是一个七位或十位的数字。

  • 总线通过上拉电阻接到电源。当 I2C 设备空闲时,会输出高阻态,而当所有设备都空闲, 都输出高阻态时,由上拉电阻把总线拉成高电平。

  • 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。

  • 具有三种传输模式:标准模式传输速率为 100kbit/s ,快速模式为 400kbit/s , 高速模式下可达 3.4Mbit/s,但目前大多 I2C 设备尚不支持高速模式。

  • 连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制 。

1.2 IIC 协议层

I2C 的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。

  • IIC 3 种基本读写过程

这些图表示的是主机和从机通讯时,SDA 线的数据包序列。

1.其中 S 表示由主机的 I2C 接口产生的传输起始信号(S),这时连接到 I2C 总线上的所有从机都会接收到这个信号。

2.起始信号产生后,所有从机就开始等待主机紧接下来广播 的从机地址信号 (SLAVE_ADDRESS)。 在 I2C 总线上,每个设备的地址都是唯一的,当主机广播的地址与某个设备地址相同时,这个设备就被选中了,没被选中的设备将会忽略之后的数据信号。 根据 I2C 协议,这个从机地址可以是 7 位或 10 位。

3.在地址位之后,是传输方向的选择位,该位为 0,表示后面的数据传输方向是由主机传输至从机,即主机向从机写数据。该位为 1,则相反,即主机由从机读数据。

4.从机接收到匹配的地址后,主机或从机会返回一个应答(ACK)或非应答(NACK)信号,只有接收到应答信号后,主机才能继续发送或接收数据。

写数据方向:

若配置的方向传输位为 “写数据” 方向,即第一幅图的情况,广播完地址,接收到应答信号后, 主机开始正式向从机 传输数据(DATA) ,数据包的大小为 8 位,主机每发送完一个字节数据, 都要等待从机的应答信号(ACK),重复这个过程,可以向从机传输 N 个数据,这个 N 没有大小限制。 当数据传输结束时,主机向从机发送一个停止传输信号(P),表示不再传输数据。

读数据方向:

若配置的方向传输位为 “读数据” 方向,即第二幅图的情况,广播完地址,接收到应答信号后, 从机开始向主机 返回数据(DATA) ,数据包大小也为 8 位,从机每发送完一个数据, 都会等待主机的应答信号(ACK),重复这个过程,可以返回 N 个数据,这个 N 也没有大小限制。 当主机希望停止接收数据时,就向从机返回一个非应答信号(NACK),则从机自动停止数据传输。

复合格式:

除了基本的读写,I2C 通讯更常用的是 复合格式 ,即第三幅图的情况,该传输过程有 两次起始信号(S) 。 一般在第一次传输中,主机通过 SLAVE_ADDRESS 寻找到从设备后,发送一段“数据”, 这段数据通常用于表示从设备内部的寄存器或存储器地址(注意区分它与 SLAVE_ADDRESS 的区别); 在第二次的传输中,对该地址的内容进行读或写。也就是说,第一次通讯是告诉从机读写地址,第二次则是读写的实际内容。

1.3 通讯的起始和停止信号

  • 当 SCL 线是高电平时 SDA 线从高电平向低电平切换,这个情况表示通讯的起始。

  • 当 SCL 是高电平时 SDA 线由低电平向高电平切换,表示通讯的停止。

1.4 数据有效性

  • 传输时,SCL 为高电平的时候 SDA 表示的数据有效,即此时的 SDA 为高电平时表示数据“1”,为低电平时表示数据“0”。

  • 当 SCL 为低电平时,SDA 的数据无效,一般在这个时候 SDA 进行电平切换,为下一次表示数据做好准备。

1.5 地址及数据方向

I2C 总线上的每个设备都有自己的独立地址,主机发起通讯时,通过 SDA 信号线发送设备地址(SLAVE_ADDRESS)来查找从机。 I2C 协议规定设备地址可以是 7 位或 10 位,实际中 7 位的地址应用比较广泛。

紧跟设备地址的一个数据位用来表示数据传输方向,它是数据方向位(R/),第 8 位或第 11 位。 数据方向位为“1”时表示主机由从机读数据,该位为“0”时表示主机向从机写数据。

  • 读数据方向时,主机会释放对 SDA 信号线的控制,由从机控制 SDA 信号线,主机接收信号。

  • 写数据方向时,SDA 由主机控制,从机接收信号。

1.6 应答信号

I2C 的数据和地址传输都带响应。响应包括“应答(ACK)”和“非应答(NACK)”两种信号。 作为数据接收端时,当设备(无论主从机)接收到 I2C 传输的一个字节数据或地址后:

  • 若希望对方 继续发送数据 ,则需要向对方发送 “应答(ACK)” 信号,发送方会继续发送下一个数据;

  • 若接收端希望 结束数据传输 ,则向对方发送 “非应答(NACK)” 信号,发送方接收到该信号后会产生一个停止信号,结束信号传输。如下图。

传输时主机产生时钟,在第 9 个时钟时,数据发送端会释放 SDA 的控制权,由数据接收端控制 SDA,若 SDA 为高电平,表示非应答信号(NACK),低电平表示应答信号(ACK)。

2. linux 开发板使用 IIC

2.1 使能 IIC 驱动

通过 fire-config 命令,使能 IIC 驱动,如下图所示:

2.2 检查 IIC 设备

#查看系统存在的I2C总线
ls /sys/bus/i2c/devices

2.3 安装 i2c-tools

#安装i2c-tools
sudo apt-get install i2c-tools

安装后可使用的命令有 i2cdetect、i2cdump、i2cset 以及 i2cget,它们分别用于扫描 I2C 总线上的设备、读写指定设备的寄存器内容。

2.4 i2cdetect 命令

i2cdetect [-y] [-a] [-q|-r] i2cbus [first last]:

参数说明:

  • 参数 y:关闭交互模式,使用该参数时,不会提示警告信息。

  • 参数 a:扫描总线上的所有设备。

  • 参数 q:使用 SMBus 的“quick write”命令进行检测,不建议使用该参数。

  • 参数 r:使用 SMBus 的“receive byte”命令进行检测,不建议使用该参数。

  • 参数 i2cbus:指定 i2c 总线的编号

  • 参数 first、last:扫描的地址范围

返回值说明:

  • ‘–’:表示该地址被检测,但没有芯片应答;

  • ‘UU’:表示该地址当前由内核驱动程序使用。

  • ’:表示以十六进制表示的设备地址编号,如 “2d”或“4e”。

使用示例:

i2cdetect 主要用于查看当前总线上的设备,我们这里查看 IIC 1 接口上的设备,重点关注 MPU6050、显示屏触摸芯片、oled 显示屏(需要使用杜邦线外接)

IIC0 的引脚为:

  • SCL-->io1.28
  • SDA-->io1.29
i2cdetect -a 0



3C 就是 12864 屏幕的地址了

#查询i2c总线的功能,参数i2cbus表示i2c总线
i2cdetect -F i2cbus
#打印软件的
i2cdetect -V
#检测当前系统有几组i2c总线
i2cdetect -l

2.5 i2cset 命令

i2cset [-f] [-y] [-m mask] [-r] i2cbus chip-address data-address [value] … [mode]

参数说明:

参数f:强制访问设备。

参数y:关闭交互模式,使用该参数时,不会提示警告信息。

参数m:

参数r:写入后立即回读寄存器值,并将结果与写入的值进行比较。

参数i2cbus:指定i2c总线的编号

参数chip-address:i2c设备地址

参数data-address:设备的寄存器的地址

参数value:要写入寄存器的值

参数mode:参考i2cdump命令

使用示例:

#设置i2c总线的设备地址为0x3c的寄存器地址为0x00的值为0x12
i2cset 0 0x3c 0x00 0xAE #关闭显示

2.6 i2cget 命令

i2cget [-f] [-y] [-m mask] [-r] i2cbus chip-address data-address [mode]
参数说明:
参数f:强制访问设备。 参数y:关闭交互模式,使用该参数时,不会提示警告信息。 参数i2cbus:指定i2c总线的编号 参数chip-address:i2c设备地址 参数data-address:设备的寄存器的地址 参数mode:参考i2cdump命令。

2.7 i2cdump 命令

i2cdump [-f] [-y] [-r] [-a] [-b] [-t] [-s start] [-e end] [-c count] i2cbus chip-address [mode]
参数说明:
参数r:指定寄存器范围,只扫描从first到last区域; 参数f:强制访问设备。 参数y:关闭人机交互模式; 参数i2cbus:指定i2c总线的编号 参数address:指定设备的地址 参数mode:指定读取的大小, 可以是b, w, s或i,分别对应了字节,字,SMBus块, I2C块

IIC通信协议的更多相关文章

  1. IIC通信协议详解

    IIC通信详解 IIC概述 IIC:两线式串行总线,它是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据. 在CPU与被控IC之间.IC与IC之间进行双向传送,高速IIC总线一般可达400 ...

  2. STM32学习笔记:IIC通信协议详解(附带软件模拟源码)

    什么是IIC(I2C)? IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司设计出来的一种简单.双向.二线制.同步串行总线.它是一种多向控制总 ...

  3. stm32之IIC通信协议

    I2C(IIC,Inter-Integrated Circuit),两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备. 它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数 ...

  4. IIC,RS485,RS232各种协议手册更新中

     RS485使用手册与指南.pdf  RS232协议标准详解.pdf IIC通信协议.pdf 链接:http://pan.baidu.com/s/1ccBtmA 密码:mwj6 IIC,RS485,R ...

  5. 嵌入式常用技术概览之IIC(I2C)

    一.先决知识             (1)模电基础知识(用以理解IIC如何通信) 二.IIC概览               I2C是80年代飞利浦(Philips->NXP->高通)研 ...

  6. IIC时序详解

    Verilog IIC通信实验笔记 Write by Gianttank 我实验的是 AT24C08的单字节读,单字节写,页读和页写,在高于3.3V系统中他的通信速率最高400KHZ的,我实验里用的是 ...

  7. Arduino IIC 主从设备连接通信

    目的:        实现Arduino主从设备之间的互相IIC通信,掌握IIC通信协议的使用方法. 器材: Arduino UNO R3 一块 Arduino Nano 三块 面包板   导线 3K ...

  8. 【.NET 与树莓派】i2c(IIC)通信

    i2c(或IIC)协议使用两根线进行通信(不包括电源正负极),它们分别为: 1.SDA:数据线,IIC 协议允许在单根数据线上进行双向通信--这条线既可以发送数据,也可以接收数据. 2.SCL:时钟线 ...

  9. 硬件IIC驱动原理

    1.IIC物理层 IIC通信属于同步半双工通信,IIC总线由两根信号线组成.一根是数据线SDA,一根是时钟线SCL,时钟线只能由主机发送给从机,数据线可以双向进行通信,总线上可挂载多个设备,挂载数量受 ...

  10. 以MPU6050为例的硬件IIC的使用

    目录 参考调试MPU6050与EEPROM的经验,整合了目标内存/寄存器地址是否为16位的情况,合并了单字节与多字节间的操作,添加了返回值与读写超时功能:硬件IIC的7位从机地址查询方式读写参考代码 ...

随机推荐

  1. 详解 printf() 函数

    声明(叠甲):鄙人水平有限,本文章仅供参考. 1. 引子 #include <stdio.h> int main() { printf("hello world\n") ...

  2. 全渠道定价、库存决策,运筹混合整数规划建模求解,MNL选择模型,内附代码!

    0. 写在前面 刊论文!模型简单,代码实现更简单,墙裂推荐!可为运筹建模提供参考,也可作为全渠道零售研究的入门资料ε٩(๑> ₃ <)۶з 全文有点长,前面先放一个博文结构和涉及内容: 第 ...

  3. 全网最详细中英文ChatGPT-GPT-4示例文档-信息智能提取从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)

    目录 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node.js接口请求示 ...

  4. 学习docker看此文足以

    什么是 Docker Docker 最初是 dotCloud 公司创始人  在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 ,主要项目代码在  上进行 ...

  5. python入门教程之九日期时间常用操作

    Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间. 时间间隔是以秒为单位的浮点小数. 每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表示. Py ...

  6. [软件测试] sonar 常见问题及修复思路【待完善】

    1 sonar 概述 sonar 是什么? Sonar 是一个用于代码质量管理的开放平台.通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具. 与持续集成工具(例如 Hu ...

  7. SprintBoot2报错汇总

    报错1:SpringBoot找不到bean Unable to start ServletWebServerApplicationContext due to missing ServletWebSe ...

  8. Go For Web:踏入Web大门的第一步——Web 的工作方式

    前言: 本文作为解决如何通过 Golang 来编写 Web 应用这个问题的前瞻,对 Golang 中的 Web 基础部分进行一个简单的介绍.目前 Go 拥有成熟的 Http 处理包,所以我们去编写一个 ...

  9. Solon2 常用注解之 @Component 与 @ProxyComponent 的区别

    在 Solon 提倡"克制"的原则下,托管组件分为: 普通组件: 主要由内核提供的:@Configuration.@Component.@Controller.@Remoting ...

  10. Java SpringBoot 7z 压缩、解压

    Java SpringBoot 7z 压缩.解压 cmd 7z 文件压缩 7z压缩测试 添加依赖 <dependency> <groupId>org.apache.common ...