FPGA HDMI IP之DDC(本质I2C协议)通道学习

2024-01-28 13:52

本文主要是介绍FPGA HDMI IP之DDC(本质I2C协议)通道学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目的:

        使用KingstVIS逻辑分析仪软件分析HDMI的DDC通道传输的SCDC数据(遵循I2C协议),同时学习了解SCDC的寄存器与I2C通信协议。

部分英文缩写:
HDMIHigh Definition Multi-media Interface高清多媒体接口
DDCDisplay Data Channel显示数据通道
SCDCStatus and Control Data Channel状态和控制数据通道

一、资源:

参看附件:FPGA HDMI IP之DDC_I2C_SCDC协议.zip

解压缩后内容如下:

667008402f81431b8ce5cb170d4fb103.png

1.1 HDMI_2.0_协议.pdf

SCDC学习内容参考HDMI2.0第10章,如下图:

3aa8c10ce3284c8d8246b42ca1728c6f.png

 

1.2 HDMI_DDC协议解读.kvdat

附件HDMI_DDC协议解读.kvdat是通过逻辑分析仪抓取的一次HDMI DDC通道通信的数据,仅供学习HDMI SCDC使用。

全部内容如下图所示:

8ecfb0beb28145c3b6fe47c23201ae97.png

1.3 I2C协议标准中文版

f339170a39c44990834f0aaedb4e3ecd.png

1.4 KingstVIS逻辑分析仪软件:

官网:逻辑分析仪软件 KingstVIS

c370a5ccb43b4179b46169c6c40c737b.png

用于打开HDMI_DDC协议解读.kvdat数据进行分析学习。

二、DDC通道遵循的I2C协议

2.1 I2C总体特征

2.1.1 I2C通信速率

总线上的数据传输速率有三个标准:标准模式、快速模式与高速模式。

I2C总线模式通信速率
标准模式100kbit/s
快速模式400kbit/s
高速模式3.4Mbit/s

2.1.2 I2C总线能支持的IC接口数量

注意:

         连接到总线的I2C接口数量只由总线电容是400pF的限制决定

2.1.3 其他补充

  • SDA和SCL都是双向线路
  • SDA和SCL都通过一个电流源或上拉电阻连接到正的电源电压,因此当总线空闲时这两条线路都是高电平
  • 连接到总线的器件输出级必须是漏极开路或集电极开路才能执行线与的功能

2.2 起始和停止条件

a79645a189ed40d5834c2c8601d027f4.png

如上图所示,可以看到起始条件和停止条件:

起始条件:

        SCL高电平期间SDA由高电平向低电平切换

停止条件:

        SCL高电平期间SDA由低电平向高电平切换

2.3 传输数据

 

2.3.1 传输SDA数据的有效性

c8c1f0f0194a4cc5a621f6d9df7e558c.png

SDA数据的传输需要遵循两个基本约束:

SDA 必须在SCL的高电平周期保持稳定

SDA只能在 SCL的低电平周期进行高低电平转换

2.3.2 字节格式

  • 发送到 SDA 线上的每个字节必须为 8 位;
  • 首先传输的是数据的最高位MSB;
  • 每次传输发送的字节数量不受限制;
  • 每个字节后必须跟一个响应位;

2.3.3 响应ACK

  • 响应ACK时钟脉冲由主机Master产生;
  • 在响应ACK的时钟脉冲高电平期间发送器(Master/Slave都可以是发送器)释放 SDA 线为高电平
  • 在响应ACK的时钟脉冲高电平期间接收器必须将 SDA 线拉低,使SDA在这个时应的时钟脉冲的高电平期间保持稳定的低电平;
  • 非响应NACK就是在响应的时钟脉冲高电平期间接收器没有将 SDA 线拉低

63142f8873d1405e921ae59e3ce5a74b.png

三、DDC数据传输协议:

HDMI2.0明确规定从机(Slave)地址为0xA8/0xA9:

12480cf00daa403f90d2a0db25a3c431.png

十六进制二进制意思
0xA81010 1000Master写
0xA91010 1001Master读

数据/地址Byte是左高右低,发送顺序是高位先发送:

       前7bit对应Slave地址位为:0x54=0b101_0100

       第8bit为0,代表Master接下来要写数据:0xA8=0b1010_1000

       第8bit为1,代表Master接下来要读数据:0xA9=0b1010_1001

3.1 SCDC Update Read模式

SCDC Update Read作用:在Source读取更新标志时最小化消息的长度。

