24. 基于OV5640的以太网视频传输

在前面的章节,我们已经实现了以太网数据回环,以及基于VGA、HDMI、TFT_LCD的以太网传输图片显示。在本章节,我们将以太网、OV5640摄像头与野火上位机相结合,通过OV5640摄像头采集图像信息,使用以太网传输给PC机,通过PC机上的上位机实时显示。

24.1. 理论学习

本章节涉及到的以太网、SDRAM以及OV5640摄像头的相关知识在前面章节均有详细讲解,此处不再赘述。读者若有遗忘,请回顾相关章节进行学习巩固。

24.2. 实战演练

24.2.1. 实验目标

通过实验设计并实现基于OV5640的以太网视频传输。使用OV5640摄像头采集图像信息,将图像信息暂存到SDRAM中,读取暂存的图像信息,通过以太网将读取的图片信息发送给PC机,使用上位机读取图像信息并实时显示,图像分辨率位640*480。

24.2.2. 硬件资源

硬件资源部分,读者可参阅“SDRAM读写控制器的设计与验证”“OV5640摄像头VGA图像显示”和“以太网数据环回实验”章节的硬件资源小节。

24.3. 程序设计

24.3.1. 整体说明

24.4. 上板调试

24.4.1. 引脚约束

实验目标已经明确,硬件资源也已经介绍完毕,我们开始程序设计部分的讲解。我们先来对实验工程进行一个整体说明,让读者了解整个实验工程的框架结构。实验工程整体框图,具体见图 74‑1;子功能模块简介,具体见表格 74‑1。

OV5640002

图 74‑1 实验工程整体框图

表格 74‑1 子功能模块功能描述

模块名称

功能描述

clk_gen

时钟信号生成模块(IP核)

ov5640_top

OV5640摄像头驱动模块

image_format

图像格式配置模块

image_data

图像数据打包模块

eth_udp_rmii

以太网数据收发器(RMII)

sdram_top

SDRAM数据读写控制器

eth_ov5640_rgb

顶层模块

由上述图表可知,实验工程包含6个子功能模块:时钟信号生成模块(clk_gen(IP核))、OV5640摄像头驱动模块(ov5640_top)、图像格式配置模块(image_format)、图像数据打包模块(image_data)、以太网数据收发器 (eth_udp_rmii)、SDRAM数据读写控制器(sdram_top)和顶层模块(eth_ov5640_rgb)。

时钟信号生成模块(clk_gen),为实验工程各模块提供工作时钟,调用IP核生成;OV5640摄像头驱动模块(ov5640_top),实现OV5640摄像头的寄存器配置、初始化,经OV5640摄像头传输的图像数据进行拼接,并暂存到SDRAM中;图像格式配置模块(image_format),生成图像格 式配置包,将图像格式按照野火上位机数据包格式进行打包,通过以太网发送给上位机,配置上位机的显示格式;图像数据打包模块(image_data),读取暂存在SDRAM中的图像数据,按照野火上位机图像格式进行打包,将图像数据通过以太网发送给上位机,实现图像显示;以太网数据收发器 (eth_udp_rmii),实现以太网数据收发操作;SDRAM数据读写控制器(sdram_top),暂存OV5640摄像头采集的图像数据;顶层模块(eth_ov5640_rgb),例化子功能模块,连接各自对应信号。

这一部分我们对实验工程整体做了简要介绍,工程涉及的子功能模块在前面章节已有详细介绍,下面我们顶层模块进行解释和说明。

24.4.1.1. 顶层模块

模块框图

顶层模块作用较为简单,内部实例化各子功能模块,连接子模块对应信号;外部输入输出摄像头、SDRAM、以太网等相关数据。在此我们只对顶层模块的整体框图和参考代码做一下介绍,无需绘制波形图。模块框图和输入输出信号简介,具体见图 74‑2、表格 74‑2。

OV5640003

图 74‑2 顶层模块框图

表格 74‑2 输入输出信号功能描述

信号

位宽

类型

功能描述

sys_clk

1Bit

Input

板卡晶振输入时钟,50MHz

sys_rst_n

1Bit

Input

系统复位,低电平有效

ov5640_pclk

1Bit

