当前位置: 首页 > news >正文

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

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

二、模拟主机发送IIC时序
接口列表:

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

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

注2 : IIC总线协议中文版 page 27
下面根据IIC的传输协议画出状态图及主机发送的IIC时序图:

SCL的高电平时间和低电平时间分别要大于4.0us和4.7us,我们的系统时钟频率为50MHz,它的周期为20ns,由此可以设计一个时钟分频计数器sclk_cnt,在状态机不为空闲状态时开始计数。每计数到511时清零,使SCL在sclk_cnt计数到255拉高,计数到511时拉低。分频后的SCL的周期为10.24us,并且它的时钟频率小于100KMhz,可以满足需求。
首先要完成开始条件的时序,当检测到HMDL_RX_PHA的上升沿并且HMDL_RX_TXEN为1时,IIC开始工作,SCL和SDA这两条线上电之后为高,在产生开始标志时,这里需要满足起始条件的保持时间(至少4.0us),也就是数据线由高变低后,SCL为高的保持时间,这里再增加一个计数器scl_start_time_cnt,计数到511时,SDA拉低,计数到1023并且sclk_cnt为511时,SCL拉低。这样就满足了起始条件的时序要求。
SDA作为双向接口,为了可以控制它的输出,所以用了两个信号来作为它的输入数据和输出数据。Sda_in为SDA的缓冲,可以直接使用。Sda_out为SDA的输出。Sda_oe为控制sda_out输出的使能,当sda_oe为1时,sda_out数据有效,sda_oe为0时,sda_out数据无效,表现为高阻状态。
buf sda_i(sda_in,sda);
assign sda = (sda_oe==1) ? sda_out : 1’bz;
在发送器件地址时,为了能在SCL的低电平的中心位置发出数据,我们设计了两个信号,scl_l_flag和scl_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_cnt为sda线上传输单bit数据的计数,每发送或接收到一个数据,计数+1,,在SLAVE_ADDR_ER和SLAVE_ADDR_RD状态中,计数为1的时候对应sda线上的第一个bit位,而在WR_ADDR和RD_DATA状态中,计数为0的时候对应sda线上的第一个bit位。
在WR_ADDR状态中,iic_scl_cnt计数到8时为接收ACK应答的时间段,当计数到8时接收到ack应答并且到下一个SCL低电平中心位置时,状态跳转到SCL_START_T。

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

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

二、 总结
到此模拟主机发送IIC时序的模块完成了,后边再来模拟EEPROM编写发送数据的代码,发送的数据就为之前储存在ROM中的EDID数据。
本文章由威三学社出品
对课程感兴趣可以私信联系

http://www.jsqmd.com/news/576850/

相关文章:

  • 突破可视化边界:Charticulator重新定义数据叙事的技术实践
  • Actran气动噪声、旋转机械噪声、水动力噪声及振动噪声
  • CrossViT:从多尺度融合到代码实践,深入解析双分支Transformer的设计精髓
  • Blue-Book-Ed17-part-1-zh-CN
  • 有些路看起来很难走,其实是在带你慢慢变强
  • 工业通风降温新方案:2026年优选工业空调品牌推荐 - 品牌2026
  • 在项目管理中,甘特图是不可或缺的工具,它能直观地展示任务进度和时间安排。今天,我将向大家展示如何使用Qt/C++实现一个功能强大的甘特图控件
  • 【含文档+源码】基于Web的面对面爱心众筹平台的设计与实现
  • 遗传算法在低碳冷链路径规划中的应用探索
  • 青岛兴盛伟业软硬包加工装饰有限公司: 口碑好的青岛崂山区做软包维修 沙发翻新公司TOP6 - LYL仔仔
  • 萤石云硬件接入如何完成云对讲套件低代码集成?
  • 一次慢改表引发的线上死锁事故复盘
  • 单片机与74ch595接法
  • OpenClaw可能遇到的安全风险
  • Unitree Go2 ROS2 SDK:让四足机器人像宠物一样听从你的指挥
  • YOLO12模型在计算机视觉竞赛中的实战应用
  • GLM技术复盘:篇论文深度解读智谱模型家族
  • 2026成都奔驰威霆配置可靠服务商推荐榜 - 优质品牌商家
  • 一篇讲透线程池核心代码:从 submit 到执行链路(含 lambda / move / packaged_task)
  • 告别卡顿!用z-paging虚拟列表优化Uni-app长列表,Tab切换丝滑回顶方案
  • AI CRM公司排名前瞻:原圈科技如何颠覆高净值行业获客
  • 第06章:LangChain使用之Tools
  • [实战]C语言实现带限高斯白噪声生成与Python频谱验证(附完整代码)
  • 在快马平台一键生成mac版openclaw数据抓取脚本原型
  • 为什么现代C++项目都推荐CMake+Ninja?实测构建速度对比Makefile
  • 超低功耗血压计和心率监视系统(C语言实现)
  • 树莓派入门实战:从烧录系统到远程连接全流程指南
  • 终极视频下载解决方案:如何利用Video DownloadHelper伴侣应用轻松获取在线资源
  • 避坑指南:用Python+Selenium批量爬取专利数据时,你可能遇到的5个坑及解决办法
  • 通达信手机版安装自定义指标保姆级教程:以‘双紫擒龙’为例,解决‘我的指标’不显示问题