在AVI传输过程中有三个字节没有被传输。这是在HDMI1.4B中找到的前三个字节的数据。
>> hex2dec('82') ans = 130
下图中的数据中在HDMI中接收到的一串数据,最低位A6是校验位,把第一个字节相加,然后再加上前面的三个字节的数据,刚好是512,正好是256的位数,这说明我有猜想是正确的。
166(a6h)+17(11h) + 168(a8h) + 16(10h) =
>> hex2dec('a6')
ans =
166
>> hex2dec('a8')
ans =
168
>> 166+17+168+16 ans = 367
>> 367+145
ans =
512
这是第二组数据
>> hex2dec('b1') ans = 177 >> hex2dec('28') ans = 40 >> hex2dec('84') ans = 132 >> hex2dec('10') ans = 16 177+40+132+16+2
ans =
367
下面是写的一个Matlab小程序实现校验值求法
function checksum = checksum_128b(varargin)
%%输入是所有字节,输入的每个字节要求为16进制数据
%输出是校验值,校验值是16进制
nVararg = length(varargin);
for i = 1:nVararg
data(i) = hex2dec(varargin(i));
end
sum_data = sum(data); checksum = 256 - mod(sum_data,256 );
checksum =dec2hex(checksum);
以第一个例子来看下
>> checksum_128b('82','02','0d','11','a8','10')
ans =
A6
在应用Altera HDMI IP的过程中,虽然没有提供数据包的Header部分,但是在实际的计算中一定要从HDMISpecification中找到相应的部分,再计算检验码。
比如下面语音数据包的头部分。一开始没用加上Header部分,计算出的结果是E6H,但是与接收到的部分不一样,原来它的计算过程中是添加了Header,正确的结果为57H
1
2
3
4
5
6
7
8
9
10
11
12
|
>> checksum_128b( '09' , '11' )
ans =
E6 >> checksum_128b( '09' , '11' , '84' , '01' , '0a' )
ans =
57 |