Verilog IIC通信实验笔记

╄→гoц情女王★ 提交于 2019-12-22 06:33:10

Verilog IIC通信实验笔记

Write by Gianttank

我实验的是 AT24C08的单字节读,单字节写,页读和页写,在高于3.3V系统中他的通信速率最高400KHZ的,我实验里用的是100KHZ的速率。图1是硬件原理图clip_image002[5] 

图1

 clip_image004

 图2

图2是器件地址,我的原理图是A2接高。

IIC通信协议中要注意的地方:

1. 当时钟线SCL 高电平时,如果把数据线SDA 从高电平拉到低电平,则表示通信开始(START);如果把数据线SDA 从低电平拉到高电平,则表示通信结束(STOP)。SDA数据不变,视为数据采样。

2. 前一个STOP 结束后。与下一个START开始要保证5ms的间隔。

3. 页写有字节限制,而页读没有,可以一次读出所有的数据。

4. SDA信号在FPGA为接受方时要设置为高阻态。

5. 应答信号永远是接收方发送的,这个很重要,我就是卡在这里几天没找到原因。FPGA在读数据的时候,第9个周期是FPGA发低电平给EEPROM的。

图3为RTL视图clip_image006

图3

引脚定义

信号名称

方向

描述

clk

input

50M的主时钟

rst_n

input

复位信号

sw1

input

按键1 低电平有效 按下执行字节写

sw2

input

按键2 低电平有效 按下执行字节读

sw3

input

按键3 低电平有效 按下执行页写

sw4

input

按键4 低电平有效 按下执行页写

SDA

inout

IIC数据端口

SCL

output

IIC时钟端口

leddata

output

数码管段选

ledcom

output

数码管位选

代码中分了两个模块,iic_com 模块除了执行和I2C 通信有关的代码设计外,还有按键检测部分,而ledshow 模块只是驱动数码管显示读出的数据。对于这个通信的过程,内部使用了一段式状态机进行设计。图4是状态机的状态图。具体每个状态见程序。

 clip_image008

4

1.字节写

clip_image010

5

Modelsim后仿真的图

clip_image012

蓝色为sda数据线高阻态,fpga接受eeprom应答。写入数据88h。

2.字节读

clip_image014

6

Modelsim后仿真的图

clip_image016

3.页写

clip_image018

7

因为我只有8个数码管,所以我程序里的页写,页读都只有4个数据。

 

Modelsim后仿真的图

clip_image020

可以看到写入数据位21h,43h,65h,87h。

4.页读

clip_image022

8

随机字节读和当前字节读都能触发页读,我只做了随机字节读

Modelsim后仿真的图

clip_image024

这里就是 应答是fpga应答给eeprom的。

最后希望这篇文档能帮助对IIC协议还不够了解的同学。

源程序在下一篇文章中。

Write by Gianttank

我实验的是 AT24C08的单字节读,单字节写,页读和页写,在高于3.3V系统中他的通信速率最高400KHZ的,我实验里用的是100KHZ的速率。图1是硬件原理图clip_image002[5] 

图1

 clip_image004

 图2

图2是器件地址,我的原理图是A2接高。

IIC通信协议中要注意的地方:

1. 当时钟线SCL 高电平时,如果把数据线SDA 从高电平拉到低电平,则表示通信开始(START);如果把数据线SDA 从低电平拉到高电平,则表示通信结束(STOP)。SDA数据不变,视为数据采样。

2. 前一个STOP 结束后。与下一个START开始要保证5ms的间隔。

3. 页写有字节限制,而页读没有,可以一次读出所有的数据。

4. SDA信号在FPGA为接受方时要设置为高阻态。

5. 应答信号永远是接收方发送的,这个很重要,我就是卡在这里几天没找到原因。FPGA在读数据的时候,第9个周期是FPGA发低电平给EEPROM的。

图3为RTL视图clip_image006

图3

引脚定义

信号名称

方向

描述

clk

input

50M的主时钟

rst_n

input

复位信号

sw1

input

按键1 低电平有效 按下执行字节写

sw2

input

按键2 低电平有效 按下执行字节读

sw3

input

按键3 低电平有效 按下执行页写

sw4

input

按键4 低电平有效 按下执行页写

SDA

inout

IIC数据端口

SCL

output

IIC时钟端口

leddata

output

数码管段选

ledcom

output

数码管位选

代码中分了两个模块,iic_com 模块除了执行和I2C 通信有关的代码设计外,还有按键检测部分,而ledshow 模块只是驱动数码管显示读出的数据。对于这个通信的过程,内部使用了一段式状态机进行设计。图4是状态机的状态图。具体每个状态见程序。

 clip_image008

4

1.字节写

clip_image010

5

Modelsim后仿真的图

clip_image012

蓝色为sda数据线高阻态,fpga接受eeprom应答。写入数据88h。

2.字节读

clip_image014

6

Modelsim后仿真的图

clip_image016

3.页写

clip_image018

7

因为我只有8个数码管,所以我程序里的页写,页读都只有4个数据。

 

Modelsim后仿真的图

clip_image020

可以看到写入数据位21h,43h,65h,87h。

4.页读

clip_image022

8

随机字节读和当前字节读都能触发页读,我只做了随机字节读

Modelsim后仿真的图

clip_image024

这里就是 应答是fpga应答给eeprom的。

最后希望这篇文档能帮助对IIC协议还不够了解的同学。

源程序在下一篇文章中。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!