Input

摄像头传入工作时钟,频率24MHz

ov5640_vsync

1Bit

Input

传入图像场同步信号

ov5640_href

1Bit

Input

传入图像行有效区域

ov5640_data

8Bit

Input

传入图像信息

eth_clk

1Bit

Input

PHY芯片传入以太网时钟,频率50MHz

eth_rxdv_r

1Bit

Input

输入数据有效信号

eth_rx_data_r

2Bit

Input

输入数据

ov5640_rst_n

1Bit

Output

摄像头复位信号

ov5640_pwdn

1Bit

Output

摄像头时钟选择信号

sccb_scl

1Bit

Output

摄像头SCCB_SCL线

sccb_sda

1Bit

Inout

摄像头SCCB_SDA线

sdram_clk

1Bit

Output

SDRAM芯片时钟

sdram_cke

1Bit

Output

SDRAM时钟有效信号

sdram_cs_n

1Bit

Output

SDRAM片选信号

sdram_ras_n

1Bit

Output

SDRAM行地址选通信号

sdram_cas_n

1Bit

Output

SDRAM列地址选通信号

sdram_we_n

1Bit

Output

SDRAM写允许信号

sdram_ba

2Bit

Output

SDRAM的L-Bank地址线

sdram_addr

13Bit

Output

SDRAM地址总线

sdram_dqm

2Bit

Output

SDRAM数据掩码

sdram_dq

16Bit

Inout

SDRAM数据总线

eth_tx_en_r

1Bit

Output

以太网输出数据有效信号

eth_tx_data_r

2Bit

Output

以太网输出数据

eth_rst_n

1Bit

Output

PHY芯片复位信号,低电平有效

代码编写

顶层模块参考代码,具体见代码清单 74‑1。

代码清单 74‑1 顶层模块参考代码(eth_ov5640_rgb.v)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
module eth_ov5640_rgb
(
input wire sys_clk , //系统时钟
input wire sys_rst_n , //系统复位,低电平有效
//摄像头
input wire ov5640_pclk , //摄像头数据像素时钟
input wire ov5640_vsync, //摄像头场同步信号
input wire ov5640_href , //摄像头行同步信号
input wire [7:0] ov5640_data , //摄像头数据
output wire ov5640_rst_n, //摄像头复位信号,低电平有效
output wire ov5640_pwdn , //摄像头时钟选择信号
output wire sccb_scl , //摄像头SCCB_SCL线
inout wire sccb_sda , //摄像头SCCB_SDA线
//SDRAM
output wire sdram_clk , //SDRAM 时钟
output wire sdram_cke , //SDRAM 时钟使能
output wire sdram_cs_n , //SDRAM 片选
output wire sdram_ras_n , //SDRAM 行有效
output wire sdram_cas_n , //SDRAM 列有效
output wire sdram_we_n , //SDRAM 写有效
output wire [1:0] sdram_ba , //SDRAM Bank地址
output wire [1:0] sdram_dqm , //SDRAM 数据掩码
output wire [12:0] sdram_addr , //SDRAM 地址
inout wire [15:0] sdram_dq , //SDRAM 数据
//以太网
input wire eth_clk , //PHY芯片接收数据时钟
input wire eth_rxdv_r , //PHY芯片输入数据有效信号
input wire [1:0] eth_rx_data_r, //PHY芯片输入数据
output wire eth_tx_en_r , //PHY芯片输出数据有效信号
output wire [1:0] eth_tx_data_r, //PHY芯片输出数据
output wire eth_rst_n //PHY芯片复位信号,低电平有效
);

////
//\* Parameter and Internal Signal \//
////
//parameter define
parameter H_PIXEL = 24'd640 ; //CMOS水平方向像素个数,用于设置SDRAM缓存大小
parameter V_PIXEL = 24'd480 ; //CMOS垂直方向像素个数,用于设置SDRAM缓存大小
//板卡MAC地址
parameter BOARD_MAC = 48'h12_34_56_78_9A_BC;
//板卡IP地址
parameter BOARD_IP = {8'd169,8'd254,8'd255,8'd255};
//板卡端口号
parameter BOARD_PORT = 16'd1234;
//PC机MAC地址
parameter DES_MAC = 48'hff_ff_ff_ff_ff_ff;
//PC机IP地址
//parameter DES_IP = {8'd255,8'd255,8'd255,8'd255};
parameter DES_IP = {8'd192,8'd168,8'd0,8'd245};
//PC机端口号
parameter DES_PORT = 16'd1234;

