I2C-EEPROM 实验

      最后更新:2022-01-20 06:19:57 手机定位技术交流文章

      I2C 简介

      I2C为两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的 一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单, 器件封装形式小,通信速率较高等优点。

      I2C 总线只有两根双向信号线。一根是双向串行数据线 SDA,另一根是串行时钟线 SCL。广泛应用于各大集成芯片内。

      I2C 物理层

      I2C 通信设备常用的连接方式如下图所示:

      如图所示,I2C的物理层有以下特点:

      • “总线”指多个设备共用的信号线,支持多个I2C 通讯设备的连接,支持多个通讯主机及多个通讯从机;
      • 一个 I2C 总线只使用两条总线线路,SDA:表示数据,SCL:用于数据收发同步;
      • 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址对不同设备进行访问;
      • 总线通过上拉电阻接到电源。当 I2C 设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平;
      • 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线;
      • 具有三种传输模式:标准模式传输速率为 100kbit/s,快速模式为 400kbit/s,高速模式下可达3.4Mbit/s, 但目前大多 I2C 设备尚不支持高速模式。
      • 连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制。
      I2C 总线常用的一些术语
      名称 说明
      主机 启动数据传送,并产生时钟信号的设备
      从机 被主机寻址的器件
      多主机 同时有多于一个主机尝试控制总线但不破坏传输
      主模式 用 I2CNDAT 支持自动字节计数的模式; 位 I2CRM,I2CSTT,I2CSTP 控制数据的接收和发送
      从模式 发送和接收操作都是由 I2C 模块自动控制的
      仲裁 一个在有多个主机同时尝试控制总线,但只允许其中一个控制总线,并使传输不被破坏的过程
      同步 两个或多个器件同步时钟信号的过程
      发送器 发送数据到总线的器件
      接收器 从总线接收数据的器件

      I2C 协议层

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

      数据有效性

      I2C 总线进行数据传送时,时钟信号为高电平时,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平时,数据线上的高或低电平状态才允许变化。如下图:

      每次数据传输都以字节为单位,每次传输的字节数不受限制。

      起始和停止信号

      SCL 线为高电平期间,SDA 线由高电平向低电平的变化表示起始信号,SDA 线由低电平向高电平的变化表示终止信号。如下图:

      起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。

      应答响应

      每当发送器件传输完一个字节的数据后,后面必须紧跟一个校验位,这个校验位是接收端通过控制数据线SDA来实现的,其实就是数据或地址传输过程中的响应,表明发送端数据已经接收完成,数据传送可以继续进行。

      响应包括“应答(ACK)”和“非应答(NACK)”两种信号。作为数据接收端时,当设备(无论主、从机)接收到 I2C 传输的一个字节数据或地址后,若希望对方继续发送数据,则需要向对方发送“应答(ACK)”信号,即特定的低电平脉冲, 发送方会继续发送下一个数据;若接收端希望结束数据传输,则向对方发送“非应答(NACK)”信号,即特定的高电平脉冲,发送方接收到该信号后会产生一个停止信号,结束信号传输。应答响应时序图如下:

      每一个字节必须保证是 8 位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有 9 位)。

      当从机不对主机寻址信号应答时(例如,从机正在进行实时性的处理工作而无法接收总线上的数据),它必须将数据线置于高电平,而由主机产生一个终止信号以结束总线的数据传送。

      当从机对主机进行了应答时,但在数据传送一段时间后无法继续接收更多的数据时,从机可以通过对无法接收的第一个数据字节的“非应答”通知主机,主机则应发出终止信号以结束数据的继续传送。

      当主机接收数据时,它收到最后一个数据字节后,必须向从机发出一个结束传送的信号。这个信号是由对从机的“非应答(NACK)”来实现的。然后,从机释放 SDA 线,以允许主机产生终止信号。

      这些信号中,起始信号是必需的,结束信号和应答信号都可以不要。

      总线的寻址方式

      I2C 总线寻址按照从机地址位数可分为两种,一种是 7 位,另一种是 10 位。采用 7 位的寻址字节(寻址字节是起始信号后的第一个字节)的位定义如下:

      D7~D1 位组成从机的地址。D0 位是数据传送方向位,为“ 0”时表示主机向从机写数据,为“1”时表示主机由从机读数据。

      10 位寻址和 7 位寻址兼容,而且可以结合使用。10 位寻址不会影响已有的 7 位寻址,有 7 位和 10 位地址的器件可以连接到相同的 I2C 总线。以 7 位寻址为例:

      当主机发送了一个地址后,总线上的每个器件都将头 7 位与它自己的地址比较,如果一样,器件会判定它被主机寻址,其他地址不同的器件将被忽略后面的数据信号。至于是从机接收器还是从机发送器,都由 R/W 位决定的。从机的地址由固定部分和可编程部分组成。在一个系统中可能希望接入多个相同的从机,从机地址中可编程部分决定了可接入总线该类器件的最大数目。如一个从机 的 7 位寻址位有 4 位是固定位,3 位是可编程位,这时仅能寻址 8 个同样的器件(2^3=8),即可以有 8 个同样的器件接入到该 I2C 总线系统中。

      数据传输

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

      在总线的一次数据传送过程中,有以下几种组合方式:

      1 :主机向从机发送数据,数据传送方向在整个传送过程中不变

      注意:有阴影部分表示数据由主机从机传送,无阴影部分则表示数据由从机主机传送。A 表示应答,overline{A}表示非应答(高电平)。S 表示起始信号,P 表示终止信号。

      2 :主机在第一个字节后,立即从从机读数据。

      3 :在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好相反

      由于 51 单片机没有硬件 IIC 接口,通常采用软件模拟 I2C。主要原因是硬件 IIC 设计的比较复杂,而且稳定性不怎么好,程序移植比较麻烦,而用软件模拟 IIC,最大的好处就是移植方便,同一个代码兼容所有单片机,任何一个单片机只要有 IO 口(不需要特定 IO),都可以很快的移植过去。

      AT24C02 简介

      AT24C01/02/04/08/16是一个 1K/2K/4K/8K/16K 位串行 CMOS,内部含有 128/256/512/1024/2048 个 8 位字节,AT24C01 有一个 8 字节页写缓冲器, AT24C02/04/08/16 有一个 16 字节页写缓冲器。该器件通过 I2C 总线接口进行操作,它有一个专门的写保护功能。我用的开发板上使用的是 AT24C02(EEPROM) 芯片,此芯片具有 I2C 通信接口,芯片内保存的数据在掉电情况下都不丢失, 所以通常用于存放一些比较重要的数据等。AT24C02 芯片管脚及外观图如下图所示:

      芯片管脚说明如下图所示:

      AT24C02 器件地址为 7 位,高 4 位固定为 1010,低 3 位由 A0/A1/A2 信 号线的电平决定。 因为传输地址或数据是以字节为单位传送的,当传送地址时, 器件地址占 7 位,还有最后一位(最低位 R/W)用来选择读写方向,它与地址无关。其格式如下:

      我们开发板已经将芯片的 A0/A1/A2 连接到 GND,所以器件地址为 1010000,即 0x50(未计算最低位)。如果要对芯片进行写操作时,R/W 即为 0, 写器件地址即为 0XA0;如果要对芯片进行读操作时,R/W 即为 1,此时读器件 地址为 0XA1。开发板上也将 WP 引脚直接接在 GND 上,此时芯片允许数据正常读写。

      I2C 总线时序如下图所示:

      硬件部分

      本实验使用到硬件资源如下:

      • 独立按键(K1-K4)
      • 动态数码管
      • EEPROM 模块电路(AT24C02)

      EEPROM 模块电路,如下图所示:

      芯片的 SCL 和 SDA 管脚接至 J4 端子 上,为了让 IIC 总线默认为高电平,通常会在 IIC 总线上接上拉电阻,在图中可以看到 SCL 和 SDA 管脚有上拉电阻。 由于该模块电路是独立的,所以 24C02 芯片的 SCL 和 SDA 管脚可以使用任意单片机管脚连接,这里使用单片机的 P2.0 管脚连接芯片的 SDA 脚,使用单片机的 P2.1 脚连接芯片的 SCL 脚。

      软件部分

      实现的功能:系统运行时,数码管右 3 位显示 0,按 K1 键将数据写入到 EEPROM 内保存,按 K2 键读取 EEPROM 内保存的数据,按 K3 键显示数据加 1,按 K4 键显示数据清零,最大能写入的数据是 255。

      程序框架如下:

      1. 编写按键检测功能
      2. 编写数码管显示功能
      3. 编写 IIC 驱动,包括起始、停止、应答信号等
      4. 编写 AT24C02 读写功能
      5. 编写主函数

      按键检测函数

      key.c 文件:

      key.h 文件:

      数码管显示函数

      smg.c 文件:

      smg.h 文件:

      I2C 读写字节函数

      iic.c 文件:

      iic.h 文件:

      AT24C02 读写字节函数

      24c02.c 文件:

      24c02.c 文件:

      主函数

      main.c 文件:

      Public.h 文件:

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/16893.html

          热门文章

          文章分类