In this mode, the 8-bit I 2 C address 0xA9 is used without a repeated Start and reads commence from offset 0x10, corresponding of the UPDATE_0 sub-address.

暂时没用到~

9a232acccdd043fdbba86ada3f55e55a.png

3.2 SCDC Combined Format Read模式

SCDC Combined Format Read模式支持连续读多个Bytes数据。

协议如下:

494345728c214357bd09a3f294c3c16f.png

Master端使用组合格式读取,先是0xA8表示写入接下来的一个子地址(表示偏移量),然后是重复START条件,最后0xA9表示读取接下来的数据,可以是n个。

所有实现SCDC的HDMI sink都应该支持多字节读取,并自动增加偏移量。

3.3 SCDC Write模式

SCDC Write模式支持写入多Byte数据。

9c394f17d60c4670bdf2c3ee0826aa41.png

Master端写模式,先是0xA8表示写入接下来的一个子地址(表示偏移量),接着读取接下来的n个数据,并自动增加偏移量。

四、SCDC Channel Structure通道结构-寄存器地址与功能

参看HDMI2.0协议的10.4.1 Status and Control Data Channel Structure节:

bdaab479eb96436c95efa3d7f67c78f4.png

Reserved默认为0x00.

各寄存器的功能查看HDMI2.0协议。

 

五、分析HDMI_DDC协议解读.kvdat文件

5.1 使用KingstVIS软件打开DDC数据附件

使用KingstVIS打开HDMI_DDC协议解读.kvdat文件后使用I2C解析器设置如下:

b0972bd294a548adadc3695559081a86.png

I2C解析器设置:

SDA:2-“同道 2”

SCL:3-“通道 3”

地址显示格式:8-bit,包含读写位

数据导出格式:默认Packets

并截取HDMI_DDC协议解读.kvdat开始通信部分数据分析:

d13a74feb7524fd1981d04c286910222.png

5.2 查看时钟频率

首先截取10个周期clk查看时钟频率约为95.2KHz,是I2C的标准模式(100KHz)。

0d8109d063b94f188bc7a3aa2775900c.png

2060d62cd4f0456da74a58e7fbe1dcea.png

5.3 数据分析

这里仅分析SCDC Write模式与SCDC Combined Format模式,SCDC Update Read模式本质一样。

5.3.1 SCDC Write模式数据分析

 

af101018ab044318a6e327e7a7af1ff7.png

上图通过逻辑分析仪看出是:

0xA8:Master写

0x20:子地址,通过查HDMI2.0规格书可以知道0x20是TMDS配置寄存器;

OffsetR/W ?Name
0x20R/W均可TMDS_Config

0x03:要写进到Slave的寄存器0x20的数据Data为0x03=0b0000_0011.

a44bdf4f1e114f34ae6f55140382fe93.png

Scrambling_Enable(Bit 1)置1;

TMDS_Bit_Clock_Ratio(Bit 0)置1;

使能扰码并设置每个TMDS Clock周期与TMDS Bit的比率为40:1。

5.3.2 SCDC Combined Format模式数据分析

94873c51cc63411eb123c81659f7c4a2.png

0xA8:Master写

0x40:子地址,通过查HDMI2.0规格书可以知道0x40是Status_Flags_0标志寄存器;

OffsetR/W ?Name
0x40仅支持RStatus_Flags_0

0xA9:Master读

0x00:Master从Slave的寄存器0x40读到的数据Data为0x00=0b0000_0000.

c81fd45431e24abfb0ac51a3c4da2ff9.png

该寄存器用于检测Slave端是否成功识别Clock以及3个数据通道是否成功Lock住,很显然,时钟与数据都没lock 住,也就是通信不成功。

其他HDMI_DDC协议解读.kvdat数据解析同上。

 

 

这篇关于FPGA HDMI IP之DDC(本质I2C协议)通道学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/653820

相关文章

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Linux查询服务器 IP 地址的命令详解

《Linux查询服务器IP地址的命令详解》在服务器管理和网络运维中,快速准确地获取服务器的IP地址是一项基本但至关重要的技能,下面我们来看看Linux中查询服务器IP的相关命令使用吧... 目录一、hostname 命令:简单高效的 IP 查询工具命令详解实际应用技巧注意事项二、ip 命令:新一代网络配置全

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

Java对接MQTT协议的完整实现示例代码

《Java对接MQTT协议的完整实现示例代码》MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛,:本文主要介绍Ja... 目录前言前置依赖1. MQTT配置类代码解析1.1 MQTT客户端工厂1.2 MQTT消息订阅适配器1.

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过