作为一个新手,因为课程设计要求,接触到了OV7670。因为课程设计要求使用MSP430F5438A驱动OV7670,而网上大多数都是使用STM32进行驱动。上网查找了很多资料,也仔细看过网上大佬发的相关寄存器的帖子,最后成功使用430单片机完成了设计。本着来源于网络,回馈于网络的原则,在此介绍一下,自己使用OV7670的一点经验。水平有限,偏颇之处,还请包涵!
首先简单的介绍一下所使用的摄像头OV7670。 OV7670是OV(OmniVision)公司生产的一颗1/6寸的CMOS VGA图像传感器。该传感器体积小、工作电压低,提供单片VGA摄像头和影像处理器的所有功能。通过SCCB 总线控制,可以输出整帧、子采样、取窗口等方式的各种分辨率8位影像数据。该产品VGA图像最高达到30帧/秒。用户可以完全控制图像质量、数据格式和传输方式。所有图像处理功能过程包括伽玛曲线、白平衡、度、色度等都可以通过SCCB接口编程。OmmiVision 图像传感器应用独有的传感器技术,通过减少或消除光学或电子缺陷如固定图案噪声、托尾、浮散等,提高图像质量,得到清晰的稳定的彩色图像。其具有高灵敏度、低电压适合嵌入式应用,标准的SCCB接口以及支持RGB565格式输出。因为摄像头的像素时钟非常高,直接通过MSP430的IO口读取数据非常困难,也是十分占耗CPU。采用带FIFO模块的OV7670,通过对FIFO的读取,就可以轻松的读取摄像头采集到图像数据。从而满足速度要求,节省CPU。本次采用的OV7670自带有源晶振,不需要外部再提供时钟。一个FIFO芯片的容量是384K字节,可以存储两帧QVGA的图像数据,所以本次设计采用QVGA模式 RGB565格式传输图像数据。接下来介绍具体的驱动程序。
管脚分配如图所示:
宏定义:
//SCL-P1.3,SDA-P1.6
#define SCCB_SIC_H() P1OUT|=BIT3
#define SCCB_SIC_L() P1OUT&=~BIT3
#define SCCB_SID_H() P1OUT|=BIT6
#define SCCB_SID_L() P1OUT&=~BIT6
#define SCCB_SID_IN P1DIR &= ~BIT6
#define SCCB_SID_OUT P1DIR |= BIT6
#define SCCB_SID_STATE P1IN&BIT6
#define OE_L P4OUT &= ~BIT3
#define OE_H P4OUT |= BIT3
#define RCLK_L P4OUT &= ~BIT4
#define RCLK_H P4OUT |= BIT4
#define WEN_L P4OUT &= ~BIT5
#define WEN_H P4OUT |= BIT5
#define WRST_L P4OUT &= ~BIT6
#define WRST_H P4OUT |= BIT6
#define RRST_L P4OUT &= ~BIT7
#define RRST_H P4OUT |= BIT7
//像素存储
#define piexl_w 320
#define piexl_h 240
OV7670初始化程序:
unsigned char ov7670_init(void)
{