您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> 关于摄像头OV9650模块的问题
本帖共有1875个阅读者
发表帖子 发表投票 回复主题
关于摄像头OV9650模块的问题
lovepanpanzhao(论坛新手)
lovepanpanzhao
头衔:社区公民
帮派:无帮无派
帖数:18
金钱:261
积分:25
注册时间:2012/12/24
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
关于摄像头OV9650模块的问题

我用的是BF518,自己画的最小系统,OV9650是你们这买的。

1、//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

BF518的PPI0~PPI7与OV9650模块的8个数据线直连

BF518的FS1和FS2同步信号引脚分别与OV9650模块的的HREF和VSYNC直接相连

BF518的PPICLK与OV9650模块的PCLK直接相连

BF518的任意两个IO 与 OV9650模块 两个I2C通讯口相连,I2C的数据线加了3.3V上拉,时钟线没加上拉。

BF518的FS3接了10K电阻下拉到地

OV9650模块74HC245的OE引脚直接与地短接

我用模拟I2C的方式与摄像头进行通信,以上连发是否有问题?(细节上应该注意什么?)

2、/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

I2C模拟读取摄像头寄存器值得时候,读回来全是0xff,我自己用导线连高低电平给IO口,模拟读取外部引脚都是准确的(接3.3V时,读回来是1,接地读回来是0)。我的程序在附件,为什么我读取寄存器都无法成功?希望能帮我看看我的程序,I2C模拟部分是否有问题!

#include <cdefBF518.h>
#include <ccblkfn.h>
#include <stdio.h>

#define _CORE_CLK      400*1000*1000
#define _I2C_DELAY_NS  60000

#define  OV9650_ADDRESS 0x60

static void _init_i2c_port(void)
{
*pPORTF_FER &= ~(PF10|PF11);
ssync();
*pPORTFIO_INEN &= ~(PF10|PF11);
*pPORTFIO_DIR |= (PF10|PF11);
ssync();
}

static void _i2c_clk_h(void)
{
    *pPORTFIO_SET |= PF10;    
ssync();
}

static void _i2c_clk_l(void)
{
    *pPORTFIO_CLEAR |= PF10;
ssync();
}

static void _i2c_dat_h(void)
{
    *pPORTFIO_SET |= PF11;  
ssync();
}

static void _i2c_dat_l(void)
{
    *pPORTFIO_CLEAR |= PF11;
ssync();  
}

static void _set_dat_input(void)
{
*pPORTFIO_DIR &= ~PF11;
*pPORTFIO_INEN |= PF11;
ssync();
}

static void _set_dat_output(void)
{
*pPORTFIO_INEN &= ~PF11;
*pPORTFIO_DIR |= PF11;
ssync();
}

static int _get_dat(void)
{
return ((*pPORTFIO & PF11) ? 1 : 0);
}

static void _delay_ns(unsigned long long  count)
{
count *= _CORE_CLK;
count /= 1000000000;
while(count--);

}

static void i2c_start(void)
{
_i2c_clk_h();
_i2c_dat_h();
_delay_ns(_I2C_DELAY_NS);

_i2c_dat_l();
_delay_ns(_I2C_DELAY_NS);

_i2c_clk_l();
_delay_ns(_I2C_DELAY_NS);
}

static void i2c_stop(void)
{
_i2c_dat_l();
_delay_ns(_I2C_DELAY_NS);

_i2c_clk_h();
_delay_ns(_I2C_DELAY_NS);

_i2c_dat_h();
_delay_ns(_I2C_DELAY_NS);
}

static void i2c_write_bit(unsigned char bit)
{
if (bit)
  _i2c_dat_h();
else
  _i2c_dat_l();
_delay_ns(_I2C_DELAY_NS);

_i2c_clk_h();
_delay_ns(_I2C_DELAY_NS);

_i2c_clk_l();
_delay_ns(_I2C_DELAY_NS);
}

static int i2c_read_bit(void)
{
int bit;

_i2c_clk_h();
_delay_ns(_I2C_DELAY_NS);

bit = _get_dat();
_i2c_clk_l();
_delay_ns(_I2C_DELAY_NS);

return bit;
}

static void i2c_writechar(unsigned char data)
{
int i;

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

i2c_write_bit(1);
}

