0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

《基于FPGA的IIC设计》

电子工程师 来源:FPGA设计论坛 作者:FPGA设计论坛 2020-11-20 16:21 次阅读

《基于FPGA 的 IIC设计

设计背景:

IIC 简单来说,就是一种串行通信协议,IIC 的通信协议和通信接口在很多工程中有广泛的应用,如数据采集领域的串行 AD,图像处理领域的摄像头配置,工业控制领域的 X 射线管配置等等。除此之外,由于 IIC 协议占用的 IO 资源特别少,连接方便,所以工程中也常选用 IIC 接口做为不同芯片间的通信协议。

设计原理:

IIC 电路原理图如下:

24LC64 各引脚定义:

1、A0,A1,A2 为 24LC64 的片选信号,由于 IIC 总线可以挂载多个 IIC 接口器件,所以每个器件都应该有自己的“身份标识”,通过对 A0,A1,A2 输入不同的高低电平,就可以设置该 EEPROM 的片选信号。

2、WP 为读写使能信号,当 WP 悬空或者接地,EEPROM 可读可写,当 WP 接电源,EEPROM 只能读不能写。

3、SCL 为 IIC 接口的时钟线。

4、SDA 为 IIC 接口的数据线。

IIC 接口的读写时序:

IIC 接口读写时序分为随机读写(单字节读写)和页面读写(多字节读写),先分析随机读写(Byte Write/Read)时序。Byte Write 时序如下:

时序解读:如果我们要向 EEPROM 写入一个字节,那么必须经过以下步骤:

1. 发送启动信号

2. 发送控制字

3. 接收并检测 EEPROM 发来的应答信号 ACK

4. 发送高字节地址位

5. 接收并检测 EEPROM 发来的应答信号 ACK

6. 发送低字节地址位

7. 接收并检测 EEPROM 发来的应答信号 ACK

8. 发送 8bit 有效数据

9. 接收并检测 EEPROM 发来的应答信号 ACK

10.发送停止信号

Byte Read 时序如下:

时序解读:如果我们要从 EEPROM 读出一个字节,那么必须经过以下步骤:

1. 发送启动信号

2. 发送控制字 1010_A2A1A0_0

3. 接收并检测 EEPROM 发来的应答信号 ACK

4. 发送高字节地址位

5. 接收并检测 EEPROM 发来的应答信号 ACK

6. 发送低字节地址位

7. 接收并检测 EEPROM 发来的应答信号 ACK

8. 发送启动信号

9. 发送控制字 1010_A2A1A0_1

10. 接收并检测 EEPROM 发来的应答信号 ACK

11. 读取一个字节数据

12. 发送 NO ACK 信号

13. 发送停止信号

接下来则需要分析各步骤具体意义:

1.启动信号

在 SCL 保持高电平期间,如果 SDA 出现由高到低的跳变沿,代表启动信号

2. 控制字

我们的控制字为 1010_0000,其中 1010 为 EEPROM 的型号标识,为一组固定的序列,紧接着 A2,A1,A0 就是我们的片选信号,最后一位为读写控制位,低电平代表写,高电平代表读,我们这里首先需要对 EEPROM 写入地址位,所以我们最后一位为 0。

3. 高/低位地址

由于 24LC64 有 64Kbit 的存储空间,所以我们需要 13 位的地址位宽才能寻址所有的存储空间,由于 IIC 协议规定只能以字节形式写入,所以必须将 13 位的地址扩展为 16 位的地址,分为高八位和低八位,多出来的前三位填充任意数据即可,对我们的寻址地址没有影响。

3. 停止信号

4. 应答信号 ACK

应答信号是由数据接收方发出的,当 SCL 为高电平期间,如果监测到 SDA 为低电平,说明有应答信号。

5. 非应答信号 NO ACK

非应答信号也是由数据接收方发出的,当 SCL 为高电平期间,如果 SDA 为高电平,说明有非应答信号。

说明:由于 IIC 总线协议启动和停止信号都是在 SCL 高电平期间发生跳变,这就决定了我们其他数据的改变只能发生在 SCL 低电平期间,在 SCL 为高电平期间,数据必须保持稳定。即在 SCL 低电平改变数据,在 SCL 高电平采集数据。相比于单字节读写,页面读写只是增加了几个状态,具体时序如下,这里和后面的设计代码不做详细论述。

Page Write 时序如下:

Page Read 时序如下:

设计架构图:

本设计用两个按键控制 EEPROM 读写,当写按键按下时,向EEPROM 某一固定地址写入一个字节数据,当读按键按下时,将该地址数据读出,并显示到数码管LED 灯是一个标志信号,LED 亮说明数据写入完毕。设计架构如下:

设计代码:

iic_wr 模块代码:负责进行 IIC 数据的读写

seg7_lut 模块代码,负责数码管显示

IIC 顶层模块代码:

tb 顶层测试模块代码:

仿真图:

随机读写,仿真写时序:

随机读写,仿真读时序:

在仿真时,需要将检测应答的状态跳过,直接向下一状态跳转,观察读写时序,当读写按键按下时,都会产生对应的动作。

责任编辑:lq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1629

    文章

    21735

    浏览量

    603122
  • IIC
    IIC
    +关注

    关注

    11

    文章

    300

    浏览量

    38321
  • 工业控制
    +关注

    关注

    37

    文章

    1453

    浏览量

    85836

