[LPC] LPC2103 驱动摄像头0v7670

[复制链接]
 楼主| 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
 楼主| wangyudong 发表于 2013-8-16 10:30 | 显示全部楼层
jlass 发表于 2013-8-16 09:32
SDA必须上拉

直接接了个上拉电阻,他为什么就都变成高电平了啊,上拉的接法有什么要求不,我直接3.3v接5K电阻然后接的端口
jlass 发表于 2013-8-16 12:43 | 显示全部楼层
wangyudong 发表于 2013-8-16 10:30
直接接了个上拉电阻,他为什么就都变成高电平了啊,上拉的接法有什么要求不,我直接3.3v接5K电阻然后接的 ...

你确认SDA引脚有输出数据么?
 楼主| wangyudong 发表于 2013-8-16 14:13 | 显示全部楼层
jlass 发表于 2013-8-16 12:43
你确认SDA引脚有输出数据么?

我是没接上拉电阻之前测试的时候有电平变化,接了之后一直为高电平了
 楼主| wangyudong 发表于 2013-8-16 14:22 | 显示全部楼层
附上代码吧,大家帮我看下
  1. uint8 OV7670_Init(void)
  2. {
  3.         uint8 temp,i;
  4.         SCCB_init();                        //初始化SCCB 的IO口                     
  5.         if(SCCB_WR_REG(0x12,0x80))return 1;        //复位SCCB          
  6.         delayms(50);
  7.         //读取产品型号
  8.         temp=SCCB_RD_REG(0x0a);
  9.         if(temp!=0x73)return 2;  
  10.         temp=SCCB_RD_REG(0x0a);   
  11.         if(temp!=0x76)return 2;
  12.         //初始化序列          
  13.         for(i=0;i<sizeof(ov7670_init_reg_tbl)/sizeof(ov7670_init_reg_tbl[0]);i++)
  14.         {
  15.                    SCCB_WR_REG(ov7670_init_reg_tbl[i][0],ov7670_init_reg_tbl[i][1]);
  16.                 delayms(2);
  17.         }
  18.            return 0x00;         //ok
  19. }
  1. /***********************************************************
  2. *****函数名:SCCB_Init()
  3. *****实现功能:初始化SCCB控制线
  4. *****入口参数:无
  5. *****返回值:  无
  6. *************************************************************/
  7. void SCCB_init(void)
  8. {
  9.         p04_gpio;        //时钟控制信号        SCCB_SDA
  10.         p05_gpio;        //数据控制信号        SCCB_SCL

  11.         gpio_out(p04|p05);//设置为输出

  12. }

  13. /***********************************************************
  14. *****函数名:SCCB_WR_REG(uint8 reg,uint8 data)
  15. *****实现功能:向寄存器中写入数据
  16. *****入口参数:reg,要写入的地址    data,要写入的数据
  17. *****返回值:  res:0成功,1失败
  18. *************************************************************/

  19. uint8 SCCB_WR_REG(uint8 reg,uint8 data)
  20. {
  21.         uint8 res=0;
  22.         SCCB_START();                                         //启动SCCB        传输
  23.         if(SCCB_WR_BYTE(SCCB_ID))
  24.                 res = 1;  //写器件ID
  25.         delayus(100);
  26.         if(SCCB_WR_BYTE(reg))
  27.            res = 1;        //写寄存器地址
  28.         delayus(100);
  29.         if(SCCB_WR_BYTE(data))         
  30.            res = 1;        //写数据
  31.         SCCB_STOP();
  32.         return res;       
  33.                           
  34. }

  35. //读寄存器
  36. //返回值:读到的寄存器值
  37. uint8 SCCB_RD_REG(uint8 reg)
  38. {
  39.         uint8 val=0;
  40.         SCCB_START();                                 //启动SCCB传输
  41.         SCCB_WR_BYTE(SCCB_ID);                //写器件ID          
  42.         delayus(100);         
  43.           SCCB_WR_BYTE(reg);                        //写寄存器地址          
  44.         delayus(100);          
  45.         SCCB_STOP();   
  46.         delayus(100);          
  47.         //设置寄存器地址后,才是读
  48.         SCCB_START();
  49.         SCCB_WR_BYTE(SCCB_ID|0X01);        //发送读命令          
  50.         delayus(100);
  51.           val=SCCB_RD_BYTE();                         //读取数据
  52.           SCCB_No_Ack();
  53.           SCCB_STOP();
  54.           return val;
  55. }




  56. /***********************************************************
  57. *****函数名:SCCB_START(void)
  58. *****实现功能:初始化SCCB控制线
  59. *****入口参数:无
  60. *****返回值:  无
  61. *************************************************************/

  62. //sccb起始信号,在时钟为高的时候,数据线由高到低为起始信号
  63. //在激活起始信号之后,SDA与SCL均为低电平
  64. void SCCB_START(void)
  65. {
  66.         IO0SET = SCCB_SDA;
  67.         IO0SET = SCCB_SCL;
  68.         delayus(50);
  69.         IO0CLR = SCCB_SDA;
  70.         delayus(50);
  71.         IO0CLR = SCCB_SCL;           //数据线恢复低电平,但操作函数没必要,主要是用于多次发送数据


  72. }

  73. //产生NA信号
  74. void SCCB_No_Ack(void)
  75. {
  76.         delayus(50);
  77.         IO0SET = SCCB_SDA;       
  78.         IO0SET = SCCB_SCL;       
  79.         delayus(50);
  80.         IO0CLR = SCCB_SCL;       
  81.         delayus(50);
  82.         IO0CLR = SCCB_SDA;       
  83.         delayus(50);
  84. }

  85. /***********************************************************
  86. *****函数名:SCCB_STOP(void)
  87. *****实现功能:初始化SCCB控制线
  88. *****入口参数:无
  89. *****返回值:  无
  90. *************************************************************/

  91. //sccb停止信号,在时钟为高的时候,数据线由低变高为停止信号
  92. //空闲状况下,SDA与SCL均为高电平
  93. void SCCB_STOP(void)
  94. {
  95.         IO0CLR = SCCB_SDA;
  96.         delayus(50);
  97.         IO0SET = SCCB_SCL;
  98.         delayus(50);
  99.         IO0SET = SCCB_SDA;
  100.         delayus(50);
  101. }

  102. /***********************************************************
  103. *****函数名:SCCB_WR_BYTE(uint8 dat)
  104. *****实现功能:寄存器写入一个字节
  105. *****入口参数:dat要写入的数据
  106. *****返回值:  0成功,1失败
  107. *************************************************************/
  108. uint8 SCCB_WR_BYTE(uint8 dat)
  109. {
  110.         uint8 j,res;
  111.         uint32 t;
  112.         for(j=0;j<8;j++)
  113.         {
  114.                 if(dat & 0x08) IO0SET = SCCB_SDA;
  115.                 else IO0CLR = SCCB_SDA;
  116.                 dat <<= 1;
  117.                 delayus(50);
  118.                 IO0SET = SCCB_SCL ;
  119.                 delayus(50);
  120.                 IO0CLR = SCCB_SCL ;
  121.         }
  122.         IO0DIR=SCCB_SDA_IN;
  123.         delayus(50);
  124.         IO0SET = SCCB_SCL;                //判断第九位,以判断是否发送成功
  125.         delayus(50);
  126.         t=IO0PIN & SCCB_SDA;
  127.         if(t)
  128.                 res=1;                                 //SDA=1发送失败,SDA=0发送成功
  129.         else
  130.             res=0;                                         //SDA=0发送成功
  131.         IO0CLR = SCCB_SCL ;
  132.         IO0DIR=SCCB_SDA_OUT;
  133.     return res;
  134. }


  135. /***********************************************************
  136. *****函数名:SCCB_RD_BYTE(void)
  137. *****实现功能:SCCB读取一个字节,在SCL的上升沿,数据锁存
  138. *****入口参数:无
  139. *****返回值:  读到的数据
  140. *************************************************************/
  141. uint8 SCCB_RD_BYTE(void)
  142. {
  143.          uint8 temp=0,j;
  144.          IO0SET = SCCB_SDA_IN;
  145.          for(j=8;j>0;j--)
  146.          {
  147.                  delayus(50);
  148.                 IO0SET = SCCB_SCL;
  149.                 temp = temp<<1;
  150.                 if(IO0PIN & SCCB_SDA)
  151.                         temp++;
  152.                 delayus(50);
  153.             IO0CLR = SCCB_SCL;         
  154.          }
  155.          IO0DIR = SCCB_SDA_OUT;
  156.          return temp;
  157. }




  158. /***********************************************************
  159. *****函数名:delayms(uint32 dly)
  160. *****实现功能:延时毫妙
  161. *****入口参数:微妙数
  162. *****返回值:  无
  163. *************************************************************/
  164. void delayms(uint32 dly)
  165. {
  166.         uint32 j,i;
  167.         for(j=0;j<dly;j++)
  168.         for(i=0;i<11059;i++);

  169. }


  170. /***********************************************************
  171. *****函数名:delayus(uint32 dly)
  172. *****实现功能:延时微妙
  173. *****入口参数:微妙数
  174. *****返回值:  无
  175. *************************************************************/
  176. void delayus(uint32 dly)
  177. {
  178.         uint32 j,i;
  179.         for(j=0;j<dly;j++)
  180.         for(i=0;i<11;i++);

  181. }
阿南 发表于 2013-8-17 06:07 | 显示全部楼层
"接了示波器返回0xfe,接了以后就返回0x80",说明你的信号很容易受到干扰,把通信速度降下来试试。如果有条件也可以换一个好点的示波器探头测
戈卫东 发表于 2013-9-28 20:26 | 显示全部楼层
有FIFO的还要SCCB?
sinc_mark 发表于 2013-9-29 13:28 | 显示全部楼层
LZ有上操作系统么?
戈卫东 发表于 2013-11-8 09:22 | 显示全部楼层
2103,容量非常小,应该没有资源上操作系统
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

1

主题

6

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部