STM32直接驱动OV7660摄像头成功(2009-12-08 21:04:00)那些年我们错过的大雨
标签:it 
www.ourdev/bbs/bbs_content_all.jsp?bbs_sn=3539898
直接用STM32接的摄像头,没有其他什么外加电路,stm32从摄像头读到数据,然后直接送往TFT(ILI9320芯片)

效果和速度:图像调整成了160x1208帧每秒,320x240的时候大概是2

图像质量有待调整,刚实验成功中,激动中,所以先发裸照

完全使用中断的方式接收摄像头的数据

代码没有整理。
 


程序-IARourdev_473545.rar(文件大小:469K) (原文件名:stm32_Demo_ili9325.rar) 



没有原理图,我也是直接搭出来的 

基本上摄像头的接法是这样子的: 
3.3v 串一个0.7v压降的二极管,接到摄像头的电源,我随便拿了一个1N4148,也能用。测到电压为2.6v这样子

摄像头的 
         HREF (行同步)---  PG3 
         VSYNC (帧同步) ---  PG5 
         PWDN           ---  接地 
         PCLK           ---  PG4 
         SIO_D          ---  PG7 
         SIO_C          ---  PG6 
         XCK1(系统时钟 ---  PA8 


         D0~D7          ---  PA0~PA7 
         RESET          51类型的阻容复位电路 

液晶屏:内部芯片为ILI9320,稍微改下就可以变成ILI9325 
PF6~10 
#define nCS     GPIO_Pin_8 
#define RS      GPIO_Pin_7 
#define nWR     GPIO_Pin_10 
#define nRD     GPIO_Pin_9 
#define nReset  GPIO_Pin_6 

数据口:PD0~PD15 

一共有40来根线,呼呼
-------------------------------------------
没有原理图,我也是直接搭出来的

基本上摄像头的接法是这样子的:

摄像头的 
         HREF (行同步)---  PG3
         VSYNC (帧同步) ---  PG5
         PWDN           ---  接地
         PCLK           ---  PG4
         SIO_D          ---  PG7
         SIO_C          ---  PG6
         XCK1(系统时钟 ---  PA8

         D0~D7          ---  PA0~PA7
         RESET          51类型的阻容复位电路


液晶屏:内部芯片为ILI9320,稍微改下就可以变成ILI9325
PF6~10
#define nCS     GPIO_Pin_8
#define RS      GPIO_Pin_7
#define nWR     GPIO_Pin_10
#define nRD     GPIO_Pin_9
#define nReset  GPIO_Pin_6

数据口:PD0~PD15
------------------------------------
调试SCCB有几个是我认为比较重要的,
一是一定要给摄像头系统时钟,你可以用stm32输出一个8M的时钟接到XCK1,太快了不行,我觉得SCCB工作的时候也是需要系统时钟提供的。
二是SCCBdata脚要上拉,在STM32io口设置的时候,要设置成上拉。设置成输入的时候上拉,我测试过,不上拉就不成功。
三是有个延时函数,时间不能够太短,还要小心你的延时代码不要被编译器优化掉了。

SCCB的代码我没有仔细看,是直接拿  wangguanfu  AVR的代码来改的,只改了非诚勿扰于川绿野io口操作的部分,直接就成功了。
请直接看代码。

要有数据输出的话,首先要提供时钟,一定要提供时钟。我觉得不用配置也能有数据输出,没有实测,你就先把SCCB调好了再进行下一步吧。
----------------------------------------------
直接写企业所有制性质BSRR会比GPIO_SetBits()快很多倍,在要求速度的情况下,我喜欢直接写陈羽凡个人资料BSRR
----------------------------------------------
我把它再初始化成了普通IO口了,然后由自己控制时钟。
它已经没有时钟输出了,除非你自己去控制io口输出时钟。
我就是想自己输出时钟,所以在sccb配置好了以后,把它改成了普通io
-----------------------------------------------
我专门把stm32f103的时钟频率从72M调到了16M,再自拍,除了图像反应变慢,其他没有区别
-----------------------------------------------
张根硕在rain演唱会我已经把stm32f103的时钟频率从72M调到了16M了,图像还是可以采集正常,效果没法比较,因为我也还没有调节好

C8051f02022M的晶振会比16Mstm32f103差很远么,这个我也不知道,

我的感觉是,频率慢一点也能够采集,当然是cpu越快越好了

stm32f10316M的时候,我的程序已经差不多是10us采集一个点了,100k的频率这样子。
-------------------------------------------------
对啊,就是一个PCLK读一次数据,所以速度就是局限于stm32的中断响应速度,我现在是没有缓冲,读一个点数据,写一个点到屏
-------------------------------------------------
首先是是给摄像头提供时钟,然后通过SCCB初始化摄像头,然后依据时序每次pclk读一次数据,然后把数据组合成你想要的rgb数据。
同时必须处理的是行同步信号和帧同步信号,这直接关系到你所采的数据的xy坐标,还有每个点的rgb数据的前后组合顺序。

ie主页被篡改具体看数据手册的时序图。最好你能够有逻辑分析仪,分析摄像头的数据输出,知道到底有没有数据。逻辑分析仪armok也有卖了,几百块。
用示波器也可以看一下信号。
先把SCCB调试好先吧,读取ov7660id数据,能够读取和写入SCCB的话,基本上就完全成功了,剩下的都是些小事情。