⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 camera.c

📁 用SMART2200低成本的实现OV9650摄像头驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "config.h"
#include "LPC2294.h"
OS_EVENT  *CamMbox = NULL;          // 摄像头消息邮箱
#define  LED1    (1<<28)
#define  LED2    (1<<29)
#define  Led_on1(void) (IO2CLR |= LED1)
#define  Led_on2(void) (IO2CLR |= LED2)
/*XCLK时钟设置*/
#define  CYCLE_DATA      100
#define  DUTY_CYCLE_DATA 50

#define	udelay(x)		Delay(x/50)
#define	mdelay(x)		Delay((x)*8)

#define min(x1,x2) (((x1)<(x2))? (x1):(x2))
#define max(x1,x2) (((x1)>(x2))? (x1):(x2))

/* refer to OV9650 datasheet */
static unsigned char sccb_id = 0x60;	//OV9650
#define OV9650_SCCB_ID sccb_id          //0x42  /* CS[2:0] = 000 */	//hzh, use variable

#define OV9650_MAX_CLK 24000000 // 24MHz
#define OV9650_PRODUCT_ID 0x7FA2


#define OV9650_SCCB_DELAY    100 
#define OV9650_SCCB_DELAY2   100

#define	read_gpio_bit(x)		((IO1PIN & (1<<(x))) ? 1 : 0)
#define	write_gpio_bit_set(x)	(IO1SET |= 1<<(x))
#define	write_gpio_bit_clear(x)	(IO1CLR |= 1<<(x))


#define SIO_C          (20)
#define SIO_D          (21)
#define BIT_READ(x)   read_gpio_bit(x)
#define MAKE_HIGH(x)  write_gpio_bit_set(x)
#define MAKE_LOW(x)   write_gpio_bit_clear(x)

#define	YCbCrtoR(Y,Cb,Cr)	(1000*Y + 1371*(Cr-128))/1000
#define YCbCrtoG(Y,Cb,Cr)	(1000*Y - 336*(Cb-128) - 698*(Cr-128))/1000
#define	YCbCrtoB(Y,Cb,Cr)	(1000*Y + 1732*(Cb-128))/1000

#define SCR_XSIZE_TFT_240320 	(240)
#define SCR_YSIZE_TFT_240320 	(320)


unsigned char Cam_outY[100000];
unsigned char Cam_outU[100000];
unsigned char Cam_outV[100000];

unsigned short RGBBuffer[200000];
int      Preview_size;

#if OV9650_SCCB_DELAY > 0
#define WAIT_CYL udelay(OV9650_SCCB_DELAY)
#else
#define WAIT_CYL (void)(0)
#endif

