花了两个星期,终于成功用2440驱动ov7620采集图像并在3.5寸LCD显示屏显示出来了。
其实并不难,改到最后就只是改了7620的寄存器配置而已。
具体配置如下:
static struct OV_Camera_t ov7620_reg[] = {
{0x12, 0x80}, //初始化所有寄存器
{CHIP_DELAY, 20}, //延迟一下
{0x11,0x40}, //设置场,行中断触发电平 和 输出时钟分频
{0x12,0x21}, //设置输出格式为8位CCIR 601 YCbCr,Progressive Scan mode, black/white mode
{0x13,0x21},{0x14,0x24},{0x27,0xe2},{0x28,0x60},{0x60,0x00},{0x61,0x82},{0x67,0x82},
{0x06,0xd0}, //提高亮度,不使用自动调节
// {0x01,0x80},{0x02,0x80},{0x03,0x80},{0x0c,0x20},{0x0d,0x20},{0x15,0x01},{0x16,0x03}, //按默认值配置的寄存器
// {0x17,0x2f},{0x18,0xcf},{0x19,0x06},{0x1a,0xf5},{0x1b,0x00},{0x21,0x80},{0x22,0x80},
// {0x23,0x00},{0x24,0x10},{0x25,0x8a},{0x26,0xa2},{0x29,0x00},{0x2a,0x00},{0x2b,0x00},
// {0x2c,0x88},{0x2e,0x80},
// {0x62,0x12},{0x64,0x59},{0x65,0x42},{0x66,0x55},{0x68,0xcc},{0x69,0x72},{0x6a,0x42},
// {0x6f,0x3a},{0x71,0x00},{0x72,0x14},{0x73,0x54},{0x74,0x20},{0x76,0x00},{0x7c,0x00},
// {0x00,0x3f},{0x06,0xbf},{0x07,0xc3},{0x10,0x81} //其他一些功能寄存器
// {0x20,0x18},{0x2d,0x85},
// {0x60,0x30},{0x64,0x57},{0x65,0x83},{0x67,0x82},{0x68,0xcf},{0x6a,0x22},{0x6f,0x1d},
// {0x70,0x8b},{0x74,0x00},{0x75,0x8e},{0x7c,0x80}
};
虽说这样,但这个过程涉及到不少东西都是需要看得明白的。
主要有:
ARM怎样通过IIC总线写OV7620的寄存器,部分代码如下:
void __inline OV9650_sccb_readchar(unsigned char *val)
{
int i;
int tmp = 0;
CFG_READ(SIO_D); //把GPE15设为input
for (i = 7; i >= 0; i--) //从高位起读一个字节,放在tmp
tmp |= OV9650_sccb_read_bit() << i;
CFG_WRITE(SIO_D); //把GPE15设为output
/* 9th bit - N.A. */
OV9650_sccb_write_bit(1); //第9位,不用管的
*val = tmp & 0xff; //保证tmp前8位有效,放入val数组中
}
/* 3-phase write */
/* 三段写 即先写设备ID,再写寄存器地址,最后写寄存器内容 */
static void OV9650_sccb_sendbyte(unsigned char subaddr, unsigned char data)
{
// down(&dev.bus_lock);
OV9650_sccb_start();
OV9650_sccb_writechar(OV9650_SCCB_ID); //设备ID
OV9650_sccb_writechar(subaddr); //设备某寄存器地址
OV9650_sccb_writechar(data); //对该寄存器赋值
OV9650_sccb_end();
mdelay(7);
// up(&dev.bus_lock);
}
还有一个就是2440的摄像头接口(Camera Interface)控制器的操作问题,说到底还是一些寄存器的配置,它有两种处理方式,一种是preview scaler,一种是codec scaler,并有对应的DMA进行图像数据的存取,所以用起来还是很方便的,主要考虑的问题就是输入数据的格式和输出数据的格式问题,输入数据是指从摄像头OV7620传过来的数据,输出是指经过preview scaler或者codec scaler处理后传送到DMA再进一步传给LCD进行显示的数据。
我现在用的是preview scaler方式,所以要保证输入数据为8位YCbCr格式就可以了,preivew scaler会自动把输出格式转化为16/24位RGB格式,这里就要跟LCD的输入格式对应起来的,LCD可以接收16位也可以接收24位RGB格式,只要两者的寄存器配置对应好就没问题了,我用的是16位RGB。
还有一点要说明一下,用preview scaler方式虽然方便,只要把格式正确的数据直接输入就OK了,但是无法知道它内部控制器是怎样处理数据,进行转化的,所以我觉得如果要对图像进一步处理,如去噪,锐化,增强对比度等等,还是用codec scaler比较好,这种方式更加方便自己写程序来进行简单的图像处理。
总结一下,要成功使用摄像头主要就处理好一下几个问题:
1.先用黑白格式,不要用彩色的,黑白的成功后再考虑彩色问题。
2.摄像头输出数据格式要与控制器接口的输入数据格式对应(如果有控制器接口的话),比如我这次是用8位YCbCr格式.
3.控制器接口输出数据要与LCD屏输入数据格式对应,这样LCD才能正确显示。这次用的是16位RGB格式。
4.就是一些时序的问题,因为2440的频率够快,所以这个问题基本忽略。
文章评论(0条评论)
登录后参与讨论