static void i2c_readchar(unsigned char *val)
{
int i;
int tmp = 0;

_set_dat_input();

for (i = 7; i >= 0; i--)
  tmp |= i2c_read_bit() << i;

_set_dat_output();

i2c_write_bit(1);

*val = tmp & 0xff;
}

static void ov9650_write(unsigned char subaddr, unsigned char data)
{
i2c_start();
i2c_writechar(OV9650_ADDRESS);
i2c_writechar(subaddr);
i2c_writechar(data);
i2c_stop();
}

static unsigned char ov9650_read(unsigned char subaddr)
{
unsigned char value;

i2c_start();
i2c_writechar(OV9650_ADDRESS);
i2c_writechar(subaddr);
i2c_stop();

i2c_start();
i2c_writechar(OV9650_ADDRESS+1);
i2c_readchar(&value);
i2c_stop();

return value;
}


void Init_CMOS_OV9650(void)
{
unsigned char test;

_init_i2c_port();
_delay_ns(100000);
/*ov9650_write(0x12,0x80);
_delay_ns(100000);
ov9650_write(0x12,0x80);
_delay_ns(100000);
ov9650_write(0x11,0x81);
ov9650_write(0x6b,0x0a);
ov9650_write(0x6a,0x3e);
ov9650_write(0x3b,0x09);
ov9650_write(0x13,0xe0);
ov9650_write(0x01,0x80);
ov9650_write(0x02,0x80);
ov9650_write(0x00,0x00);
ov9650_write(0x10,0x00);
ov9650_write(0x13,0xe5);
ov9650_write(0x39,0x43);
ov9650_write(0x38,0x12);
ov9650_write(0x37,0x00);
ov9650_write(0x35,0x91);
ov9650_write(0x0e,0x20);
ov9650_write(0x1e,0x34);
ov9650_write(0xA8,0x80);
ov9650_write(0x12,0x40);
ov9650_write(0x04,0x00);
ov9650_write(0x0c,0x04);
ov9650_write(0x0d,0x80);
ov9650_write(0x18,0xc6);
ov9650_write(0x17,0x26);
ov9650_write(0x32,0xad);
ov9650_write(0x03,0x00);
ov9650_write(0x1a,0x3d);
ov9650_write(0x19,0x01);
ov9650_write(0x3f,0xa6);
ov9650_write(0x14,0x1a);
ov9650_write(0x15,0x02);
ov9650_write(0x41,0x12);
ov9650_write(0x42,0x08);
ov9650_write(0x1b,0x00);
ov9650_write(0x16,0x06);
ov9650_write(0x33,0xe2);
ov9650_write(0x49,0x60);
ov9650_write(0x34,0x16);
ov9650_write(0x96,0x04);
ov9650_write(0x3a,0x00);
ov9650_write(0x8e,0x00);
ov9650_write(0x3c,0x77);
ov9650_write(0x8B,0x06);
ov9650_write(0x94,0x88);
ov9650_write(0x95,0x88);
ov9650_write(0x40,0xc1);
ov9650_write(0x29,0x3f);
ov9650_write(0x0f,0x42);
ov9650_write(0x3d,0x92);
ov9650_write(0x69,0x40);
ov9650_write(0x5C,0xb9);
ov9650_write(0x5D,0x96);
ov9650_write(0x5E,0x10);
ov9650_write(0x59,0xc0);
ov9650_write(0x5A,0xaf);
ov9650_write(0x5B,0x55);
ov9650_write(0x43,0xf0);
ov9650_write(0x44,0x10);
ov9650_write(0x45,0x68);
ov9650_write(0x46,0x96);
ov9650_write(0x47,0x60);
ov9650_write(0x48,0x80);
ov9650_write(0x5F,0xe0);
ov9650_write(0x60,0x8c);
ov9650_write(0x61,0x20);
ov9650_write(0xa5,0xd9);
ov9650_write(0xa4,0x74);
ov9650_write(0x8d,0xc2);
ov9650_write(0x13,0xe7);
ov9650_write(0x4f,0x3a);
ov9650_write(0x50,0x3d);
ov9650_write(0x51,0x03);
ov9650_write(0x52,0x12);
ov9650_write(0x53,0x26);
ov9650_write(0x54,0x38);
ov9650_write(0x55,0x40);
ov9650_write(0x56,0x40);
ov9650_write(0x57,0x40);
ov9650_write(0x58,0x0d);
ov9650_write(0x8C,0x23);
ov9650_write(0x3E,0x02);
ov9650_write(0xa9,0xb8);
ov9650_write(0xaa,0x92);
ov9650_write(0xab,0x0a);
ov9650_write(0x8f,0xdf);
ov9650_write(0x90,0x00);
ov9650_write(0x91,0x00);
ov9650_write(0x9f,0x00);
ov9650_write(0xa0,0x00);
ov9650_write(0x3A,0x01);
ov9650_write(0x24,0x80);
ov9650_write(0x25,0x70);
ov9650_write(0x26,0xd3);
ov9650_write(0x2a,0x10);
ov9650_write(0x2b,0x40);
ov9650_write(0x6c,0x40);
ov9650_write(0x6d,0x30);
ov9650_write(0x6e,0x4b);
ov9650_write(0x6f,0x60);
ov9650_write(0x70,0x70);
ov9650_write(0x71,0x70);
ov9650_write(0x72,0x70);
ov9650_write(0x73,0x70);
ov9650_write(0x74,0x60);
ov9650_write(0x75,0x60);
ov9650_write(0x76,0x50);
ov9650_write(0x77,0x48);
ov9650_write(0x78,0x3a);
ov9650_write(0x79,0x2e);
ov9650_write(0x7a,0x28);
ov9650_write(0x7b,0x22);
ov9650_write(0x7c,0x04);
ov9650_write(0x7d,0x07);
ov9650_write(0x7e,0x10);
ov9650_write(0x7f,0x28);
ov9650_write(0x80,0x36);
ov9650_write(0x81,0x44);
ov9650_write(0x82,0x52);
ov9650_write(0x83,0x60);
ov9650_write(0x84,0x6c);
ov9650_write(0x85,0x78);
ov9650_write(0x86,0x8c);
ov9650_write(0x87,0x9e);
ov9650_write(0x88,0xbb);
ov9650_write(0x89,0xd2);
ov9650_write(0x8a,0xe6);*/

test = ov9650_read(0x1c);
printf( "             reg 0x1c: %x\n",test);\
test = ov9650_read(0x1d);
printf( "             reg 0x1d: %x\n",test);
}

