UndefinedAddr DCD Undefined SWI_Addr DCD SoftwareInterrupt PrefetchAddr DCD PrefetchAbort DataAbortAddr DCD DataAbort Nouse DCD 0 IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler ??
Undefined B Undefined
SoftwareInterrupt B SoftwareInterrupt PrefetchAbort B PrefetchAbort DataAbort B DataAbort ??
第二段代码如此设计而不把它们放在一起的原因是ARM指令集的LDR指令只能跳到当前PC的4KB范围,而B指令可以跳转到32MB的范围,因此二者结合使用可以寻址到整个LPC2400的4GB全部地址空间。
第一段指令建立了中断向量表,第二段指令为中断处理程序的入口地址,这样便为LPC2478完成了整个异常中断的初始化。以后的存储器、堆栈的初始化也是类似的设计从而完成LPC2478硬件的初始化。 3.2.2 CMOS驱动程序设计
考虑到图像采集现场光线明暗变化、后续处理平台的可移植性等现实因素,需要对OV7620的内部寄存器参数进行修改,因此必须通过SCCB总线对其进行寄存器初始化。 1. SCCB总线的数据传输
SCCB总线上传输一个数据位需要遵循以下规范:
? 数据的有效性:SIO_D线上的数据必须在SIO_C高电平器件保持
稳定
? 起始和停止信号:在SCCB协议中,唯一违反上述数据有效规范
的是起始、停止信号
? 起始:SIO_C高电平时,SIO_D从高电平变为低电平 ? 停止:SIO_C高电平时,SIO_D从低电平变为高电平 应答:发送到SIO_D线上的每个字节必须是八位,每个字节后必须跟一个应答位。应答的时间脉冲器件,发送器释放SIO_D(高),之后接收器必须将SIO_D拉低。
SCCB总线上每传输一个位数据必须产生一个时钟脉冲。主机产生起始信号后,发送的第一个字节为寻址字节,从最高位(MSB)到最低位开
始传输,且寻址字节的最低位(LSB)为报文方向位,“0”表示主机写从机,“1”表示读,如图X:
MSB
LSB R/W 从地址
图3- 2 首字节的位数据格式
SCCB总线中一个基本的数据传输单元称为“相”(phaes)。下面列出数据读写时的三种基本单元:
? 三相写周期 ? 两相写周期 ? 两相读周期
这三种基本读写单元其实很相像,两相写为三相写周期的子集,两相读则一般跟在写周期后紧接着进行,图3-3给出三相写周期的示意图。
图3- 3 三相写周期数位图
不难看出,首字节的1~7位为从机ID号,具体不同器件可在OV公司官网上查看得知(OV7620的ID号“写”为0x42,“读”为0x43),0位为读写控制位,此时为0(写);第二字节是子地址,即目标寄存器地址;第三字节为修改目标的8位寄存器的值。如此便可以对的在SCCB总线上找到目标从机中目标寄存器的值进行配置。
值得注意的是:
? 两相读之前一定要进行一次三相或两相写的操作,否则读操作找
寻不到目标寄存器
? 每位字节后都有一个数据应答位NA,NA是此次传输数据的接收
机给予发送机的应答,一般为发送机将SIO_D线闲置(拉高),在应答的时间脉冲里,总线会判断接收机是否拉低SIO_D线,是则为应答成功继续传输,否则总线停止。
? SCCB没有重复起始概念,一次操作(写或读)后一定要加总线停
止指令。
图3-4、3-5分别是对从机ID号为X、目标寄存器号为Y分别进行读
写操作的软件流程图。
写操作
读操作
发送起始信号 发送起始信号 对从机寻址,R/W=0 对从机寻址,R/W=1 SIO_D是否拉低 Y 对从寄存器寻址 N SIO_D是否拉低 Y 发送1字节数据 N N SIO_D是否拉低 Y 发送1字节数 SIO_D是否拉Y 发送非应答信号 N N SIO_D是否拉低 Y 发送停止信号 发送停止信号 主机操作 从机操作
图3- 4 SCCB读写数据软件流程图
2. OV7620的SCCB初始化
SCCB总线中的SIO_D的预充电(pre-charge)时间为15ns,充电保持时间为15us,所以延时程序不易设置过长,此处设置7us。在充分遵守SCCB协议的基础上编写配置OV7620目标寄存器的软件代码,图3-5、3-6是写入和读出寄存器值的软件流程图。
发送起始信号 发送寄存器号字节 N 从机是否应答 SIO_C和D电平是否正常 Y 发送从机ID号字节 从机是否应答 从机是否应答 Y 总线停止 N Y Y 发送寄存器值字节 N N
图3- 5 对OV7620内寄存器写操作
发送起始信号 总线停止 发送从机ID号字节 N SIO_C和D电平是否正常 Y 发送从机ID号字节 拉低SIO_D(确认) 读一字节 N 读一字节 从机是否应答 拉高SIO_D(非确认) Y 发送寄存器号字节 总线停止 从机是否应答
图3- 6对OV7620内寄存器读操作
3.3 图像采集模块的软件设计 3.3.1 CMOS与ARM的工作匹配
在低功耗平台搭建图像采集系统最大的问题便是与相对高速的图像传感器工作频率的匹配问题。低功耗、低成本、小体积的MCU往往工作频率不会很高,虽然LPC2478作为ARM7的中高端产品最高工作频率可以达到72MHz,但对每个像素数据采集操作需要消耗几十甚至更多的工作周期而言,OV7620芯片的默认27MHz工作频率相对LPC2478来说很高。
由于采集一帧图像至少需要捕获三个同步信号,其中最难捕捉的便是PCLK像素时钟同步信号,即便选取16bit bpp的数据格式输出,PCLK的频率仍为13.5MHz(周期74ns)。即便将LPC2400倍频到最高工作频率72MHz,一个外部中断IRQ中断程序在ADS的反汇编窗口可看出至少需要7条ARM汇编代码,算上中断延时时间、中断服务时间完成一次中断响应至少需要30个以上的指令周期(实际的时间远大于74ns,约为6us),如果采用配置OV7620的0x11寄存器 clock rate register(时钟速率寄存器)大幅降低图像传感芯片的速率,将会大大降低了图像采集数据的效率。权衡采集图像分辨率及采集时间,本设计采用以下手段来优化图像传感模块与ARM的工作匹配:
? 选择16bit数据输出模式,这样在满足对前端光强图样可识别的同
时,选用了低频的数据输出格式(8bit时PCLK频率为16bit的两倍);
? 配置OV7620里的时钟速率控制寄存器适当的降低图像传感器的
工作频率;
? 选用高性能FIFO AL422芯片,一方面可以对图像数据起到缓冲作
用,减少了微控制器的等待时间;另一方面优化了传统的运用中断嵌套方式去单一的依靠MCU去捕获三个同步信号,直接将频率最高的PCLK、HREF信号分别与AL422的WE写使能口、WCK写时钟口相连,当同步信号出现有效跳沿将直接触发高速FIFO的数据输入脚DI0~7采集有效数据。
如此,在兼顾数据采集时间的基础上又保证可以采集到一帧图像的完整像素点。
3.3.2 同步信号捕获的软件设计
采集一帧图像数据的一般流程如图3-7。