1713|3

81

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

安路SparkRoad实现个人照相机 [复制链接]

  本帖最后由 冒险武者 于 2022-8-1 00:17 编辑

利用周末空闲时间,简易板照相机只能说基本功能达到了,主要功能如下

1.实时显示视频流

2.按拍照按钮后,把图像数据存到sdram中,然后存到sd卡

3.视频显示用的是VGA显示屏(可惜没有TFT_LCD接口)

 

按钮的定义:按键0:模式选择:视频流与查看照片  按键1与3上下翻找照片,按键3打开拍照,拍完后返回视频流,如下所示:

always@(posedge camera_wclk  or  negedge rst_n)
begin
    if(!rst_n) begin
	     pai_cnt  <=   2'b00 ;
	     mode     <=   1'b1 ;
	     pai_en   <=   1'b0 ;
	end
	else if((tim == 8'd40) && pai_en ) begin  //&& (camera_addr == 16'h0)
		pai_en   <=   1'b0 ;
		mode     <=   1'b1 ;
	end
	else if(key_pulse[0]) begin  //mode
		mode     <=   ~mode ;
		pai_cnt  <=   8'h0 ;
	end
	else if(key_pulse[1]) begin  //up 
		pai_cnt  <=  pai_cnt  + 1'b1;   
	end
	else if(key_pulse[2]) begin //pai
		mode     <=  1'b0 ;
		pai_en   <=  1'b1 ;
		pai_cnt  <=  pai_cnt  + 1'b1; 
	end
	else if(key_pulse[3])  begin//down
		pai_cnt  <=  pai_cnt  - 1'b1;
	end
end 

always@(posedge clk_50m  or  negedge rst_n)
begin
    if(!rst_n) 
		        key_led  <= 5'h1F;
	else if(key_pulse[0])
		        key_led[0]   <= ~key_led[0];
	else if(key_pulse[1])
		        key_led[1]   <= ~key_led[1];
	else if(key_pulse[2])
		        key_led[2]   <= ~key_led[2];
	else if(key_pulse[3])
		        key_led[3]  <= ~key_led[3];
	else if(key_pulse[4])
		        key_led[4] <= ~key_led[4];		      
	else
                key_led        <= key_led;
end 

 

sdram的控制直接修改例程获得

Sdram_Control_4Port Sdram_Control(
		//	HOST Side
		.CTRL_CLK(clk_sdr_ctrl),	//输入参考时钟,默认100M,如果为其他频率,请修改pll设置
		.SDRAM_CLK(clk_sdram),		//SDRAM时钟,默认100M(90°),如果为其他频率,请修改pll设置
		.RESET_N(rst_n),			//复位输入,低电平复位

		//	FIFO Write Side 1
		.WR1_DATA(camera_wrdat),	//写入端口1的数据输入端16bit
		.WR1(camera_wrreq),		    //写入端口1的写使能端,高电平写入
		.WR1_ADDR(21'b0),		    //写入端口1的写起始地址
		.WR1_MAX_ADDR((IMG_W*IMG_H)),	//写入端口1的写入最大地址  
//		.WR1_LENGTH(10'd1),		//一次性写入数据长度
		.WR1_LENGTH(10'd256),		//一次性写入数据长度
		.WR1_LOAD((~rst_n)&(init_ready) ),
									//写入端口1清零请求,高电平清零写入地址和fifo
		.WR1_CLK(camera_wclk),		//写入端口1 fifo写入时钟
		.WR1_FULL(),				//写入端口1 fifo写满信号
		.WR1_USE(),					//写入端口1 fifo已经写入的数据长度
		//	FIFO Write Side 2
		.WR2_DATA(sd_wrdat),			//写入端口2的数据输入端16bit
		.WR2(1'b0),					//写入端口2的写使能端,高电平写入
		.WR2_ADDR(21'd32800),				//写入端口2的写起始地址
		.WR2_MAX_ADDR(32800),		//写入端口2的写入最大地址 (IMG_W*IMG_H)
		.WR2_LENGTH(9'd256),				//一次性写入数据长度	
		.WR2_LOAD((~rst_n)&(init_ready)),			//写入端口2清零请求,高电平清零写入地址和fifo
		.WR2_CLK(sd_clk),				//写入端口2 fifo写入时钟
		.WR2_FULL(),				//写入端口2 fifo写满信号
		.WR2_USE(),					//写入端口2 fifo已经写入的数据长度
		//	FIFO Read Side 1
		.RD1_DATA(sd_rddat),		//读出端口1的数据输出端16bit
		.RD1(sd_rden),			    //读出端口1的读使能端,高电平读出
		.RD1_ADDR(21'b0),			//读出端口1的读起始地址
		.RD1_MAX_ADDR(32800),		//读出端口1的读出最大地址(IMG_W*IMG_H)
//		.RD1_LENGTH(10'd1),		//一次性读出数据长度
		.RD1_LENGTH(10'd256),		//一次性读出数据长度
		.RD1_LOAD((~rst_n) & (init_ready)),
									//读出端口1 清零请求,高电平清零读出地址和fifo
		.RD1_CLK(sd_clk),			//读出端口1 fifo读取时钟
		.RD1_EMPTY(),				//读出端口1 fifo读空信号
		.RD1_USE(),					//读出端口1 fifo已经还可以读取的数据长度

		//	FIFO Read Side 2
		.RD2_DATA(sd_rddat),				//读出端口2的数据输出端16bit
		.RD2(vga_den),					//读出端口2的读使能端,高电平读出
		.RD2_ADDR(21'd32800),			//读出端口2的读起始地址
		.RD2_MAX_ADDR((IMG_W*IMG_H)),			//读出端口2的读出最大地址
		.RD2_LENGTH(9'd256),			//一次性读出数据长度	
		.RD2_LOAD((~rst_n) & (init_ready)),			//读出端口2清零请求,高电平清零读出地址和fifo
		.RD2_CLK(clk_lcd),				//读出端口2 fifo读取时钟
		.RD2_EMPTY(),				//读出端口2 fifo读空信号
		.RD2_USE()					//读出端口2 fifo已经还可以读取的数据长度
	);	

 

SD读写是SPI协议控制,copy正点原子的相关文件后修改的获得

//SD卡顶层控制模块
sd_ctrl_top u_sd_ctrl_top(
    .clk_ref           (clk_sd),
    .clk_ref_180deg    (clk_sd_180deg),
    .rst_n             (rst_n),
    //SD卡接口
    .sd_miso           (sd_miso),
    .sd_clk            (sd_clk),
    .sd_cs             (sd_cs),
    .sd_mosi           (sd_mosi),
    //用户写SD卡接口
    .wr_start_en       (wr_start_en),
    .wr_sec_addr       (wr_sec_addr),
    .wr_data           (wr_data),
    .wr_busy           (wr_busy),
    .wr_req            (wr_req),
    //用户读SD卡接口
    .rd_start_en       (rd_start_en),
    .rd_sec_addr       (rd_sec_addr),
    .rd_busy           (rd_busy),
    .rd_val_en         (rd_val_en),
    .rd_val_data       (rd_val_data),      
    
    .sd_init_done      (sd_init_done)
    );

 

需要强调的是SD卡中存数据无法形成照片,因为涉及到照片格式与文件相关簇信息管理,暂时搞不定,这个可以研究手册

视频显示用的是VGA接口显示器,可惜该单板没有预留TFT_LCD显示屏,用TFT_LCD屏那就更加完美

 

视频如下:

1

 

大家可以看到闪屏,抓取的照片不是很花屏现场等等问题,研发就是遇到问题,分析问题,解决问题过程,这次试用对个人能力有一定提升,总体体验不错。

 

最新回复

这分辨率和频率,感觉这芯片性能可以啊,而且内存也不小。把FPGA玩的挺6!   详情 回复 发表于 2022-8-1 16:00
点赞(1) 关注
 
 

回复
举报

858

帖子

3

TA的资源

版主

沙发
 

这摄像头是优信电子买的吗?那个型号?

点评

OV2640摄像头,在淘宝一搜很多  详情 回复 发表于 2022-8-1 22:41
 
 
 

回复

7244

帖子

2

TA的资源

版主

板凳
 

这分辨率和频率,感觉这芯片性能可以啊,而且内存也不小。把FPGA玩的挺6!

 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(中级)

4
 
1nnocent 发表于 2022-8-1 09:14 这摄像头是优信电子买的吗?那个型号?

OV2640摄像头,在淘宝一搜很多

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表