最近准备做一下USB2.0的基于FPGA的数据传输,特别是图像传输。在做的过程中遇到了各种各样的问题。下面就针对遇到的问题以及处理方法做一下相关总结。

     1、对于USB2.0的图像数据传输不能像UART那样直接传输TXT文件,因为会对TXT中的数据进行ASCII 转码(这是与我用的USB测试软件有关,我用的是Cypress USb Console)导致传输的数据错误。

     2、如果直接选择图像传输会产生一些本不属于图像的信号,例如传输.bmp 格式的文件,就会出现写一些代表这种格式的帧头文件。

    所以要把相关要传输的文件转换成.bin文件。上代码:

          

clc;
clear;
%读取图片转换成数据,函数imread()是度函数,里面的路径可以根据自己实际填写
img = imread('test.bmp');
%因为的图片数据是具有RGB的三位数组,分别提取
img_r=img(:, :, 1);
img_g=img(:, :, 2);

img_b=img(:, :, 3);

% 把所有的数据组合成,因为我们最终是想把数据转换成可以在VGA上显示的,
%所以要把原始数据转换成16BIT,RGB = 565 就是R截取高5BIT,G截取高6BIT,B截取高5BIT
[ROW COL]= size(img_r);%获取图像大小
for R = 1:ROW;
       for C= 1:COL;
           out_data_h((R-1)*COL+C)=bitand(img_r(R,C),248)+bitshift(bitand(img_g(R,C),224),-5);
           out_data_l((R-1)*COL+C)=bitshift(bitand(img_g(R,C),28),3)+bitshift(bitand(img_b(R,C),248),-3);
           
       end
end

%把拼接好的数据写入到.BIN文件中
fid= fopen('test.bin','wb');
for i = 1:ROW*COL;
    fwrite(fid,out_data_h(i));
    fwrite(fid,out_data_l(i));
end
fclose(fid);

  

   需要解释的是,在使用MATLAB仿真时图片个是不要设置的太大,不然的话生成不了.BIN 文件,或者生成了打开没有数据

   

这是 我们读取图像数据后工作台显示的数据格式,也就是说当前读取的这张图片大小是100*100,维度是3,分别代表了RGB三个分量,uint8代表的是每个分l量是用8个BIT表示的。

而我们同常在传输数据或者对数据进行显示是一般是一字节为单位的,比如实际情况USB2.0支持8BIT和16BIT的数据传输。并且适合RGB565模式。