微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > s3c2440的摄像接口拍照应用

s3c2440的摄像接口拍照应用

时间:11-26 来源:互联网 点击:

for(i=0;i<8;i++)

{

if(data & 0x80)

DATA_HIGH();

else

DATA_LOW();

delay(10);

CLOCK_HIGH();

delay(10);

CLOCK_LOW();

delay(10);

DATA_LOW();

delay(10);

data <= 1;

}

// 第 9 位, Don’t Care

DATA_HIGH();

delay(10);

CLOCK_HIGH();

delay(10);

CLOCK_LOW();

delay(10);

}

// SCCB 接收一个字节

void __inline SCCB_receivebyte(unsigned char *data)

{

int i=0;

int svalue=0;

int pvalue = 0;

rGPECON = 1<28;// 把 GPE15 输出改变为输入

// 串行数据转并行输入,高位在前

for(i=7;i>=0;i--)

{

CLOCK_HIGH();

delay(10);

svalue = rGPEDAT>>15;

CLOCK_LOW();

delay(10);

pvalue |= svalue

}

rGPECON =5<28;// 再把 GPE15 改回为输出

// 第 9 位, N.A.

DATA_HIGH();

delay(10);

CLOCK_HIGH();

delay(10);

CLOCK_LOW();

delay(10);

*data = pvalue &0xff;

}

// 写操作

void SCCB_senddata(unsigned char subaddr, unsigned char data)

{

//3 相写传输周期

SCCB_start();// 启动 SCCB

SCCB_sendbyte(0x60);//OV9650 设备从地址,写操作

SCCB_sendbyte(subaddr);// 设备内存地址

SCCB_sendbyte(data);// 写数据字节

SCCB_end();// 结束 SCCB

delay(20);

}

// 读操作

unsigned char SCCB_receivedata(unsigned char subaddr)

{

unsigned char temp;

//2 相写传输周期

SCCB_start();// 启动 SCCB

SCCB_sendbyte(0x60);//OV9650 设备从地址,写操作

SCCB_sendbyte(subaddr);// 设备内存地址

SCCB_end();// 结束 SCCB

//2 相读传输周期

SCCB_start();// 启动 SCCB

SCCB_sendbyte(0x61);//OV9650 设备从地址,读操作

SCCB_receivebyte(&temp);// 读字节

SCCB_end();// 结束 SCCB

return temp;

}

OV9650 的寄存器较多,要想配置好这些寄存器是需要花费一些精力的。下面数组给出了一个 VGA ( 640 × 480 )模式下 YUV 彩色空间的配置例子,括号内第一个元素表示寄存器地址,第二个元素表示要写入的数据。

const unsigned char ov9650_register[ ][2] = {

{0x11,0x80},{0x6a,0x3e},{0x3b,0x09},{0x13,0xe0},{0x01,0x80},{0x02,0x80},{0x00,0x00},{0x10,0x00},

{0x13,0xe5},{0x39,0x43},{0x38,0x12},{0x37,0x00},{0x35,0x91},{0x0e,0xa0},{0x1e,0x04},{0xA8,0x80},

{0x12,0x40},{0x04,0x00},{0x0c,0x04},{0x0d,0x80},{0x18,0xc6},{0x17,0x26},{0x32,0xad},{0x03,0x00},

{0x1a,0x3d},{0x19,0x01},{0x3f,0xa6},{0x14,0x2e},{0x15,0x10},{0x41,0x02},{0x42,0x08},{0x1b,0x00},

{0x16,0x06},{0x33,0xe2},{0x34,0xbf},{0x96,0x04},{0x3a,0x00},{0x8e,0x00},{0x3c,0x77},{0x8B,0x06},

{0x94,0x88},{0x95,0x88},{0x40,0xc1},{0x29,0x3f},{0x0f,0x42},{0x3d,0x92},{0x69,0x40},{0x5C,0xb9},

{0x5D,0x96},{0x5E,0x10},{0x59,0xc0},{0x5A,0xaf},{0x5B,0x55},{0x43,0xf0},{0x44,0x10},{0x45,0x68},

{0x46,0x96},{0x47,0x60},{0x48,0x80},{0x5F,0xe0},{0x60,0x8c},{0x61,0x20},{0xa5,0xd9},{0xa4,0x74},

{0x8d,0x02},{0x13,0xe7},{0x4f,0x3a},{0x50,0x3d},{0x51,0x03},{0x52,0x12},{0x53,0x26},{0x54,0x38},

{0x55,0x40},{0x56,0x40},{0x57,0x40},{0x58,0x0d},{0x8C,0x23},{0x3E,0x02},{0xa9,0xb8},{0xaa,0x92},

{0xab,0x0a},{0x8f,0xdf},{0x90,0x00},{0x91,0x00},{0x9f,0x00},{0xa0,0x00},{0x3A,0x01},{0x24,0x70},

{0x25,0x64},{0x26,0xc3},{0x2a,0x00},{0x2b,0x00},{0x6c,0x40},{0x6d,0x30},{0x6e,0x4b},{0x6f,0x60},

{0x70,0x70},{0x71,0x70},{0x72,0x70},{0x73,0x70},{0x74,0x60},{0x75,0x60},{0x76,0x50},{0x77,0x48},

{0x78,0x3a},{0x79,0x2e},{0x7a,0x28},{0x7b,0x22},{0x7c,0x04},{0x7d,0x07},{0x7e,0x10},{0x7f,0x28},

{0x80,0x36},{0x81,0x44},{0x82,0x52},{0x83,0x60},{0x84,0x6c},{0x85,0x78},{0x86,0x8c},{0x87,0x9e},

{0x88,0xbb},{0x89,0xd2},{0x8a,0xe6},

};

另外 OV9650 有两个只读寄存器—— 0x1C 和 0x1D ,用于存放厂家 ID ,数据分别为 0x7F 和 0xA2 ,我们可以通过读取它们来判断 s3c2440 是否连接了 OV9650 。当确认连接了 OV9650 后,我们就可以把上面的那个数组写入 OV9650 内,如下所示。在这里我们总是认为 s3c2440 连接了 OV9650 。

void config_ov9650(void)

{

unsigned char temp;

int i;

// 读取 OV9650 厂商 ID

i=1;

while(i)

{

temp = SCCB_receivedata(0x1C);// 或 Rd_SCCB (0x1C,&temp);

if(temp==0x7F)

i=0;

}

i=1;

while(i)

{

temp = SCCB_receivedata(0x1D);// 或 Rd_SCCB (0x1D,&temp);

if(temp==0xA2)

i=0;

}

// 复位所有 OV9650 寄存器

SCCB_senddata(0x12,0x80);// 或 Wr_SCCB (0x12,0x80);

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

网站地图

Top