//wire define
wire clk_25m ; //25MHz时钟,提供给摄像头驱动时钟
wire clk_100m ; //100MHz时钟,SDRAM操作时钟
wire clk_100m_shift ; //100MHz时钟,SDRAM相位偏移时钟
wire locked ; //时钟输出有效
wire rst_n ; //系统复位信号
wire cfg_done ; //摄像头初始化完成
wire wr_en ; //sdram写使能
wire [15:0] wr_data ; //sdram写数据
wire rd_en ; //sdram读使能
wire [15:0] rd_data ; //sdram读数据
wire sdram_init_done ; //SDRAM初始化完成
wire sys_init_done ; //系统初始化完成(SDRAM初始化+摄像头初始化)
wire eth_tx_req ; //以太网发送数据请求信号
wire eth_tx_done ; //以太网发送数据完成
wire eth_tx_start ; //以太网开始发送信号
wire [31:0] eth_tx_data ; //以太网发送的数据
wire [15:0] eth_tx_data_num ; //以太网单包发送的有效字节数
wire eth_tx_start_f ; //以太网开始发送信号(格式)
wire [31:0] eth_tx_data_f ; //以太网发送的数据(格式)
wire [15:0] eth_tx_data_num_f; //以太网单包发送的有效字节数(格式)
wire i_config_end ; //图像格式包发送完成
wire eth_tx_start_i ; //以太网开始发送信号(图像)
wire [31:0] eth_tx_data_i ; //以太网发送的数据(图像)
wire [15:0] eth_tx_data_num_i; //以太网单包发送的有效字节数(图像)
wire eth_rxdv ; //输入数据有效信号(mii)
wire [3:0] eth_rx_data ; //输入数据(mii)
wire eth_tx_en ; //输出数据有效信号(mii)
wire [3:0] eth_tx_data_m ; //输出数据(mii)

//reg define
reg mii_clk ; //mii时钟

