金牌会员
- 积分
- 1393
- 威望
- 690
- 贡献
- 439
- 兑换币
- 386
- 注册时间
- 2013-3-6
- 在线时间
- 132 小时
- 毕业学校
- 北京师范大学珠海分校
|
K60,系统频率211MHz
SCCB代码和OV7620配置代码如下,为什么就是不行呢!!!到底怎么配置摄像头啊,图像烂死了....
OV7620配置代码:
/////////////////////////////////////////////////////
配置摄像头:初始化函数
void ov7620_init(void)
{
SIO_D_OUT;//sccb管脚初始化 输入方向
SIO_C_OUT;//sccb管脚初始化 输入方向
wrOV7620Reg(0x14, 0x24);//QVGA
wrOV7620Reg(0x2D, 0x95);//自动亮度 自动适应光频率
}
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
写 摄像头寄存器 函数
void wrOV7620Reg(uint8 regID, uint8 regDat)
{
uint8 i;
uint8 ack;
for(i=0;i<20;i++)
{
startSCCB();
ack = SCCBwriteByte(0x42);
if(ack==1){
stopSCCB();
continue;
}
ack = SCCBwriteByte(regID);
if(ack==1){
stopSCCB();
continue;
}
ack = SCCBwriteByte(regDat);
if(ack==1){
stopSCCB();
continue;
}
stopSCCB();
if(ack==0) break;
}
}
/////////////////////////////////////////////////////!!!!!!!!!!!!!!!!!!!!!!1
/////////////////////////////////////////////////////!!!!!!!!!!!!!!!!!!!!!!!
//功能:读OV7620寄存器 !!!!!!!!!看这函数,感觉有可能错!!!!!!!!!!!
//返回:1-成功 0-失败 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
uint8 rdOV7620Reg(uint8 regID, uint8 *regDat)
{
//通过写操作设置寄存器地址
startSCCB();
if(0==SCCBwriteByte(0x42))
{
stopSCCB();
return(0);
}
SCCBdelay();
if(0==SCCBwriteByte(regID))
{
stopSCCB();
return(0);
}
stopSCCB();
SCCBdelay();
//设置寄存器地址后,才是读
startSCCB();
if(0==SCCBwriteByte(0x43))
{
stopSCCB();
return(0);
}
SCCBdelay();
*regDat=SCCBreadByte();
SCCBdelay();
stopSCCB();
return(1);
}
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
SCCB:
void SCCBdelay()// 该延时函数测试过了,用它进行延时,然后对一个管脚输出取反,测得该脚输出频率为397KHz
{
unsigned char a;
for(a=39;a>0;a--)
asm("nop");
}
/*
-----------------------------------------------
功能: start命令,SCCB的起始信号
参数: 无
返回值: 无
-----------------------------------------------
*/
void startSCCB(void)
{
SIO_D_OUT;
SIO_D_SET; //数据线高电平
SIO_C_SET; //在时钟线高的时候数据线由高至低
SCCBdelay();
SIO_D_CLR;
SCCBdelay();
SIO_C_CLR; //数据线恢复低电平,单操作函数必要
}
/*
-----------------------------------------------
功能: stop命令,SCCB的停止信号
参数: 无
返回值: 无
-----------------------------------------------
*/
void stopSCCB(void)
{
SIO_D_OUT;
SIO_D_CLR;
SCCBdelay();
SIO_C_SET;
SCCBdelay();
SIO_D_SET;
SCCBdelay();
}
void SCCB_SendAck(uint8 ack)
{
SIO_D_OUT;
if(ack==1)
gpio_ctrl (PORTB, 9, 1);
else gpio_ctrl (PORTB, 9, 0);
SIO_C_SET;
SCCBdelay();
SIO_C_CLR;
}
uint8 SCCBwriteByte(uint8 bytedata)
{
uint8 i,ack;
SIO_D_OUT;
for(i=0;i<8;i++) //循环8次发送数据
{
if(bytedata&0x80){
SIO_D_SET;
}
else{
SIO_D_CLR;
}
bytedata<<=1;
SCCBdelay();
SIO_C_SET;
SCCBdelay();
SIO_C_CLR;
SCCBdelay();
}
SIO_D_SET;
SIO_D_IN;/*设置SDA为输入*/
SCCBdelay();
SIO_C_SET;
SCCBdelay();
ack = SIO_D_STATE;
SIO_C_CLR;
SCCBdelay();
return ack;
}
/*
-----------------------------------------------
功能: 一个字节数据读取并且返回
参数: 无
返回值: 读取到的数据
-----------------------------------------------
*/
uint8 SCCBreadByte(void)
{
uint8 read,j;
read=0x00;
SIO_D_IN;/*设置SDA为输入*/
for(j=8;j>0;j--) //循环8次接收数据
{
SIO_C_SET;
SCCBdelay();
read=read<<1;
if(SIO_D_STATE)
{
read |=0x01;
}
SIO_C_CLR;
SCCBdelay();
}
return(read);
}
/////////////////////////////////////////////////////
求代码........................发份能用的来!!!!
纠结好久了.................................
|
|