#if OV9650_SCCB_DELAY2 > 0
#define WAIT_STAB udelay(OV9650_SCCB_DELAY2)
#else
#define WAIT_STAB (void)(0)
#endif
//***************************[ ov9650 reg ]***************************************************
#define CAMERA_WRITE  (0x60 + 0)
#define CAMERA_READ   (0x60 + 1)
#define CHIP_DELAY    0xFF
struct ov9650_t 
{
	int subaddr;
	int value;
}; 
struct ov9650_t ov9650_reg[] =
{
	{0x12, 0x80},	// Camera Soft reset. Self cleared after reset.
	{CHIP_DELAY, 10},
	{0x11,0x07},{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},
};
#define OV9650_REGS (sizeof(ov9650_reg)/sizeof(ov9650_reg[0]))
//***************************[ SYSTEM ]***************************************************
void Delay(int time)
{
   uint32 i;

   for(; time>0; time--)
   {  for(i=0; i<100; i++);
   }

}
/*********************************************************************************************************
** 函数名称: 
** 功能描述: 
** 输 入: 
**
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************************/
void __inline ov9650_Init(void)
{
    PINSEL1 = PINSEL1  &0xfffffff7;    /* 选择管脚p1.20,P1.21为GPIO,输出高 */
    IO1DIR=IO1DIR | 0x00300000;
    IO1SET=IO1SET | 0x00300000;
    IO2DIR=IO2DIR | 0x30000000;       /* 选择管脚p2.28,P2.29为GPIO,输出高 */
    IO2SET=IO2SET | 0x30000000;
	mdelay(10);
}
/*********************************************************************************************************
** 函数名称: 
** 功能描述: 
** 输 入: 
**
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************************/
void __inline ov9650_Write(void)
{
    IO1DIR=IO1DIR | 0x00200000;    /* 选择管脚p1.21输出 */
}
/*********************************************************************************************************
** 函数名称: 
** 功能描述: 
** 输 入: 
**
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************************/
void __inline ov9650_Read(void)
{      
    IO1DIR=IO1DIR & 0xFFDFFFFF; /* 选择管脚p1.21输入 */
}
/*********************************************************************************************************
** 函数名称: 
** 功能描述: 
** 输 入: 
**
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************************/
/* 2-wire SCCB */
void __inline ov9650_sccb_start(void)
{
	MAKE_HIGH(SIO_C);
	MAKE_HIGH(SIO_D);
	WAIT_STAB;
	MAKE_LOW(SIO_D);
	WAIT_STAB;
	MAKE_LOW(SIO_C);
	WAIT_STAB;
}
/*********************************************************************************************************
** 函数名称: 
** 功能描述: 
** 输 入: 
**
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************************/
/* 2-wire SCCB */
void __inline ov9650_sccb_end(void)
{
	MAKE_LOW(SIO_D);
	WAIT_STAB;
	MAKE_HIGH(SIO_C);
	WAIT_STAB;
	MAKE_HIGH(SIO_D);
	WAIT_STAB;
}
/*********************************************************************************************************
** 函数名称: 
** 功能描述: 
** 输 入: 
**
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************************/
void __inline ov9650_sccb_write_bit(unsigned char bit)
{
	if (bit)
		MAKE_HIGH(SIO_D);
	else
		MAKE_LOW(SIO_D);
	WAIT_STAB;
	MAKE_HIGH(SIO_C);
	WAIT_CYL;
	MAKE_LOW(SIO_C);
	WAIT_STAB;
}
/*********************************************************************************************************
** 函数名称: 
** 功能描述: 
** 输 入: 
**
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************************/
int __inline ov9650_sccb_read_bit(void)
{
	int tmp = 0;

	MAKE_HIGH(SIO_C);
	WAIT_CYL;
	tmp = BIT_READ(SIO_D);
	MAKE_LOW(SIO_C);
	WAIT_STAB;

	return tmp;
}
/*********************************************************************************************************
** 函数名称: 
** 功能描述: 
** 输 入: 
**
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************************/
void __inline ov9650_sccb_writechar(unsigned char data)
{
	int i = 0;

	/* data */
	for (i = 0; i < 8; i++ ) {
		ov9650_sccb_write_bit(data & 0x80);
		data <<= 1;
	}

	/* 9th bit - Don't care */
	ov9650_sccb_write_bit(1);
}
/*********************************************************************************************************
** 函数名称: 
** 功能描述: 
** 输 入: 
**
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************************/
void __inline ov9650_sccb_readchar(unsigned char *val)
{
	int i;
	int tmp = 0;
	
    ov9650_Read();
    
	for (i = 7; i >= 0; i--)
		tmp |= ov9650_sccb_read_bit() << i;

	ov9650_Write();

	/* 9th bit - N.A. */
	ov9650_sccb_write_bit(1);

	*val = tmp & 0xff;
}
/*********************************************************************************************************
** 函数名称: 
** 功能描述: 
** 输 入: 
**
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************************/
static void ov9650_sccb_sendbyte(unsigned char subaddr, unsigned char data)
{
//	down(&dev.bus_lock);

	ov9650_sccb_start();
	ov9650_sccb_writechar(OV9650_SCCB_ID);
	ov9650_sccb_writechar(subaddr);
	ov9650_sccb_writechar(data);
	ov9650_sccb_end();

	mdelay(7);

//	up(&dev.bus_lock);
}
/*********************************************************************************************************
** 函数名称: 
** 功能描述: 
** 输 入: 
**
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************************/
/* 2-phase read */
static unsigned char ov9650_sccb_receivebyte(unsigned char subaddr)
{
	unsigned char value;

//	down(&dev.bus_lock);

	/* 2-phase write */
	ov9650_sccb_start();
	ov9650_sccb_writechar(OV9650_SCCB_ID);
	ov9650_sccb_writechar(subaddr);
	ov9650_sccb_end();

	/* 2-phase read */
	ov9650_sccb_start();
	ov9650_sccb_writechar(OV9650_SCCB_ID | 0x01);
	ov9650_sccb_readchar(&value);
	ov9650_sccb_end();

	mdelay(7);

//	up(&dev.bus_lock);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -