微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 2440裸机学习心得(下)

2440裸机学习心得(下)

时间:11-29 来源:互联网 点击:
摄像头驱动

一些概念:

摄像接口的主时钟信号由USB PLL产生,它的频率为96MHz,再经过分频处理后输出给摄像头,摄像头再根据该时钟信号产生三个同步时钟信号(像素时钟、帧同步时钟和行同步时钟),反过来再输入回s3c2440。

OV9650内部有大量的寄存器需要配置,这就需要另外的数据接口。

OV9650的数据接口称为SCCB(串行摄像控制总线),它由两条数据线组成:一个是用于传输时钟信号的SIO_C,另一个是用于传输数据信号的SIO_D。SCCB的传输协议与IIC的极其相似,只不过IIC在每传输完一个字节后,接收数据的一方要发送一位的确认数据,而SCCB一次要传输9位数据,前8位为有用数据,而第9位数据在写周期中是Don’t-Care位(即不必关心位),在读周期中是NA位。SCCB定义数据传输的基本单元为相(phase),即一个相传输一个字节数据。

SCCB只包括三种传输周期,即3相写传输周期(三个相依次为设备从地址,内存地址,所写数据),2相写传输周期(两个相依次为设备从地址,内存地址)和2相读传输周期(两个相依次为设备从地址,所读数据)。当需要写操作时,应用3相写传输周期,当需要读操作时,依次应用2相写传输周期和2相读传输周期。(这些读写和IIC一样~)

OV9650有两个只读寄存器——0x1C和0x1D,用于存放厂家ID,数据分别为0x7F和0xA2,我们可以通过读取它们来判断s3c2440是否连接了OV9650。当确认连接了OV9650后,我们就可以把VGA(640×480)模式下YUV彩色空间的配置数组写入OV9650内(二维数组:第一个表示寄存器地址,第二个表示要写入的数据)

注意比较三个变量的含义:

Width = 640 //源宽度

PrDstWidth =480 //目标宽度

SrcWidth =640-WinHorOffset*2; //偏移后宽度

驱动函数编写步骤:

外围基础准备硬件初始化

IIC初始化,LCD初始化,UPLL时钟初始化(96M,0V9650系统时钟),

GPIO初始化(GPJ),硬件和软件复位摄像头(GPJ12为CAMERARESET,rCIGCTRL)

0V9650寄存器配置

A、读取OV9650厂商ID,验证是否工作

B、复位所有OV9650寄存器

C、配置OV9650寄存器(用规定的二维数组直接配)

摄像头接口初始化

摄像头接口的一些寄存器初始化:rCIGCTRL,rCIWDOFSTrCISRCFMT

rCIPRTRGFMT,rCIPRTAREA

B、设置内存首地址为LCD缓存数组首地址:rCIPRCLRSA1~4

C、计算水平和垂直缩放比率和位移量,以及主水平、垂直比率

放入以下三个寄存器中rCIPRSCPRERATIO,rCIPRSCPREDSTrCIPRSCCTRL

中断函数开启和指向

控制台菜单的编写与实现

显示视频

rCIPRSCCTRL|=(1<15); //预览缩放开启

rCIIMGCPT =(1<31)|(1<29); //预览缩放捕捉使能

截图,定格

rCIPRSCCTRL &=~(1<15); //预览缩放关闭

rCIIMGCPT &=~((1<31)|(1<29)); //预览缩放捕捉不使能

视频定格后,LCD_BUFFER数组就是图像数据

放大,缩小

调节偏移量HOffset,VOffset,每次改变后重新初始化摄像头接口

四个额外写出需注意的函数:

1、计算主突发长度和剩余突发长度CalculateBurstSize

2、/计算预缩放比率及移位量CalculatePrescalerRatioShift

3、中断函数(只清中断,不干别的) camera_interrupt

4、SCCB总线函数的读写(像IIC)Rd_SCCB,Wr_SCCB

网卡驱动

DM9000的一些基本概念:

DM9000对外来说只有两个端口——地址口和数据口,地址口用于输入内部寄存器的地址,而数据口则完成对某一寄存器的读写。DM9000的CMD引脚用来区分这两个端口,当CMD引脚为0时,DM9000的数据线上传输的是寄存器地址,当CMD引脚为1时,传输的是读写数据。

我们把DM9000的A8和A9接为高电平,把A4~A7接为低电平,并且把DM9000的AEN接到s3c2440的nGCS4引脚上,则DM9000的端口基址为0x20000300,如果再把DM9000的CMD引脚接到s3c2440的ADDR2引脚上0x20000304(怎么计算?)

查了一下书,是和存储控制器有关系,每个nGCSx对应128M地址空间,8个nGCSx对应1G地址。

nGCS4刚好对应0x20000000开始的地址,但为什么是0x20000300?

再加上IObase:300

如果将DM9000的CMD引脚接到s3c2440的ADDR2,由于CMD引脚的高低电平决定地址口和数据口,那么,ADDR2为0时,访问的

就是地址口,所以地址口的起始地址为ARRD2为0的情况,即0x20000000;ADDR2为1时,(LADDR3~LADDR0 = 0100)访问的就是数

据口,所以数据口的地址即0x20000004。

如果要写入DM9000中的某个寄存器,则先把该寄存器的地址赋予DM_ADDR_PORT,然后再把要写入的数据赋予DM_DATA_PORT即可。读取DM9000中的某个寄存器也类似。

DM9000寄存器介绍在数据手册11页开始:

DM9000内部有0x3FF大小的SRAM用于接受和发送数据缓存。在发送或接收数据包之前,数据是暂存在这个SRAM中的。当需要连续发送或接收数据时,我们需要分别把DM9000寄存

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top