威三电子  

               威三电子

HDMI数据的接收发送实验(八)

2026-06-30 10:29:26

浏览:

一、          概述上一章节创建hex文件写入EDID编码,接下来我们需要把ROM中的数据通过IIC协议传输到HDMI中,为了能够更方便观察具体时序,我


一、          概述

上一章节创建hex文件写入EDID编码,接下来我们需要把ROM中的数据通过IIC协议传输到HDMI中,为了能够更方便观察具体时序,我们首先模拟主机发送的IIC请求,这样可以根据仿真来观察IIC的传输过程。

 

二、模拟主机发送IIC时序

接口列表:

信号名称

输入输出

位宽

备注

sclk

input

1

系统时钟

Reset_n

input

1

低电平有效复位

Hdmi_rx_hpd

input

1

热插拔信号

Hdmi_rx_ten

input

1

控制EEPROM的输出使能,为1时输出启动

scl

output

1

IIC传输数据的时钟

sda

inout

1

IIC的传输数据

 

我们可以根据AT24CM01的顺序读取时序来确定它的传输方式,根据图1可以看出它的传输过程,再写出它的状态图,根据图2和图3所示的时间规范,设计出合适的传输时序。

1

1为顺序读取的时序,顺序读取可以由随机地址读取发起。当微控制器接收到一个数据字节后,它用一个确认来响应。只要EEPROM接收到确认,微控制器就会继续递增寄存器地址,并自动读取寄存器当中的数据。当微控制器没有响应0,并且产生后续STOP停止条件后,顺序读取结束。所以在顺序读取时,读***个数据后只要接收到ACK响应,就会继续读取下一个寄存器地址的数据,直到发送非应答信号和停止信号,停止读取。

2

1:  IIC总线协议中文版 page 28

3

2 IIC总线协议中文版 page 27

下面根据IIC的传输协议画出状态图及主机发送的IIC时序图:

4

SCL的高电平时间和低电平时间分别要大于4.0us4.7us,我们的系统时钟频率为50MHz,它的周期为20ns,由此可以设计一个时钟分频计数器sclk_cnt,在状态机不为空闲状态时开始计数。每计数到511时清零,使SCLsclk_cnt计数到255拉高,计数到511时拉低。分频后的SCL的周期为10.24us,并且它的时钟频率小于100KMhz,可以满足需求。

首先要完成开始条件的时序,当检测到HMDL_RX_PHA的上升沿并且HMDL_RX_TXEN1时,IIC开始工作,SCLSDA这两条线上电之后为高,在产生开始标志时,这里需要满足起始条件的保持时间(至少4.0us),也就是数据线由高变低后,SCL为高的保持时间,这里再增加一个计数器scl_start_time_cnt,计数到511时,SDA拉低,计数到1023并且sclk_cnt511时,SCL拉低。这样就满足了起始条件的时序要求。

SDA作为双向接口,为了可以控制它的输出,所以用了两个信号来作为它的输入数据和输出数据。Sda_inSDA的缓冲,可以直接使用。Sda_outSDA的输出。Sda_oe为控制sda_out输出的使能,当sda_oe1时,sda_out数据有效,sda_oe0时,sda_out数据无效,表现为高阻状态。

buf        sda_i(sda_in,sda);

assign sda = (sda_oe==1) ? sda_out : 1’bz;

在发送器件地址时,为了能在SCL的低电平的中心位置发出数据,我们设计了两个信号,scl_l_flagscl_h_flag,分别为SCL的低电平中心和高电平中心,器件地址在7位数据中的高4位有效,第8位的读写位如果为写,则为A0

slave_addr_wr_shift为移位寄存器,它的初始值为A0,使它在SLAVE_ADDR_WR状态中icc_scl_cnt<=7 并且 scl_l_flag=1时把0移入***位。

在每个SCL的低电平中心位置把slave_addr_wr_shift的***位赋值给sda_out。,在移出8位数据后,从机会返回ACK应答,当SCL为高时,sda_in为低,则代表接收到了响应。iic_scl_cnt计数到9时为接收ACK应答的时间段,当计数到9时接收到ack应答并且到下一个scl的低电平中心位置时,状态跳转到WR_ADDR

 

