博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FPGA--I2C串行通信总线
阅读量:4924 次
发布时间:2019-06-11

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

一、I2C总线基本介绍

  I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。在多主机系统中,可能同时有几个主机企图启动总线传送数据。为了避免混乱,I2C总线要通过总线仲裁,以决定由哪一台主机控制总线。

  I2C 标准速率为 100kbit/s,快速模式 400kbit/s, 每个电路和模块都有唯一的地址。

  I2C总线只有两根双向信号线。一根是数据线SDA(无论是数据信息还是地址信息都经过这根线传输),另一根是时钟线SCL。

  I2C总线通过上拉电阻接正电源。因此,当总线空闲时,两根线均为高电平(这也就是后面在写I2C协议时,当主机从EEPROM读取完最后一个字节的数据,在给EEPROM发送非应答信号(高电平)时,没有在程序中写SDL高电平的原因)。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。每个接到I2C总线上的器件都有唯一的地址。数据的传输也可以是双向的。

二、I2C总线通信协议

(一)时序

  只有在总线处于非忙状态时,数据传输才能被初始化。在数据传输期间,只要时钟线为高电平,数据线都必须保持稳定,否则数据线上的任何变化都被当作启动停止信号。图 1 是被定义的总线状态。

① 总线非忙状态(A 段) 

数据线SDA  时钟线 SCL 都保持高电平。 

② 启动数据传输(B 段) 

当时钟线(SCL)为高电平状态时,数据线(SDA)由高电平变为低电平的下降沿被认为是启动信号。只有出现启动信号后,其它的命令才有效。

③ 停止数据传输(C 段) 

当时钟线(SCL)为高电平状态时,数据线(SDA)由低电平变为高电平的上升沿被认为是停止信号。随着停在信号出现,所有的外部操作都结束。 

④ 数据有效(D 段) 

在出现启动信号以后,在时钟线(SCL)为高电平状态时数据线是稳定的,这时数据线的状态就要传送的数据。数据线(SDA)上的数据的改变必须在时钟线为低电平期间完成,每位数据占用一个时钟脉冲。

⑤ 应答信号 (ACK和NACK)

I2C总线上的所有数据都是以8位字节传送,发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK),表示接收器已经成功接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。但是当接收器是主控器(比如单片机对EEPROM进行读操作,则单片机即为接收器),则它在收到最后一个字节后,也会发送一个NACK信号(并不是说没有成功),以通知被控发送器结束数据发送,并释放SDA总线,以便主控器发送一个停止信号。

以EEPROM为例:每个正在接收数据的EEPROM 在接到一个字节的数据后,通常需要发出一个应答信号(由主机接收)。而每个正在发送数据的EEPROM 在发出一个字节的数据后,通常需要接收一个应答信号(由主机发出)。EEPROM 读写控制器必须产生一个与这个应答位相联系的额外的时钟脉冲。在EEPROM 的读操作中,EEPROM 读写控制器对EEPROM 完成的最后一个字节不产生应答位(高电平),但是应该给EEPROM 一个结束信号。

(二)数据帧格式

I2C总线上传送的数据信号是广义的,既包括地址信号,又包括正真的数据信号。

I2C总线上的所有数据都是以8位字节传送。在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向为(R/W),用0表示主机写(发送),用1表示主机读(接收)。每次数据传送总是由主机产生的终止信号结束。但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。

(三)总线的寻址

I2C总线协议有明确的规定:采用7位的寻址字节(寻址字节是起始信号后的第一个字节)。

寻址字节的定义:D7~D1位组成从机的地址。D0位是数据传送的方向位。

当主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,如果相同,则认为自己正被主机寻址,根据R/T位将自己确定为发送器或接收器。

从机的地址由固定部分和可编程部分组成。在一个系统中可能希望接入多个相同的从机(固定部分相同),从机地址中可编程部分决定了可接入总线该类器件的最大数目。如一个从机的7位寻址位有4位是固定位,3位是可编程位,这时仅能寻址8个同样的器件,即可以有8个同样的器件接入到该I2C总线系统中。

三、I2C总线的应用举例

(一)I2C 设备读写操作的种类

   在这里以 AT24C04 为例说明 I2C 读写的基本操作和时序,I2C 设备的操作可分为写单个

存储字节,写多个存储字节,读单个存储字节和读多个存储字节。各个操作如下图所示。

其中:

Device Address:从机地址=4位固定位+3位可编程位

Word Address:将要读或写的存储单元的首地址(若是读/写多个存储字节,每读/写完一个字节的数据,这个地址会自动加1)

(二)单个存储字节的读写操作具体过程举例

① EEPROM 的写操作(字节编程方式) 

  所谓EEPROM 的写操作(字节编程方式)就是通过读写控制器把一个字节数据发送到EEPROM 中指定地址的存储单元。其过程如下:EEPROM 读写控制器发出启动信号后,紧跟着发送4 I2C 总线器件特征编码1010 3 EEPROM 芯片地址/页地址XXX 以及写状态的R/W (=0)到总线上,然后等待EEPROM 发出应答信号;若接收到应答,读写控制器将跟着发送1 个字节的EEPROM 存储单元地址,然后等待EEPROM 再一次发出应答信号;若再次接收到应答则继续写入1 个字节数据到被寻址的存储单元,之后EEPROM 再一次发出应答信号;读写控制器收到此应答信号后,便产生停止信号。字节写入帧格式如图2 所示:

② 二线制I2C CMOS 串行EEPROM 的读操作 

  所谓EEPROM 的读操作即通过读写控制器读取 EEPROM 中指定地址的存储单元中的一个字节数据。串行EEPROM 的读操作分两步进行:读写器首先发送一个启动信号和控制字节(包括页面地址和写控制位R/W = 0)EEPROM,再通过写操作设置EEPROM 存储单元地址(注意:虽然这是读操作,但需要先写入地址指针的值),在此期间EEPROM 会产生必要的应答位。接着读写器重新发送另一个启动信号和控制字节(包括页面地址和读控制位R/W = 1)EEPROM 收到后发出应答信号,然后,要寻址存储单元的数据就从SDA 线上输出。读操作有三种: 读当前地址存储单元的数据、读指定地址存储单元的数据、读连续存储单元的数据。在这里只介绍读指定地址存储单元数据的操作。读指定地址存储单元数据的帧格式如图3

 

转载于:https://www.cnblogs.com/pdf000/p/8251679.html

你可能感兴趣的文章
linux+Apache开启伪静态配置
查看>>
将Excel 2007表格发布到MOSS列表,发布后的表格和可以和MOSS列表双向同步
查看>>
Spring 简单读取文件
查看>>
简单的web三层架构系统【第三版】
查看>>
EasyUI - Tabs
查看>>
PHP - 数组
查看>>
POJ 动态规划(2)
查看>>
面向对象设计模式的核心法则
查看>>
Windows 8 动手实验系列教程 实验4:应用栏和媒体捕获
查看>>
行为驱动开发: Cucumber的目录结构和执行过程 (转载)
查看>>
Shiro学习详解
查看>>
6最小公倍数和最大公约数的计算(未完期待)
查看>>
创建UITabBarController
查看>>
Kotlin学习记录3
查看>>
C#版本和.NET版本以及VS版本的对应关系
查看>>
单调栈与单调队列
查看>>
go 切片
查看>>
注册维))基))百))科))
查看>>
eclipse 中手动安装 subversive SVN
查看>>
react常用语法
查看>>