我在main函数调用 void Init_CMOS_OV9650(void) 这个函数 读取不到ID号!



这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/1/12 20:02:42
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

openadsp社区网站上有个在BF533下的摄像头代码,里面的IIC是用IO模拟的,你把那个IIC代码移植到你的代码下试试


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/1/12 20:09:34
lovepanpanzhao(论坛新手)
lovepanpanzhao
头衔:社区公民
帮派:无帮无派
帖数:18
金钱:261
积分:25
注册时间:2012/12/24
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
我一开始就是用533的那个版本移植到518的,不能成功,所以我就用了ARM板以前可以用的这个程序进行了移植,还是不行。

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/1/12 20:15:22
lovepanpanzhao(论坛新手)
lovepanpanzhao
头衔:社区公民
帮派:无帮无派
帖数:18
金钱:261
积分:25
注册时间:2012/12/24
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

调试相机I2C,只要连好电源和地,连好I2C的两根线,OE拉低,就可以了是不是?按理这样就能读取寄存器值了是不是?


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/1/12 20:17:36
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

是的,那个子卡板需要供3.3V和5V两个电源,拉低后就可以IIC访问了。那个533下的IIC代码,是我们花了很长时间搞的,并且移植过很多平台应用,兼容性很好,51X和533有着同样的核,那个代码你底层修改好的话,基本不需要做什么过多修改。顺便问一句,为什么不用BF51X的TWI接口呢,提供给你的代码是采用TWI接口配置的。


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/1/12 22:36:41
lovepanpanzhao(论坛新手)
lovepanpanzhao
头衔:社区公民
帮派:无帮无派
帖数:18
金钱:261
积分:25
注册时间:2012/12/24
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

回复andy:因为我想做移植性做的好点,所以用IO口模拟。以后不一定用BF518的


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/1/13 20:06:26
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159338 Call, 1 Queries, Processed in 0.078125 second(s),