打印
[LPC]

LPC2103 驱动摄像头0v7670

[复制链接]
2471|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangyudong|  楼主 | 2013-8-15 21:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在想用2103驱动摄像头并对所得图片进行图像分析,但是一直驱动不了摄像头,7670是带fifo的,我这里有STM32的例程,仿照实现SCCB时序,对0v7670的寄存器进行设置,代码感觉没什么问题,一直不能对寄存器设置和读取。我是 用一般gpio做为SDA,和SCL的这个有什么特殊要求吗,比如必须上拉

相关帖子

沙发
阿南| | 2013-8-16 08:22 | 只看该作者
最好用示波器扫一下波形

使用特权

评论回复
板凳
jlass| | 2013-8-16 09:32 | 只看该作者
SDA必须上拉

使用特权

评论回复
地板
wangyudong|  楼主 | 2013-8-16 10:18 | 只看该作者
阿南 发表于 2013-8-16 08:22
最好用示波器扫一下波形

用示波器看了下,返回的信号有高电平变化,但是我单步的时候和他全速运行的时候得到的值不一样,还有他不接示波器返回0xfe,接了以后就返回0x80

使用特权

评论回复
5
wangyudong|  楼主 | 2013-8-16 10:30 | 只看该作者
jlass 发表于 2013-8-16 09:32
SDA必须上拉

直接接了个上拉电阻,他为什么就都变成高电平了啊,上拉的接法有什么要求不,我直接3.3v接5K电阻然后接的端口

使用特权

评论回复
6
jlass| | 2013-8-16 12:43 | 只看该作者
wangyudong 发表于 2013-8-16 10:30
直接接了个上拉电阻,他为什么就都变成高电平了啊,上拉的接法有什么要求不,我直接3.3v接5K电阻然后接的 ...

你确认SDA引脚有输出数据么?

使用特权

评论回复
7
wangyudong|  楼主 | 2013-8-16 14:13 | 只看该作者
jlass 发表于 2013-8-16 12:43
你确认SDA引脚有输出数据么?

我是没接上拉电阻之前测试的时候有电平变化,接了之后一直为高电平了

使用特权

评论回复
8
wangyudong|  楼主 | 2013-8-16 14:22 | 只看该作者
附上代码吧,大家帮我看下
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++);

}

使用特权

评论回复
9
阿南| | 2013-8-17 06:07 | 只看该作者
"接了示波器返回0xfe,接了以后就返回0x80",说明你的信号很容易受到干扰,把通信速度降下来试试。如果有条件也可以换一个好点的示波器探头测

使用特权

评论回复
10
戈卫东| | 2013-9-28 20:26 | 只看该作者
有FIFO的还要SCCB?

使用特权

评论回复
11
sinc_mark| | 2013-9-29 13:28 | 只看该作者
LZ有上操作系统么?

使用特权

评论回复
12
戈卫东| | 2013-11-8 09:22 | 只看该作者
2103,容量非常小,应该没有资源上操作系统

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