iic_scl_cntsda线上传输单bit数据的计数,每发送或接收到一个数据,计数+1,,在SLAVE_ADDR_ERSLAVE_ADDR_RD状态中,计数为1的时候对应sda线上的***个bit位,而在WR_ADDRRD_DATA状态中,计数为0的时候对应sda线上的***个bit位。

WR_ADDR状态中,iic_scl_cnt计数到8时为接收ACK应答的时间段,当计数到8时接收到ack应答并且到下一个SCL低电平中心位置时,状态跳转到SCL_START_T

5

IIC发送完器件地址和写寄存器地址后,会发送一次重开始标志,使SCLSCL_START_TREPEATED_START状态时为高,为了使SCL的低电平时间满足时序要求,使SCLSCL_START_T状态下scl_start_time_cnt小于127时为低,sda_outSCL_START_T状态下拉高,在REPEATED_START状态拉低,根据时序规范,重复起始条件的建立时间不小于4.7us,后SCL保持高电平的时间要大于4.0us,所以这里还需要scl_start_time_cntSCL_START_T状态时开始计数,计数到511并且sclk_cnt也计数到511时状态跳转到REPEATED_START,再经过一个SCL的周期后,状态跳转到SLAVE_ADDR_RD,再传输一次器件地址,但这次的读写位为1,表示接下来准备从器件读取数据,发送完后同样接收ACK,再跳转到RD_DATA状态。

6

从什么位置开始读取呢,其实就是重开始之前发送的写寄存器地址开始读,我们发送的写寄存器地址为00H,所以读的***个寄存器地址也是00H,需要读出128个字节,也就是读到127的寄存器地址结束。我们每接收8位数据,就要给对方发送一次ACK应答,同时可以利用寄存器rd_slave_data来存储接收到的数据,这样可以方便看出接收到的字节数据。当读出128个字节的数据后,会发送一个不应答信号,也就是***一个字节传出结束后,在iic_scl_cnt=8并且rd_data_cnt=127时,sda_out1,然后跳转到STOP状态,停止信号表现为在SCL为高时,SDA由低变高。停止条件的建立时间(SCL1SDA0)***4.0us,停止信号产生后,SCL还需要保持至少4.7us的高电平状态。所以需要先把SCL拉高,SDASCL拉高之前保持为0,使SDASCL为高时由低变高,来建立IIC的停止标志。

这里需要注意,SCL在拉高之前也要满足SCL为低电平的***时间的要求,所以设计一个产生停止条件的计数器stop_time,在STOP状态时,计数器开始计数。为了满足SCL为低的***时间要求,计数到255SDA拉低,计数器加到511时拉高,计数到1023时返回到IDLE状态,

7

二、          总结

到此模拟主机发送IIC时序的模块完成了,后边再来模拟EEPROM编写发送数据的代码,发送的数据就为之前储存在ROM中的EDID数据。

本文章由威三学院出品

对课程感兴趣可以私信联系

0
HDMI数据的接收发送实验(八)
一、          概述上一章节创建hex文件写入EDID编码,接下来我们需要把ROM中的数据通过IIC协议传输到HDMI中,为了能够更方便观察具体时序,我
长按图片保存/分享

北京威三电子科技有限公司

突破技术壁垒,芯创智联领航未来

 


北京威三电子科技有限公司 版权所有
京ICP备2026012969号
 

热线:

159-2199-9232

 

图片展示

淘宝店铺:

威三科教

地址:

北京市延庆区辰龙国际6号楼406室

微信公众号:

北京威三电子科技有限公司 

热线:159-2199-9232

淘宝店铺:威三科教

地址:北京市延庆区辰龙国际6号楼406


微信公众号

图片展示
北京威三电子科技有限公司 版权所有| 京ICP备2026012969号
微信公众号
客服中心
热线电话
15921999232
上班时间
周一到周五
二维码
扫码关注
客服中心
热线电话
15921999232
上班时间
周一到周五
二维码
扫码关注
添加微信好友,详细了解产品
使用企业微信
“扫一扫”加入群聊
复制成功!
添加微信好友,详细了解产品
我知道了