/**************************************************************************************
*
* 文件名 : cameram.c
*
* 功能描述 : OV9650摄像头模组寄存器功能配置以及底层驱动程序
*
**************************************************************************************/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "system.h"
#include "cameram.h"
#include "iic.h"
#include "intc.h"
#include "option.h"
#include "library.h"
#include "sfr6410.h"
#include "sysc.h"
#include "Camera.h"
CAMERA oCamera;
//I2C接口开启
void CAMERA_IICOpen(int Frequency)
{
IIC_Open(Frequency);
}
//I2C接口关闭
void CAMERA_IICClose(void)
{
IIC_Close();
}
//摄像头相关寄存器读/写操作
void CAMERA_Read_Write(u32 uCAMTYPE,CAM_ATTR eCcir, CSPACE eSrcFmt, SUB_SAMPLING eSub)
{
u8 x;
u32 uOutSel;
u32 uYcSel;
u32 uCrCbSel;
CAMERA_IICOpen(300000);
switch ( uCAMTYPE )
{
case 0:
oCamera.m_ucSlaveAddr = 0x5a;
CAMERA_SetReg(0xec, 0x00);
CAMERA_SetReg(0x72, 0x64); // 20Mhz的MCLK配置
CAMERA_SetReg(0xec, 0x00);
CAMERA_GetReg(0x72, &x);
UART_Printf("\nCheck 20Mhz Setting = 0x64 ----> 0x%x", x);
CAMERA_SetReg(0xec, 0x07);
CAMERA_SetReg(0x37, 0x00);
CAMERA_SetReg(0xec, 0x00);
CAMERA_GetReg(0x02, &x);
UART_Printf("\nImage Size Setting is 0x00 ===> 0x%x(0:SXGA 1:VGA)\n", x);
Delay(20000);
// 摄像头数据格式, YC通知配置
uOutSel = (eCcir == CCIR601) ? (1<<2) : (0<<2);
uYcSel = (eSrcFmt == YCBYCR || eSrcFmt == YCRYCB) ? (1<<1) : (0<<1);
uCrCbSel = (eSrcFmt == YCRYCB || eSrcFmt == CRYCBY) ? (1<<0) : (0<<0);
CAMERA_SetReg(0xec, 0x01);
CAMERA_SetReg(0x6a, uOutSel | uYcSel | 1);
CAMERA_SetReg(0xec, 0x01);
CAMERA_GetReg(0x6a, &x);
UART_Printf("\nImage Data 0x01======> 0x%x", x);
break;
case 1:
CAMERA_SetReg(0xfc, 0x01);
CAMERA_SetReg(0x03, 0x01); // 复位
CAMERA_SetReg(0xfc, 0x01);
CAMERA_SetReg(0x04, 0x03); //PCLK = PLL/2^1
CAMERA_SetReg(0xfc, 0x01);
CAMERA_GetReg(0x04, &x); // PCLK设置值
UART_Printf("\nPCLK Divider Setting Value 0x03 = 0x%x", x);
CAMERA_SetReg(0xfc, 0x02);
CAMERA_SetReg(0x52, 0x80); //PLL M=128d
CAMERA_SetReg(0xfc, 0x02);
CAMERA_GetReg(0x52, &x); // PLL_M = 128
UART_Printf("\nPLL_M Value 128 = 0x%d", x);
CAMERA_SetReg(0xfc, 0x02);
CAMERA_SetReg(0x50, 0x54); //PLL_S = 2
CAMERA_SetReg(0xfc, 0x02);
CAMERA_GetReg(0x50, &x); //
UART_Printf("\nP/S Setting Value 0x54 = 0x%x", x);
CAMERA_SetSizeInS5K3BAF(eSub);
/// 摄像头数据格式, YC通知设置
uOutSel = (eCcir == CCIR601) ? (1<<2) : (0<<2);
uYcSel = (eSrcFmt == YCBYCR || eSrcFmt == YCRYCB) ? (1<<1) : (0<<1);
uCrCbSel = (eSrcFmt == YCRYCB || eSrcFmt == CRYCBY) ? (1<<0) : (0<<0);
CAMERA_SetReg(0xfc, 0x01);
CAMERA_SetReg(0x02, uOutSel|uYcSel|uCrCbSel);
CAMERA_SetReg(0xfc, 0x01);
CAMERA_GetReg(0x02, &x); // 图像尺寸设置
UART_Printf("\nImage Size Setting Value 0x07 = 0x%x\n\n", x);
break;
default :
break;
}
CAMERA_IICClose();
}
//寄存器地址及数据选择
void CAMERA_SetReg_4CA(u16 ucSubAddr, u16 ucData)
{
u16 D[2];
D[0] = ucSubAddr;
D[1] = ucData;
}
//获取寄存器值
void CAMERA_GetReg_4CA(u16 ucSubAddr, u16 ucData)
{
u16 D[2];
u16 * RD[2];
D[0] = ucSubAddr;
D[1] = ucData;
}
//相关寄存器值配置
#if 0
void CAMERA_SetReg(u8 ucSubAddr, u8 ucData)
{
u8 D[2];
D[0] = ucSubAddr;
D[1] = ucData;
IIC_Write(oCamera.m_ucSlaveAddr, D[0], D[1]);
}
#else // 用于调试模式
void CAMERA_SetReg(u8 ucSubAddr, u8 ucData)
{
u8 D[2];
u8 x;
D[0] = ucSubAddr;
D[1] = ucData;
IIC_Write(oCamera.m_ucSlaveAddr, D[0], D[1]);
if ( ucSubAddr != 0xfc)
{
CAMERA_GetReg(ucSubAddr, &x);
if ( ucData != x )
{
UART_Printf("Addr = %x, Value=%x, Real=%x\n", ucSubAddr, ucData, x);
}
}
else
{
UART_Printf("-------------------Page = , %x\n", ucData);
}
}
#endif
void CAMERA_SetSizeInS5K4BAF(SUB_SAMPLING eSub)
{
u8 x;
u8 ucSub;
oCamera.m_ucSlaveAddr = 0x5a;
/// Size subsampling setting
ucSub = (eSub == SUB_SAMPLING0) ? 0 :
(eSub == SUB_SAMPLING2) ? 9 :
(eSub == SUB_SAMPLING4) ? 11 :
0xff;
Assert(ucSub < 0xff);
CAMERA_SetReg(0xfc, 0x00);
CAMERA_SetReg(0x02, ucSub);
}
//获取摄像头数据
#if 0
void CAMERA_GetReg(u8 ucSubAddr, u8* ucData)
{
IIC_SetWrite( oCamera.m_ucSlaveAddr, &ucSubAddr, 1);
IIC_SetRead( oCamera.m_ucSlaveAddr, ucData, 1);
IIC_Wait();
}
#else
void CAMERA_GetReg(u8 ucSubAddr, u8* ucData)
{
IIC_SetWrite( oCamera.m_ucSlaveAddr, &ucSubAddr, 1);
IIC_SetRead( oCamera.m_ucSlaveAddr, ucData, 1);
IIC_Wait();
}
#endif
//摄像头模组初始化
void CAMERA_InitOV9650(CAM_ATTR eCcir, u32 uBits, u8 bInv, CSPACE eSrcFmt)
{
u8 ucVal;
// IIC_Init();
oCamera.m_ucSlaveAddr = 0x42;
// CAMERA_SetReg(0x12, 0x80); // Camera Soft reset. Self cleared after reset.
// Delay(100);
CAMERA_SetReg(0x00, 0x00); // AGC gain
CAMERA_SetReg(0x01, 0x80); // blue gain
CAMERA_SetReg(0x02, 0x80); // red gain
CAMERA_SetReg(0x03, 0xb0); // saturation control
CAMERA_SetReg(0x06, 0x60); // set brightness - CJH
CAMERA_SetReg(0x0c, 0x24); // set white balance blue background
CAMERA_SetReg(0x0d, 0x24); // set white balance red background
CAMERA_SetReg(0x10, 0xff); // set auto exposure time, (not used in auto adjust mode)
ucVal = 0;
if (bInv)
{
ucVal |= (0<<7);
ucVal |= (1<<6);
}
else
{
ucVal |= (1<<7);
ucVal |= (0<<6);
}
ucVal |= (0<<0);
CAMERA_SetReg(0x11, ucVal);
ucVal = 0;
if ( eSrcFmt == YCBYCR || eSrcFmt == YCRYCB)
ucVal |= (1<<4);
ucVal |= (1<<2); // enable white balnace
ucVal |= (1<<5); // enable AGC
CAMERA_SetReg(0x12, ucVal);
ucVal = 0;
ucVal |= (uBits == 8 ? 1 : 0)<<5;
ucVal |= (eCcir == CCIR656 ? 1 : 0)<<4;
CAMERA_SetReg(0x13, ucVal);
Delay(10);
ucVal |= 0;
if (eSrcFmt == CBYCRY || eSrcFmt == YCBYCR)
ucVal |= (1<<0);
ucVal |= (bInv ? 1 : 0)<<6;
CAMERA_SetReg(0x15, ucVal);
Delay(10);
CAMERA_SetReg(0x16, 0x03); // Field mode : 11b-FRAME mode -> FD<7:2> is useless (default)
CAMERA_SetReg(0x17, 0x2f); // 47 -> Horizontal Start
CAMERA_SetReg(0x18, 0xcf); // (207-47)*4=640 -> Horizontal End
CAMERA_SetReg(0x19, 0x06); // 6 -> Vertical Start
CAMERA_SetReg(0x1a, 0xf5); // (245-6+1)*2=480 -> Vertical End
CAMERA_SetReg(0x1b, 0x00); // pixel shift=0
//(??old,incorrect) limit vertical size to 480, second stage aperture correction enable
CAMERA_SetReg(0x20, (0<<7)); // limit vertical size to 480 -> bit 7: Modified CCIR656 format vertical sizing enabled
CAMERA_SetReg(0x21, 0x80); // Y Channel Offset Adjustment - 0 , direction - Subtract
CAMERA_SetReg(0x22, 0x80); // U Channel Offset Adjustment - 0
CAMERA_SetReg(0x23, 0x00); // Crystal Current control : maximum current
CAMERA_SetReg(0x26, 0xa2); // digital sharpness threshold(64mV), magnitude(100%).
CAMERA_SetReg(0x27, 0xe2 ); // default, disable CCIR rang clip
//?? old value: 0xea, but bit[3] is reserved, why 1 ?
CAMERA_SetReg(0x29, (0<<6)); // CHSYNC & VSYNC master mode
CAMERA_SetReg(0x2a, 0x00); // default(
// (?? old,incorrect)frame rate high, 60Hz, 50Hz:0x80, UV delay 2 pixel. - CJH
CAMERA_SetReg(0x2b, 0x00); // default
// (??old,incorrect) frame rate low, 60Hz, 50Hz:0xac
CAMERA_SetReg(0x2c, 0x88); // default
CAMERA_SetReg(0x2e, 0x80); // default
CAMERA_SetReg(0x2f, 0x44); // default
CAMERA_SetReg(0x60, 0x27); // default
CAMERA_SetReg(0x61, 0x82); // YUV mode (7'st bit -> 1(YUV mode))
CAMERA_SetReg(0x62, 0x5f); // RGB Gamma control, gamma=010_1111b
CAMERA_SetReg(0x63, 0xd5); // reserved value ???
CAMERA_SetReg(0x64, 0x57); // enable Y Gamma,gammma=010_1011b
CAMERA_SetReg(0x65, 0x80+(3<<0));//??? bit[7:3]is reserved 01000b, why 0x80?, ADC_ref=11b(1.26V peak)
CAMERA_SetReg(0x66, 0x55); // default
CAMERA_SetReg(0x68, 0xcf)
没有合适的资源?快使用搜索试试~ 我知道了~
ARM嵌入式项目开发三位一体实战的源代码及原理图
共198个文件
c:90个
h:56个
sch:30个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 38 浏览量
2023-11-15
16:45:26
上传
评论
收藏 2.47MB 7Z 举报
温馨提示
ARM嵌入式项目开发三位一体实战的源代码及原理图
资源推荐
资源详情
资源评论
收起资源包目录
ARM嵌入式项目开发三位一体实战的源代码及原理图 (198个子文件)
表15-2 ADXL345寄存器映射(图).bmp 6.21MB
图15-2 S3C2440A处理器的串口结构框图.bmp 6.05MB
表15-1 ADXL345引脚功能描述(图).bmp 2.96MB
图15-1 远程医疗监护系统组成框图.bmp 2.1MB
图15-8 GPS模块内部硬件原理图.bmp 2.04MB
图15-11 主要程序流程图.bmp 1.86MB
图15-10 软件系统结构图.bmp 1.5MB
图15-3 硬件结构图.bmp 1.43MB
图15-4 ADXL345引脚配置图.bmp 809KB
图15-7 GPRS通信模块与硬件平台连接原理图.bmp 556KB
图15-9 GPS模块与硬件平台连接原理图.bmp 530KB
图15-5 ADXL345芯片SPI接口接线图.bmp 368KB
图15-6 ADXL345芯片I2C接口接线图.bmp 310KB
cameram.c 195KB
camera.c 106KB
camera_test.c 93KB
otg_dev.c 63KB
tvenc_test.c 61KB
SDIOUtil1.c 51KB
lcd.c 50KB
SDIOUtil.c 49KB
ac97.c 34KB
Uart0.c 32KB
hci_usb.c 28KB
lcdlib.c 28KB
Timer.c 24KB
btusb.c 23KB
adxl34x.c 23KB
read_write.c 22KB
tvenc.c 22KB
sx1231.c 21KB
basic_rf.c 20KB
Uart1.c 18KB
Spi.c 17KB
bfusb.c 17KB
hal_rf.c 16KB
hal_digio.c 15KB
Uart2.c 15KB
wsn.c 15KB
IrDA.c 15KB
sja1000_peli.c 15KB
PWM.c 14KB
per_test.c 14KB
hal_lcd_srf05.c 14KB
util_lcd.c 14KB
hal_rf_security.c 13KB
IrDA_test.c 13KB
ac97_test.c 10KB
hal_joystick.c 9KB
sht75.c 9KB
light_switch.c 9KB
GPRS_APP.c 9KB
Linux_driver.c 8KB
spectrum_analyzer.c 8KB
CalcLux.c 8KB
tsl2561.c 7KB
DS18B20.c 7KB
audio.c 7KB
hal_board.c 7KB
per_test_menu.c 7KB
I2C.c 7KB
Process.c 6KB
FHSSapi.c 6KB
util_buffer.c 6KB
hal_mcu.c 6KB
hal_timer_32k.c 6KB
int.c 6KB
util.c 6KB
Linux_keypad.c 5KB
GPS_APP.c 5KB
clock.c 5KB
2440lib.c 5KB
Main.c 4KB
hal_led.c 4KB
Adc.c 4KB
Floor.c 4KB
basic_rf_security.c 4KB
hal_int.c 4KB
adc.c 4KB
adxl34x-i2c.c 4KB
Eint.c 3KB
can_test.c 3KB
adxl34x-spi.c 3KB
Uart_test.c 3KB
hal_assert.c 3KB
DSP.C 3KB
PWM_DAC.c 3KB
Motor_Test.c 3KB
main.c 3KB
main.c 3KB
otg_dev_test.c 2KB
main.c 2KB
hal_button.c 2KB
hal_rf_util.c 2KB
Uart.c 2KB
keyscan.c 2KB
UART.c 1KB
Linux_api.c 1KB
8digitalLed.c 1KB
cpu.c 751B
共 198 条
- 1
- 2
资源评论
忧伤的玩不起
- 粉丝: 492
- 资源: 148
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功