////
//\* Main Code \//
////
assign eth_tx_start = (i_config_end == 1'b1) ? eth_tx_start_i : eth_tx_start_f;
assign eth_tx_data = (i_config_end == 1'b1) ? eth_tx_data_i : eth_tx_data_f;
assign eth_tx_data_num = (i_config_end == 1'b1) ? eth_tx_data_num_i : eth_tx_data_num_f;

//rst_n:复位信号(sys_rst_n & locked)
assign rst_n = sys_rst_n && locked;

//sys_init_done:系统初始化完成(SDRAM初始化+摄像头初始化)
assign sys_init_done = sdram_init_done && cfg_done;

//ov5640_rst_n:摄像头复位,固定高电平
assign ov5640_rst_n = 1'b1;

//ov5640_pwdn:摄像头时钟选择信号,0:使用引脚XCLK提供的时钟 1:使用摄像头自带的晶振
assign ov5640_pwdn = 1'b0;

//mii_clk:mii时钟
always@(negedge eth_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
mii_clk <= 1'b0;
else
mii_clk <= ~mii_clk;

////
//\* Instantiation \//
////
//------------- clk_gen_inst -------------
clk_gen clk_gen_inst
(
.areset (~sys_rst_n ),
.inclk0 (sys_clk ),
.c0 (clk_100m ),
.c1 (clk_100m_shift ),
.c2 (clk_25m ),
.locked (locked )
);

//------------- ov5640_top_inst -------------
ov5640_top ov5640_top_inst
(
.sys_clk (clk_25m ), //系统时钟
.sys_rst_n (rst_n ), //复位信号
.sys_init_done (sys_init_done ), //系统初始化完成(SDRAM + 摄像头)

.ov5640_pclk (ov5640_pclk ), //摄像头像素时钟
.ov5640_href (ov5640_href ), //摄像头行同步信号
.ov5640_vsync (ov5640_vsync ), //摄像头场同步信号
.ov5640_data (ov5640_data ), //摄像头图像数据

.cfg_done (cfg_done ), //寄存器配置完成
.sccb_scl (sccb_scl ), //SCL
.sccb_sda (sccb_sda ), //SDA
.ov5640_wr_en (wr_en ), //图像数据有效使能信号
.ov5640_data_out (wr_data ) //图像数据
);

//------------- sdram_top_inst -------------
sdram_top sdram_top_inst
(
.sys_clk (clk_100m ), //sdram 控制器参考时钟
.clk_out (clk_100m_shift ), //用于输出的相位偏移时钟
.sys_rst_n (rst_n ), //系统复位
//用户写端口
.wr_fifo_wr_clk (ov5640_pclk ), //写端口FIFO: 写时钟
.wr_fifo_wr_req (wr_en ), //写端口FIFO: 写使能
.wr_fifo_wr_data (wr_data ), //写端口FIFO: 写数据
.sdram_wr_b_addr (24'd0 ), //写SDRAM的起始地址
.sdram_wr_e_addr (H_PIXEL*V_PIXEL), //写SDRAM的结束地址
.wr_burst_len (10'd512 ), //写SDRAM时的数据突发长度
.wr_rst (~rst_n ), //写复位信号
//用户读端口
.rd_fifo_rd_clk (mii_clk ), //读端口FIFO: 读时钟
.rd_fifo_rd_req (rd_en ), //读端口FIFO: 读使能
.rd_fifo_rd_data (rd_data ), //读端口FIFO: 读数据
.sdram_rd_b_addr (24'd0 ), //读SDRAM的起始地址
.sdram_rd_e_addr (H_PIXEL*V_PIXEL), //读SDRAM的结束地址
.rd_burst_len (10'd512 ), //从SDRAM中读数据时的突发长度
.rd_fifo_num ( ), //读fifo中的数据量
.rd_rst (~rst_n ), //读复位信号
//用户控制端口
.read_valid (1'b1 ), //SDRAM 读使能
.pingpang_en (1'b1 ), //SDRAM 乒乓操作使能
.init_end (sdram_init_done), //SDRAM 初始化完成标志
//SDRAM 芯片接口
.sdram_clk (sdram_clk ), //SDRAM 芯片时钟
.sdram_cke (sdram_cke ), //SDRAM 时钟有效
.sdram_cs_n (sdram_cs_n ), //SDRAM 片选
.sdram_ras_n (sdram_ras_n ), //SDRAM 行有效
.sdram_cas_n (sdram_cas_n ), //SDRAM 列有效
.sdram_we_n (sdram_we_n ), //SDRAM 写有效
.sdram_ba (sdram_ba ), //SDRAM Bank地址
.sdram_addr (sdram_addr ), //SDRAM 行/列地址
.sdram_dq (sdram_dq ), //SDRAM 数据
.sdram_dqm (sdram_dqm ) //SDRAM 数据掩码

);

//------------- image_format_inst -------------
image_format image_format_inst
(
.sys_clk (mii_clk ), //系统时钟
.sys_rst_n (rst_n && sys_init_done ), //系统复位,低电平有效
.eth_tx_req (eth_tx_req && (~i_config_end)),//以太网数据请求信号
.eth_tx_done (eth_tx_done ), //单包以太网数据发送完成信号

.eth_tx_start (eth_tx_start_f ), //以太网发送数据开始信号
.eth_tx_data (eth_tx_data_f ), //以太网发送数据
.i_config_end (i_config_end ), //图像格式包发送完成
.eth_tx_data_num (eth_tx_data_num_f ) //以太网单包数据有效字节数
);

//------------- image_data_inst -------------
image_data
#(
.H_PIXEL (H_PIXEL ), //图像水平方向像素个数
.V_PIXEL (V_PIXEL ) //图像竖直方向像素个数
)
image_data_inst
(
.sys_clk (mii_clk ), //系统时钟,频率25MHz
.sys_rst_n (rst_n & sys_init_done& i_config_end), //复位信号,低电平有效eth_tx_end
.image_data (rd_data ), //自SDRAM中读取的16位图像数据
.eth_tx_req (eth_tx_req ), //以太网发送数据请求信号
.eth_tx_done (eth_tx_done ), //以太网发送数据完成信号

.data_rd_req (rd_en ), //图像数据请求信号
.eth_tx_start (eth_tx_start_i ), //以太网发送数据开始信号
.eth_tx_data (eth_tx_data_i ), //以太网发送数据
.eth_tx_data_num (eth_tx_data_num_i ) //以太网单包数据有效字节数
);

//------------- eth_udp_rmii_inst -------------
eth_udp_rmii
#(
.BOARD_MAC (BOARD_MAC ), //板卡MAC地址
.BOARD_IP (BOARD_IP ), //板卡IP地址
.BOARD_PORT (BOARD_PORT ), //板卡端口号
.DES_MAC (DES_MAC ), //PC机MAC地址
.DES_IP (DES_IP ), //PC机IP地址
.DES_PORT (DES_PORT ) //PC机端口号
)
eth_udp_rmii_inst
(
.eth_rmii_clk (eth_clk ), //rmii时钟
.eth_mii_clk (mii_clk ), //mii时钟
.sys_rst_n (rst_n ), //复位信号,低电平有效
.rx_dv (eth_rxdv_r ), //输入数据有效信号(rmii)
.rx_data (eth_rx_data_r ), //输入数据(rmii)
.send_en (eth_tx_start ), //开始发送信号
.send_data (eth_tx_data ), //发送数据
.send_data_num (eth_tx_data_num), //发送有效数据字节数

.send_end (eth_tx_done ), //单包数据发送完成信号
.read_data_req (eth_tx_req ), //读数据请求信号
.rec_end ( ), //单包数据接收完成信号
.rec_en ( ), //接收数据使能信号
.rec_data ( ), //接收数据
.rec_data_num ( ), //接收有效数据字节数
.eth_tx_dv (eth_tx_en_r ), //输出数据有效信号(rmii)
.eth_tx_data (eth_tx_data_r ), //输出数据(rmii)
.eth_rst_n (eth_rst_n ) //PHY芯片复位信号,低电平有效
);

endmodule

24.5. 上板调试

24.5.1. 引脚约束

仿真验证通过后,准备上板验证,上板验证之前先要进行引脚约束。工程中各输入输出信号与开发板引脚对应关系如表格 74‑3所示。

表格 74‑3 引脚分配表

信号名

信号类型

对应引脚

备注

sys_clk

Input

E1

板卡晶振传入时钟,频率50MHz

sys_rst_n

Input

M15

复位信号,低有效

ov5640_pclk

Input

M16

摄像头数据像素时钟

ov5640_vsync

Input

C16

摄像头场同步信号

ov5640_href

Input

J13

摄像头行同步信号

ov5640_data[7]

Input

L13

OV5640摄像头采集图像数据

ov5640_data[6]

Input

F13

OV5640摄像头采集图像数据

ov5640_data[5]

Input

B16

OV5640摄像头采集图像数据

ov5640_data[4]

Input

C15

OV5640摄像头采集图像数据

ov5640_data[3]

Input

D16

OV5640摄像头采集图像数据

ov5640_data[2]

Input

F14

OV5640摄像头采集图像数据

ov5640_data[1]

Input

F15

OV5640摄像头采集图像数据

ov5640_data[0]

Input

G15

OV5640摄像头采集图像数据

eth_clk

Input

C3

PHY芯片传入以太网时钟,频率50MHz

eth_rxdv_r

Input

D3

输入数据有效信号

eth_rx_data_r[1]

Input

D8

输入数据

eth_rx_data_r[0]

Input

A4

输入数据

sccb_scl

Output

P15

摄像头SCCB_SCL

sccb_sda

Inout

N14

摄像头SCCB_SDA

sdram_clk

Output

R4

SDRAM芯片时钟

sdram_cke

Output

R9

SDRAM时钟有效信号

sdram_cs_n

Output

R12

SDRAM片选信号

sdram_cas_n

Output

R10

SDRAM列地址选通脉冲

sdram_ras_n

Output

R11

SDRAM行地址选通脉冲

sdram_we_n

Output

L9

SDRAM写允许位

sdram_ba[0]

Output

R13

SDRAM的L-Bank地址线

sdram_ba[1]

Output

R14

SDRAM的L-Bank地址线

sdram_addr[0]

Output

P11

SDRAM地址总线

sdram_addr[1]

Output

P14

SDRAM地址总线

sdram_addr[2]

Output

N9

SDRAM地址总线

sdram_addr[3]

Output

N11

SDRAM地址总线

sdram_addr[4]

Output

T14

SDRAM地址总线

sdram_addr[5]

Output

T13

SDRAM地址总线

sdram_addr[6]

Output

T12

SDRAM地址总线

sdram_addr[7]

Output

T11

SDRAM地址总线

sdram_addr[8]

Output

T10

SDRAM地址总线

sdram_addr[9]

Output

P9

SDRAM地址总线

sdram_addr[10]

Output

T15

SDRAM地址总线

sdram_addr[11]

Output

N12

SDRAM地址总线

sdram_addr[12]

Output

M11

SDRAM地址总线

sdram_dqm[0]

Output

M10

SDRAM数据掩码

sdram_dqm[1]

Output

M9

SDRAM数据掩码

sdram_dq[0]

Output

R3

SDRAM数据总线

sdram_dq[1]

Output

T9

SDRAM数据总线

sdram_dq[2]

Output

R5

SDRAM数据总线

sdram_dq[3]

Output

R6

SDRAM数据总线

sdram_dq[4]

Output

R7

SDRAM数据总线

sdram_dq[5]

Output

M8

SDRAM数据总线

sdram_dq[6]

Output

R8

SDRAM数据总线

sdram_dq[7]

Output

N8

SDRAM数据总线

sdram_dq[8]

Output

P8

SDRAM数据总线

sdram_dq[9]

Output

T8

SDRAM数据总线

sdram_dq[10]

Output

T7

SDRAM数据总线

sdram_dq[11]

Output

T6

SDRAM数据总线

sdram_dq[12]

Output

T5

SDRAM数据总线

sdram_dq[13]

Output

T4

SDRAM数据总线

sdram_dq[14]

Output

T3

SDRAM数据总线

sdram_dq[15]

Output

T2

SDRAM数据总线

eth_tx_en_r

Output

D5

输出数据使能信号

eth_tx_data_r[1]

Output

D6

输出数据

eth_tx_data_r[0]

Output

C8

输出数据

eth_rst_n

Output

B3

PHY复位信号

下面进行管脚分配,管脚的分配方法在前面章节已有所讲解,在此就不再过多叙述,管脚的分配如下图 74‑3、图 74‑4所示。

OV5640004

图 74‑3 管脚分配

OV5640005

图 74‑4 管脚分配

24.5.1.1. 结果验证

如图 74‑5所示,开发板连接12V直流电源、USB-Blaster下载器JTAG端口、网线以及OV5640摄像头,网线另一端连接路由器;PC机也使用另一条网线与路由器相连。线路正确连接后,打开开关为板卡上电。

OV5640006

图 74‑5 程序下载连线图

如图 74‑6所示,打开网络调试助手,按照如所示进行参数配置,随后启动监听。

OV5640007

图 74‑6 配置上位机参数

如图 74‑7所示,使用“Programmer”为开发板下载程序。

OV5640008

图 74‑7 程序下载连线图

如图 74‑8所示,上位机左下角滚动显示格式配置成功。

OV5640009

图 74‑8 上位机图像格式配置成功

随后,实时显示ov5640摄像头实时采集的图像,如图 74‑9所示。

OV5640010

图 74‑9 上位机显示图像

上位机能够正确的显示摄像头采集图像,验证通过。读者也可使用与“以太网数据回环”章节相同的验证方法进行验证。

24.6. 章末总结

在本章节中,我们实现了基于以太网的摄像头采集图像上位机实时显示实验,实验工程中的诸多模块是复用的前面实验的功能模块,本实验中只编写了上位机图像格式配置模块和图像数据打包模块,以保证上位机图像的正确显示。

24.7. 章末总结

本实验中对传输到上位机的数据未进行CRC-16校验,各位学员可在原实验的基础上自行添加CRC-16校验模块,并上板验证。