附上代码吧,大家帮我看下uint8 OV7670_Init(void)
{
uint8 temp,i;
SCCB_init(); //初始化SCCB 的IO口
if(SCCB_WR_REG(0x12,0x80))return 1; //复位SCCB
delayms(50);
//读取产品型号
temp=SCCB_RD_REG(0x0a);
if(temp!=0x73)return 2;
temp=SCCB_RD_REG(0x0a);
if(temp!=0x76)return 2;
//初始化序列
for(i=0;i<sizeof(ov7670_init_reg_tbl)/sizeof(ov7670_init_reg_tbl[0]);i++)
{
SCCB_WR_REG(ov7670_init_reg_tbl[i][0],ov7670_init_reg_tbl[i][1]);
delayms(2);
}
return 0x00; //ok
}
/***********************************************************
*****函数名:SCCB_Init()
*****实现功能:初始化SCCB控制线
*****入口参数:无
*****返回值: 无
*************************************************************/
void SCCB_init(void)
{
p04_gpio; //时钟控制信号 SCCB_SDA
p05_gpio; //数据控制信号 SCCB_SCL
gpio_out(p04|p05);//设置为输出
}
/***********************************************************
*****函数名:SCCB_WR_REG(uint8 reg,uint8 data)
*****实现功能:向寄存器中写入数据
*****入口参数:reg,要写入的地址 data,要写入的数据
*****返回值: res:0成功,1失败
*************************************************************/
uint8 SCCB_WR_REG(uint8 reg,uint8 data)
{
uint8 res=0;
SCCB_START(); //启动SCCB 传输
if(SCCB_WR_BYTE(SCCB_ID))
res = 1; //写器件ID
delayus(100);
if(SCCB_WR_BYTE(reg))
res = 1; //写寄存器地址
delayus(100);
if(SCCB_WR_BYTE(data))
res = 1; //写数据
SCCB_STOP();
return res;
}
//读寄存器
//返回值:读到的寄存器值
uint8 SCCB_RD_REG(uint8 reg)
{
uint8 val=0;
SCCB_START(); //启动SCCB传输
SCCB_WR_BYTE(SCCB_ID); //写器件ID
delayus(100);
SCCB_WR_BYTE(reg); //写寄存器地址
delayus(100);
SCCB_STOP();
delayus(100);
//设置寄存器地址后,才是读
SCCB_START();
SCCB_WR_BYTE(SCCB_ID|0X01); //发送读命令
delayus(100);
val=SCCB_RD_BYTE(); //读取数据
SCCB_No_Ack();
SCCB_STOP();
return val;
}
/***********************************************************
*****函数名:SCCB_START(void)
*****实现功能:初始化SCCB控制线
*****入口参数:无
*****返回值: 无
*************************************************************/
//sccb起始信号,在时钟为高的时候,数据线由高到低为起始信号
//在激活起始信号之后,SDA与SCL均为低电平
void SCCB_START(void)
{
IO0SET = SCCB_SDA;
IO0SET = SCCB_SCL;
delayus(50);
IO0CLR = SCCB_SDA;
delayus(50);
IO0CLR = SCCB_SCL; //数据线恢复低电平,但操作函数没必要,主要是用于多次发送数据
}
//产生NA信号
void SCCB_No_Ack(void)
{
delayus(50);
IO0SET = SCCB_SDA;
IO0SET = SCCB_SCL;
delayus(50);
IO0CLR = SCCB_SCL;
delayus(50);
IO0CLR = SCCB_SDA;
delayus(50);
}
/***********************************************************
*****函数名:SCCB_STOP(void)
*****实现功能:初始化SCCB控制线
*****入口参数:无
*****返回值: 无
*************************************************************/
//sccb停止信号,在时钟为高的时候,数据线由低变高为停止信号
//空闲状况下,SDA与SCL均为高电平
void SCCB_STOP(void)
{
IO0CLR = SCCB_SDA;
delayus(50);
IO0SET = SCCB_SCL;
delayus(50);
IO0SET = SCCB_SDA;
delayus(50);
}
/***********************************************************
*****函数名:SCCB_WR_BYTE(uint8 dat)
*****实现功能:寄存器写入一个字节
*****入口参数:dat要写入的数据
*****返回值: 0成功,1失败
*************************************************************/
uint8 SCCB_WR_BYTE(uint8 dat)
{
uint8 j,res;
uint32 t;
for(j=0;j<8;j++)
{
if(dat & 0x08) IO0SET = SCCB_SDA;
else IO0CLR = SCCB_SDA;
dat <<= 1;
delayus(50);
IO0SET = SCCB_SCL ;
delayus(50);
IO0CLR = SCCB_SCL ;
}
IO0DIR=SCCB_SDA_IN;
delayus(50);
IO0SET = SCCB_SCL; //判断第九位,以判断是否发送成功
delayus(50);
t=IO0PIN & SCCB_SDA;
if(t)
res=1; //SDA=1发送失败,SDA=0发送成功
else
res=0; //SDA=0发送成功
IO0CLR = SCCB_SCL ;
IO0DIR=SCCB_SDA_OUT;
return res;
}
/***********************************************************
*****函数名:SCCB_RD_BYTE(void)
*****实现功能:SCCB读取一个字节,在SCL的上升沿,数据锁存
*****入口参数:无
*****返回值: 读到的数据
*************************************************************/
uint8 SCCB_RD_BYTE(void)
{
uint8 temp=0,j;
IO0SET = SCCB_SDA_IN;
for(j=8;j>0;j--)
{
delayus(50);
IO0SET = SCCB_SCL;
temp = temp<<1;
if(IO0PIN & SCCB_SDA)
temp++;
delayus(50);
IO0CLR = SCCB_SCL;
}
IO0DIR = SCCB_SDA_OUT;
return temp;
}
/***********************************************************
*****函数名:delayms(uint32 dly)
*****实现功能:延时毫妙
*****入口参数:微妙数
*****返回值: 无
*************************************************************/
void delayms(uint32 dly)
{
uint32 j,i;
for(j=0;j<dly;j++)
for(i=0;i<11059;i++);
}
/***********************************************************
*****函数名:delayus(uint32 dly)
*****实现功能:延时微妙
*****入口参数:微妙数
*****返回值: 无
*************************************************************/
void delayus(uint32 dly)
{
uint32 j,i;
for(j=0;j<dly;j++)
for(i=0;i<11;i++);
}
|