EDN China > 设计实例 > 嵌入式系统 > MCU(单片机应用) > 正文
? 2016博客大赛-不限主题,寻找电子导师,大奖升级??

(多图) 基于单片机的低成本CMOS图像采集系统

/?? 2014年06月23日 ?? 收藏2

3 系统软件设计

3.1主程序的设计

系统软件可分为:图像传感器模块、图像存储器模块、图像的多帧采集和拼接模块、串口数据传输模块。其基本流程图如图3所示。为了尽量提高单片机的处理速度,将系统的时钟频率设置为最高,即16 MHz。

图3 主程序流程图
图3 主程序流程图

3.2 图像传感器模块软件设计

根据SP0828 CMOS数字图像传感器的工作原理和工作流程,图像传感器模块包括了图像传感器上电初始化、图像传感器寄存器初始化、图像数据采集3个部分。

3.2.1 图像传感器上电初始化

图像传感器上电初始化,就是图像传感器在上电结束但尚未开始工作的时候,对图像传感器芯片提供主时钟、初始化信号线拉低等一系列的操作,以使图像传感器能够正常工作或者获得最佳的工作状态。其主要流程如图4所示。

图4 图像传感器上电初始化时序图
图4 图像传感器上电初始化时序图

DVDD28&AVDD;连接电源,DVDD28&AVDD;拉高即是上电。在上电之后,延时至少10岬,初始化信号线PWDN拉低。然后延时至少110μs,单片机为图像传感器提供主时钟,为使图像传感器工作在最快的速度,单片机为图像传感器提供最高16 MHz的时钟。最后延时至少20 clock,单片机通过I2C接口对图像传感器内部寄存器进行初始化。上电结束。

3.2.2 图像传感器内部寄存器初始化

CMOS图像传感器采用I2C总线控制其各项功能,简单、快捷。I2C总线也是目前图像传感器采用最普遍的控制方式。用户可以通过I2C总线改变图像传感器内部可编程寄存器的缺省参数来设置图像传感器的工作方式,如时钟、帧率、曝光、对比度、亮度等。I2C总线是芯片间串行数据传输总线,它只用一根数据线SDA和一根时钟线SCL即可实现完善的双工同步数据传输。I2C总线规定,主控制器发送起始信号表明一次数据传输的开始,然后为寻址字节,寻址字节由高7位地址位和低1位方向位组成。方向位表明主控制器与被控制器之间的数据传输方向,当该位为“0”时表明主控制器对被控制器的写操作,为“1”时表明主控制器对被控制器的读操作。寻址字节后是按照指定地址读写操作的数据字节与应答位。数据传送完成后主控制器必须发送终止信号。I2C协议的时序如图5所示。

图5 I2C总线的数据传送时序图
图5 I2C总线的数据传送时序图

STM8单片机有专门的硬件I2C接口,因此可通过该接口实现与图像传感器的通信。该系统中STM8单片机的I2C_SDA数据线和I2C_SCL时钟线分别连接图像传感器的SBDA数据传输口和SCLK时钟传输口。通过上述对I2C协议的分析,设计了如图6所示的I2C总线数据传输流程。

图6 I2C总线数据传输流程
图6 I2C总线数据传输流程

I2C总线操作的典型时序信号有起始位信号、终止位信号、发送地址、发送数据、接收数据,所有的时序信号都是通过对单片机硬件I2C内部寄存器的操作实现的。I2C模块主要功能函数如下:

(1)读取图像传感器内部寄存器的值

unsigned char I2C_Read(unsigned char slave—address,unsigned charreg address,unsigned char slave_read_address)

/* slave_address是图像传感器的地址+写操作符“0”,reg_address是图像传感器内部寄存器的地址,slave_read_address是图像传感器的地址+读操作符“1”*/

{

unsigned char val;

I2C_Start();//启动I2C总线,I2C_CR2寄存器最低位置l

I2C_SendDAdr(slave_address);//发送图像传感器的地址+写操作符“0”

I2C_SendDat(reg_address);//发送内部寄存器的地址

I2C_Start();//启动I2C总线,I2C_CR2寄存器最低位置1

I2C_SendDAdr(slave_read_address);//发送图像传感器的地址+读操作符“1”

vai=12C_RcvDat();//从I2C接口读取数据

I2C_stop();//释放I2C总线,I2C_CR2寄存器次低位置1

retunl val;

}

(2)读取图像传感器内部寄存器的值

unsigned char I2C_Main(unsigned char slave_address,unsigned charreg_address,unsigned char write_data)

{

/* slave_address是图像传感器的地址+写操作符“0”,reg_address是内部寄存器的地址,write_data是要写入寄存器的数据*/

I2C_Start();//启动I2C总线,I2C_CR2寄存器最低位置1

I2C_SendDAdr(slave_address);//发送图像传感器的地址+写操作符“0”

I2C_SendDat(reg._address);//发送内部寄存器的地址

I2C_SendDat(write_data);//发送内部寄存器要写入的数据

I2C_stop();//释放I2C总线,I2C_CR2寄存器次低位置1

}

【分页导航】


?? ?? ??


打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

1.扫描左侧二维码
2.点击右上角的分享按钮
3.选择分享给朋友
?? ??

单片机? 图像采集? CMOS? 物联网?

相关文章

我来评论
美国的游客
美国的游客 ??? (您将以游客身份发表,请登录 | 注册)
?
有问题请反馈