【MM32F103试用体验】+OV7670摄像头

editor的头像
editor 发布于:周五, 07/15/2016 - 14:56 ,关键词:


完成了MM32F103开发板驱动OV7670摄像头,现在分享一下,希望大家给点意见建议。

本来想先发24L01的,结果测试时出现了问题。尴尬的是配置的底层文件都是只读的,害的我分别复制粘贴了一遍才能修改。不过,我想提供者也是考虑使用者误改才设置只读的吧。

言归正传,我使用的摄像头是原子的OV7670,带有FIFO,所以处理起来很方便、简洁。

一、原理图和引脚功能


从原理图上可以看到,OV7670摄像头一共就两块芯片,一块OV7670和一块FIFO,其中我们主要考虑控制FIFO读取数据,OV7670只需要完成初始化配置基本就可以不考虑了。


表中控制OV7670的引脚只有SCCB总线的SCL与SDA信号,我个人感觉SCCB总线与IIC总线基本没有差别,我们需要通过该总线读写OV7670芯片的寄存器,完成对其的配置。 具体SCCB的时序以及寄存器配置我就胜略了,网上一搜一大堆。

剩下的引脚都是控制FIFO的信号,OV7670将图像信息转化成数字信息后就存储到FIFO中等待MCU读取。我们处理的重点就是如何从FIFO中读取数据。下面是读取数据的基本流程:


二、程序设计

1、引脚配置

我们在配置引脚是要注意,避开一些特殊的引脚,比如PA13、PA14。如果使用的这两个引脚,就不能使用SWD模式仿真、下载。

因为OV_SDA和VSYNC相对于MCU来说是输入信号,需要设置为上拉输入;其他的为推挽输出。

配置VSYNC时,因为它是帧同步信号,MCU通过检测它的电平变化进行帧控制,所以设置它为外部中断信号。需要根据选择的引脚好设置对应的中断线。(比如,PA15对应中断线15)


每次进入外部中断,说明MCU读完一帧数据,这是我们需要将FIFO中的数据更新,允许下一帧数据写入。

2、数据读取

每从FIFO中读取一次数据为1字节,而一个像素为2字节,所以得到一个像素数据要读取两次。读完一帧320*240=76800个像素,需要读取153600次。

每次写入LCD刚好为2字节,一个像素数据,一帧图像数据共写入76800次。


三、调试问题

1、刚开始调试时,采用的是将LCD数据IO与FIFO数据IO公用的方式,理论上两者因为读写速度的差异可以公用,原子mini板也采用的这种方式。但是,实际测试时,发现LCD与FIFO对IO口的配置不相同,没有初始成功。于是,将两者分开采用不同的IO口,配置成功。

2、程序DEBUG结束以后,下载程序到MCU中,结果出现了下面的现象,能看见人影,但是花屏:


这时,我的第一反应时数据读取可以了 ,因该是数据与信号线之间的干扰。于是找铜线将数据线和信号线分开捆在一起,结果没有解决。

接着就检查了数据线与信号线是否接错,仔细对照了一下,也没有错。当时就傻了,只能检查程序了。

将程序从底到上,从上到底,反反复复查了个遍,没发现错误。器件各种绝望,就要快放弃的时候,突然想起来,我是不是又把哪个引脚服用了。结果一查,果然是USB_slave的引脚连着PA11、PA12,而且我就是用的USB_slave供的电。果断换到USB转串口供电,问题解决。


四、实验结果

下面是摄像头拍摄的画面,感觉TFTLCD色彩不是很鲜艳。





上传视频太麻烦,就不传了,见谅。

围观 477