原文标题:FPGA入门课程《基于 FPGA 的 IIC设计》

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何通过FPGA配置CDCI6214?

    我想直接采用FPGA通过IIC接口配置CDCI6214内部寄存器,而不是先写入EEPROM再由EEPROM写入内部寄存器。在这种配置下,RESETN和EEPROMSEL引脚应该如何接?
    发表于 11-11 06:24

    MCU通过IIC口控制TLV320AIC3204,请问MCU的IIC接口和TLV320AIC3204的IIC接口对接时需要电平转换吗?

    MCU通过IIC口控制TLV320AIC3204,该芯片的IOVDD接1.8V,MCU的IIC上拉电平是3.3V,请问MCU的IIC接口和TLV320AIC3204的IIC接口对接时
    发表于 10-30 06:02

    IIC信号线需要增加上拉电阻,是因为IIC的IO是什么

    IIC(Inter-Integrated Circuit,即集成电路总线)信号线需要增加上拉电阻,这主要是因为IIC的IO(输入输出)设计采用了开漏(Open-Drain)输出方式。开漏输出方式在
    的头像 发表于 10-06 15:50 676次阅读

    FPGA通过IIC给TLV320AIC3204写入寄存器,读出来的数据一直是零,为什么?

    FPGA通过IIC给TLV320AIC3204写入寄存器,但好像没写进去,读出来的数据一直是零
    发表于 09-29 06:06

    iic通讯的ardunio的文件下载

    里面很多iic通讯的ardunio的文件
    发表于 07-05 10:55 1次下载

    示波器如何捕获和分析IIC波形?

    示波器捕获和分析IIC(集成电路间通信)波形是一项重要的电子测量任务,特别是在嵌入式系统和微控制器的调试过程中。
    的头像 发表于 05-20 15:08 3078次阅读

    STM8L051F3手册里是否有IIC作为slave的IIC address?

    各位使用过STM8L051F3硬件IIC的朋友们,手册里是否有IIC作为slave的IIC address,并没有看到啊。请大家帮忙告知。谢谢!
    发表于 05-07 07:25

    lis3dh使用IIC通讯,CS引脚悬空也能正常IIC通信吗?

    芯片手册上CS引脚接高电平是IIC通讯,接低电平是SPI通讯;接手的项目中,CS引脚是悬空的,IIC通讯能进行,我想知道悬空能IIC可靠通讯嘛?
    发表于 03-28 09:44

    巨霖科技将亮相IIC Shanghai并发表主题演讲

    活动预告∣巨霖科技将亮相IIC Shanghai 并发表主题演讲
    的头像 发表于 03-27 09:50 415次阅读
    巨霖科技将亮相<b class='flag-5'>IIC</b> Shanghai并发表主题演讲

    FPGA实现IIC协议的设计

    今天给大家带来的是IIC通信,IIC协议应用非常广泛,例如与MPU6050进行通信,配置OV5640摄像头、驱动OLED屏幕等等,都需要使用到IIC协议,所以掌握它是非常必要的,废话不多说,接着往下看。
    的头像 发表于 03-04 10:49 1258次阅读
    <b class='flag-5'>FPGA</b>实现<b class='flag-5'>IIC</b>协议的设计

    GD32 MCU碰到IIC总线卡死怎么办?

    大家在使用MCU IIC通信时,若碰到设备复位或者总线干扰等情况,可能会导致IIC总线卡死,表现上总线上SDA或者SCL其中一根线为低电平,IIC总线一直处于busy状态。此时若代码上一直等待总线空闲,则可能导致软件死机,为解决
    的头像 发表于 02-24 09:46 3838次阅读
    GD32 MCU碰到<b class='flag-5'>IIC</b>总线卡死怎么办?

    IIC总线为什么是半双工?

    IIC(Inter-Integrated Circuit)总线是一种半双工的串行通信接口。在I2C总线上,主设备和从设备之间的数据传输是采用半双工模式进行的。这意味着主设备和从设备在不同的时间段内交替发送和接收数据。
    的头像 发表于 02-02 16:37 4638次阅读
    <b class='flag-5'>IIC</b>总线为什么是半双工?

    IIC的GC模式是用来干啥的?

    有谁知道IIC的 GC模式是用来干啥的?MCU的 IIC从地址可以设置多个在实际应用中有啥意义?
    发表于 01-16 07:01

    【CW32学习笔记】IIC接口-主机发送

    接着就是比较重要的部分了,IIC接口的收发并不是全自动的,因为一个完整的通信不仅包括发数据(地址、数据什么的),还包含收数据(啥也不干也得接收ACK信号),所以IIC通信的每个部分基本上都是收发易位的过程,IIC外设并不会自动完
    的头像 发表于 01-10 15:59 669次阅读
    【CW32学习笔记】<b class='flag-5'>IIC</b>接口-主机发送

    IIC总线的FPGA实现说明

    DE2_TV中,有关于寄存器的配置的部分,采用的方法是通过IIC的功能,这里对IIC总线的FPGA实现做个说明。
    的头像 发表于 01-05 10:16 1056次阅读
    <b class='flag-5'>IIC</b>总线的<b class='flag-5'>FPGA</b>实现说明