我用的是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号!