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
    +关注

    关注

    1655

    文章

    22287

    浏览量

    630334
  • IIC
    IIC
    +关注

    关注

    11

    文章

    308

    浏览量

    40381
  • 工业控制
    +关注

    关注

    38

    文章

    1607

    浏览量

    89905

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    英诺达亮相IIC Shenzhen 2025

    2025年11月25日,国际集成电路展览会暨研讨会(IIC Shenzhen)在深圳举办,英诺达创始人及CEO王琦博士应邀出席,并于“全球CEO峰会”发表题为《低功耗设计新范式:突破算力芯片能效瓶颈》的主旨演讲,引发行业广泛关注。
    的头像 发表于 12-03 10:53 234次阅读

    基于hbirdv2-sdk的iic 0.96寸lcd调试

    一.前言 简介: 基于hbird-sdk的硬件IIC控制 0.96寸lcd. 二.工程结构 硬件: mcu200t fpga开发板 软件结构: 主要由Makefile main.c
    发表于 10-30 06:20

    请问IIC的设备驱动兼容SMbus协议吗?

    请问IIC的设备驱动兼容SMbus协议么?
    发表于 09-29 09:53

    如何从FX2LP设备的EEPROM读取固件(.iic)?

    是否有任何工具可以从 FX2LP 设备的 EEPROM 读取固件(.iic)? 我想备份旧固件来重新编程我的设备,但我丢失了旧的 IIC 固件。
    发表于 05-07 06:37

    IIC接口的IIC_SCL和IIC_SDA引脚做普通GPIO,程序启动不起来怎么解决?

    想用IIC接口的IIC_SCL和IIC_SDA引脚做普通GPIO,两个引脚对应的是GPIO58和GPIO59,更改代码将设置为普通GPIO引脚模式后,程序启动不起来。问:这种情况如何解决,官方支持这种应用吗?
    发表于 05-06 08:59

    ZYNQ FPGA的PS端IIC设备接口使用

    zynq系列中的FPGA,都会自带两个iic设备,我们直接调用其接口函数即可运用。使用xilinx官方提供的库函数,开发起来方便快捷。
    的头像 发表于 04-17 11:26 1754次阅读
    ZYNQ <b class='flag-5'>FPGA</b>的PS端<b class='flag-5'>IIC</b>设备接口使用

    巨霖科技IIC Shanghai 2025精彩回顾

    近日,全球半导体行业瞩目的国际集成电路展览会暨研讨会(IIC Shanghai 2025)在上海金茂君悦大酒店盛大开幕。
    的头像 发表于 03-28 11:27 870次阅读

    为什么IIC总线会难住这么多人?

    为什么 IIC 总线让很多人头疼?其实可以把它想象成一场复杂的 "设备对话游戏",新手容易在这些地方栽跟头:
    的头像 发表于 03-12 10:14 812次阅读
    为什么<b class='flag-5'>IIC</b>总线会难住这么多人?

    在APP FPGA 中通过IIC接口对DLPC910寄存器进行配置遇到的两个问题求解

    在APP FPGA 中通过IIC接口对DLPC910寄存器进行配置,有两个问题想要请教: 1、DLPC910被封装成了FPGA,通过IIC改变它的寄存器的值,掉电后,该值会被保留还是
    发表于 02-25 06:47

    使用FPGA控制DLPC3438,采用IIC协议进行读写操作,读取的数据存在错误,无法正确从寄存器中读取数据怎么解决?

    我使用FPGA控制DLPC3438,采用IIC协议进行读写操作,主要存在如下问题: (1)当写入8个字节到0x2E地址时,通过Xilinx工具ChipScope抓取IIC信号,发现DLPC3438
    发表于 02-24 07:47

    DLPC350怎么才能实现iic通讯?

    我想通过单片机iic接口控制DLPC350,从地址是0x34和0x35,然后对对应寄存器进行读写,设置的频率是100khz,但是发现无法通讯上,我想知道怎么才能实现iic通讯?
    发表于 02-21 08:07

    DLPC3479 IIC通讯异常的原因?

    电路是按照TI硬件方案自主设计的电路,但是没有使用Cypress,直接用了一个FPGA通过IIC控制,上电后DLP3479的HOST_IRQ引脚正常拉低,但是遇到如下问题: 1. 按照说明发送
    发表于 02-18 07:04

    DLPC3479主芯片的IIC1是1.8V,与DLPC3479从芯片的IIC0 3.3V直接相连,会不会导致主芯片IIC1引脚出现问题?

    在dlp4710evm-lc _sch参考原理图里,DLPC3479主芯片的IIC1是1.8V,与DLPC3479从芯片的IIC03.3V直接相连,这个会不会导致主芯片IIC1引脚出现问题?比如
    发表于 02-17 06:27

    基于瑞萨RA0E1开发板的IIC OLED测试

    基于前面关于瑞萨e² studio开发软件的使用,以及工程测试基础,本文进一步探索实现硬件IIC OLED的文字和图片显示。
    的头像 发表于 02-13 13:36 1256次阅读
    基于瑞萨RA0E1开发板的<b class='flag-5'>IIC</b> OLED测试

    请问DS90UB903Q的IIC工作频率必须为100KHz吗?

    ;PCLK=10MHz。芯片完成上电,使用FPGAIIC访问DS90UB903Q的ID,结果为0xFF。这与芯片默认的地址0xB0不符。FPGAIIC频率为20KHz。 经过调试,
    发表于 12-26 07:08