博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
I2C协议详解(收集网上资料)
阅读量:5085 次
发布时间:2019-06-13

本文共 2438 字,大约阅读时间需要 8 分钟。

一. 技术性能:

  支持普通模式(100kHz即100kbps)、快速模式(400kHz)、快速模式+(1MHz)、高速模式(3.4MHz)和超高速模式(5MHz)。大部分是100K和400K两种;
  支持多主控模块,但同一时刻只允许有一个主控;
  由数据线SDA和时钟SCL构成的串行总线;
  每个电路和模块都有唯一的地址;
 

二. 基本工作原理:

  以启动信号START来掌管总线,以停止信号STOP来释放总线;
  每次通讯以START开始,以STOP结束;
  (在SCL线是高电平时SDA线从高电平向低电平切换这个情况表示起始条件,当SCL是高电平时SDA线由低电平向高电平切换表示停止条件。)
  启动信号START后紧接着发送一个地址字节,其中7位为被控器件的地址码,一位为读/写控制位R/W,R/W位为0表示由主控向被控器件写数据,R/W为1表示由主控向被控器件读数据;
  当被控器件检测到收到的地址与自己的地址相同时,在第9个时钟期间反馈应答信号;
  每个数据字节在传送时都是高位(MSB)在前;
  (如果从机要完成一些其他功能后例如一个内部中断服务程序才能接收或发送下一个完整的数据字节可以使时钟线SCL保持低电平迫使主机进入等待状态当从机准备好接收下一个数据字节并释放时钟线SCL后数据传输继续。)

  SDA上的字节长度必须为8位,并且每个字节后须跟一个ACK位。数据在SCL处于低电平时放到SDA上,并在SCL变为高电平后进行采样。

    

 

三. 写通讯过程:

  1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线;
  2. 发送一个地址字节(包括7位地址码和一位R/W);
  3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK);
  4. 主控收到ACK后开始发送第一个数据字节;
  5. 被控器收到数据字节后发送一个ACK表示继续传送数据,发送NACK表示传送数据结束;
  6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线;

  

 

四. 读通讯过程:

  1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线;
  2. 发送一个地址字节(包括7位地址码和一位R/W);
  3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK);
  4. 主控收到ACK后释放数据总线,开始接收第一个数据字节;
  5. 主控收到数据后发送ACK表示继续传送数据,发送NACK表示传送数据结束;
  6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线;

   

 

五. 总线信号时序分析
  1. 总线空闲状态
  SDA和SCL两条信号线都处于高电平,即总线上所有的器件都释放总线,两条信号线各自的上拉电阻把电平拉高;
  2. 启动信号START
  时钟信号SCL保持高电平,数据信号SDA的电平被拉低(即负跳变)。启动信号必须是跳变信号,而且在建立该信号前必修保证总线处于空闲状态;
  3. 停止信号STOP
  时钟信号SCL保持高电平,数据线被释放,使得SDA返回高电平(即正跳变),停止信号也必须是跳变信号。
  4. 数据传送
  SCL线呈现高电平期间,SDA线上的电平必须保持稳定,低电平表示0(此时的线电压为地电压),高电平表示1(此时的电压由元器件的VDD决定)。只有在SCL线为低电平期间,SDA上的电平允许变化。 (数据的改变必须是在CLK在低的时候才能有效)
  5. 应答信号ACK
  I2C总线的数据都是以字节(8位)的方式传送的,发送器件每发送一个字节之后,在时钟的第9个脉冲期间释放数据总线,由接收器发送一个ACK(把数据总线的电平拉低)来表示数据成功接收。
  6. 无应答信号NACK
  在时钟的第9个脉冲期间发送器释放数据总线,接收器不拉低数据总线表示一个NACK,NACK有两种用途:
    a. 一般表示接收器未成功接收数据字节;
    b. 当接收器是主控器时,它收到最后一个字节后,应发送一个NACK信号,以通知被控发送器结束数据发送,并释放总线,以便主控接收器发送一个停止信号STOP。

六. 寻址约定

  地址的分配方法有两种:
  1. 含CPU的智能器件,地址由软件初始化时定义,但不能与其它的器件有冲突;
  2. 不含CPU的非智能器件,由厂家在器件内部固化,不可改变。

  高7位为地址码,其分为两部分:

  1. 高4位属于固定地址不可改变,由厂家固化的统一地址;
  2. 低三位为引脚设定地址,可以由外部引脚来设定(并非所有器件都可以设定);

 

七. 模拟操作

  

  

  从图中可知时序如下:

  1.由主机发起,在SCL为高电平时,SDA由高到低切变,形成开始信号;
  2. 接着是7位地址和一位读写标志,这里7位地址为0111100,即0x3c,正是我们代码中设置的地址ID;最后一位为0表示写操作;
  3. 接着在下一个时钟,主机以高电平状态释放SDA,这时从机响应,将SDA拉低了;
  4. 接着是两个8位数据00101110与响应,即0x2E,正是“.”号的ASCII码,符合预期输出;
  5. 还有其它数据和最后的停止位,图中被截掉了。
  从图中可知,纵向一格是200mV,则SDA和SCL的电平大概就是350mV;由于信号笔上设置了信号x10,因此实际电平应该大概是3.5V(理论上应该是3.3V)。横向一格是25us,10个时钟周期大概用了4格,即4x25us=100us,平均每个时钟周期是10us,可算出传输频率为1/10us=100,000/s,即100kbps。

 

转载于:https://www.cnblogs.com/will-lin/p/10590472.html

你可能感兴趣的文章
Ajax中文乱码问题解决方法(服务器端用servlet)
查看>>
会计电算化常考题目一
查看>>
阿里云服务器CentOS6.9安装Mysql
查看>>
剑指offer系列6:数值的整数次方
查看>>
js 过滤敏感词
查看>>
poj2752 Seek the Name, Seek the Fame
查看>>
软件开发和软件测试,我该如何选择?(蜗牛学院)
查看>>
基本封装方法
查看>>
bcb ole拖拽功能的实现
查看>>
生活大爆炸之何为光速
查看>>
bzoj 2456: mode【瞎搞】
查看>>
[Typescript] Specify Exact Values with TypeScript’s Literal Types
查看>>
[GraphQL] Reuse Query Fields with GraphQL Fragments
查看>>
Illustrated C#学习笔记(一)
查看>>
理解oracle中连接和会话
查看>>
两种最常用的Sticky footer布局方式
查看>>
Scrapy实战篇(三)之爬取豆瓣电影短评
查看>>
HDU 5510 Bazinga KMP
查看>>
[13年迁移]Firefox下margin-top问题
查看>>
Zookeeper常用命令 (转)
查看>>