OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13195|回复: 34

摄像头代码移植,SCCB初始化错误

[复制链接]

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-4-24 10:53:14 | 显示全部楼层 |阅读模式
原子哥移植了你的摄像头代码,在SCCB初始化时候出现了错误,SCCB的SDA和SCL我看普通IO就可以了吧,不用像IIC加上拉电阻吧。
函数是在  SCCB_Init();          //初始化SCCB 的IO口      
  if(SCCB_WR_Reg(0x12,0x80))return 1; //复位SCCB
 这句出错
SCCB_WR_Reg() -->if(SCCB_WR_Byte(SCCB_ID))res=1; //写器件ID -->SCCB_WR_Byte()--> if(SCCB_READ_SDA)res=1;  //SDA=1发送失败,返回1
SCCB_READ_SDA这里读到了1.程序追踪到这就错误返回了初始化错误


原子哥有没有什么好的建议?我移植的战舰板子库函数例程,只是改了pin操作应该不会有错的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
 楼主| 发表于 2015-3-26 09:10:40 | 显示全部楼层
回复【25楼】wendell.li:
---------------------------------
完全没有解决,也没看到图像啊哥们
回复 支持 1 反对 0

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
 楼主| 发表于 2013-4-24 12:37:18 | 显示全部楼层
求指点啊
我用带上拉的pin也不行啊,我的导线有20cm
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2013-4-24 13:51:57 | 显示全部楼层
估计是你的IO设置问题.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
 楼主| 发表于 2013-4-24 19:55:48 | 显示全部楼层
IO设置,我copy的,只改了pin名字
改动的有:
#define SCCB_SCL_Low     GPIO_ResetBits(GPIOD, GPIO_Pin_1)   //SCL拉低
#define SCCB_SCL_High     GPIO_SetBits(GPIOD, GPIO_Pin_1)    //SCL拉高
#define SCCB_SDA_Low     GPIO_ResetBits(GPIOD, GPIO_Pin_0)  //SDA拉低
#define SCCB_SDA_High     GPIO_SetBits(GPIOD, GPIO_Pin_0)     //SDA拉高
#define SCCB_READ_SDA     GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_0) //输入SDA 

void SCCB_SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

   //使用PD0 D1作为SCCB D0:SDA  D1: SCL
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入       
    GPIO_Init(GPIOD, &GPIO_InitStructure);
}

void SCCB_SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

   //使用PD0 D1作为SCCB D0:SDA  D1: SCL
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //推挽输出 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    
    GPIO_Init(GPIOD, &GPIO_InitStructure);
}回复【3楼】正点原子:
---------------------------------

就改了这些基本操作
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
 楼主| 发表于 2013-4-24 20:15:16 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
void SCCB_Init(void)
{    
    //使用PD0 D1作为SCCB D0:SDA  D1: SCL  
  GPIO_InitTypeDef  GPIO_InitStructure;
 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);  //使能PD端口时钟

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;  // 端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;   //输入
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_SetBits(GPIOD,GPIO_Pin_0);  // 输出高

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;  // 端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //输输出
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  GPIO_SetBits(GPIOD,GPIO_Pin_1);  // 输出高
 
SCCB_SDA_OUT();  
}
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
 楼主| 发表于 2013-4-24 21:25:41 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子哥啊,有没有什么思路帮我想想能找到问题原因?
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
 楼主| 发表于 2013-4-24 22:44:35 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
换了两个pin来做,还是一样结果。。。。。。。。
摄像头是好的没问题
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2013-4-25 00:11:19 | 显示全部楼层
回复【7楼】wwjdwy:
---------------------------------
先看SCCB初始化能不能过.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
 楼主| 发表于 2013-4-25 06:47:30 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
初始化是通过了的,没有问题
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
 楼主| 发表于 2013-4-25 06:52:29 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
SDA ,SCL SET与RESET也都正确
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2013-4-25 10:05:31 | 显示全部楼层
回复【9楼】wwjdwy:
---------------------------------
那你的标题是怎么回事?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
 楼主| 发表于 2013-4-25 10:19:21 | 显示全部楼层
OV7670_Init函数中 
if(SCCB_WR_Reg(0x12,0x80))return 1; //复位SCCB
 这句出错 确实return了1
SCCB_WR_Reg() -->if(SCCB_WR_Byte(SCCB_ID))res=1; //写器件ID -->SCCB_WR_Byte()--> if(SCCB_READ_SDA)res=1;  //SDA=1发送失败,返回1
SCCB_READ_SDA这里读到了1.程序追踪到这就错误返回了初始化错误
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
 楼主| 发表于 2013-4-25 10:19:46 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
我用飞线在战舰板子上也是OK的,所以飞线过长的可能也排除了
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
 楼主| 发表于 2013-4-25 10:21:25 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
SCCB初始化通过了,只是设置pin角
紧接着的复位SCCB就出错了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2013-4-25 10:48:39 | 显示全部楼层
回复【12楼】wwjdwy:
---------------------------------
那就检查SCCB时序就完了.
先检查硬件连线,再检查波形.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
 楼主| 发表于 2013-4-25 11:10:10 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
连线检查了三四遍了,没问题了。
波形。。。。哎,手里没有示波器。。。。。。痛苦
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2013-4-25 14:29:07 | 显示全部楼层
回复【16楼】wwjdwy:
---------------------------------
那就单步仿真,用万用表测一下sccb的两个信号线,是否有信号.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
 楼主| 发表于 2013-4-25 16:00:33 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
就是用JTAG在线调试吧?好的,我晚上回去一点点啃
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
 楼主| 发表于 2013-4-26 11:52:00 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
//SCCB,写入一个字节
//返回值:0,成功;1,失败. 
u8 SCCB_WR_Byte(u8 dat)
{
u8 j,res;  
for(j=0;j<8;j++) //循环8次发送数据 ID:0x42  01000010
{
if(dat&0x80)SCCB_SDA_High; //00010010
else SCCB_SDA_Low;
dat<<=1;
delay_us(50);
SCCB_SCL_High;
delay_us(50);
SCCB_SCL_Low;    
}  
SCCB_SDA_IN(); //设置SDA为输入 
delay_us(50);
SCCB_SCL_High; //接收第九位,以判断是否发送成功
delay_us(50);
if(SCCB_READ_SDA)res=1;  //SDA=1发送失败,返回1
else res=0;         //SDA=0发送成功,返回0
SCCB_SCL_Low;  
SCCB_SDA_OUT(); //设置SDA为输出    
return res;  
}

循环里写入一个字节都是正确的,
可是 if(SCCB_READ_SDA)res=1;  //SDA=1发送失败,返回1
这里总是读的是1
郁闷了,这肿么个情况啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2013-4-26 14:02:49 | 显示全部楼层
说明没读到数据.或者你的读配置有问题.直接用杜邦线,吧SCCB_READ_SDA给接低电平,看看能否正常读取.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
 楼主| 发表于 2013-4-26 21:47:58 | 显示全部楼层
回复【20楼】正点原子:
---------------------------------
是个办法,明天一早就去试试。这个SCCB_READ_SDA不是用杜邦线接低电平吧,不是还要发送么,我把它这句直接当做读到了低电平吧
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
 楼主| 发表于 2013-4-27 09:55:47 | 显示全部楼层
回复【20楼】正点原子:
---------------------------------
读SDA:#define SCCB_READ_SDA     GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_0) //输入SDA 

我在SCCB_WR_Byte中将// if(SCCB_READ_SDA)res=1;  //SDA=1发送失败,返回1
                                   // else res=0;         //SDA=0发送成功,返回0
    改为  res=0;意思默认读到0.

在后面的 //读取产品型号
  temp=SCCB_RD_Reg(0x0b);   
if(temp!=0x73)return 2;  
  temp=SCCB_RD_Reg(0x0a);   
if(temp!=0x76)return 2;

读到的是0xFF,读SDA看来确实是出了问题。
void SCCB_SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
//使用PD0 D1作为SCCB D0:SDA  D1: SCL
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //上拉输入       
    GPIO_Init(GPIOD, &GPIO_InitStructure);

}

void SCCB_SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
    //使用PD0 D1作为SCCB D0:SDA  D1: SCL
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //推挽输出 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    
    GPIO_Init(GPIOD, &GPIO_InitStructure);

}

这两句反复检查没看到有错误的信息。而且输入模式我试过infloating也是不行
这里的SCL,SDA我试着用带上拉电阻的去实验也是没有通过
回复 支持 反对

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2014-12-2
在线时间
34 小时
发表于 2015-3-25 09:23:59 | 显示全部楼层
回复【19楼】wwjdwy:
---------------------------------
你好 , 我也遇到你那样的问题 , SDA 线上一直是 高电平 ,请问你是怎么解决的呢 ?
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
 楼主| 发表于 2015-3-25 14:21:34 | 显示全部楼层
回复【23楼】wendell.li:
---------------------------------
木有解决啊。
回复 支持 反对

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2014-12-2
在线时间
34 小时
发表于 2015-3-25 19:34:19 | 显示全部楼层
回复【24楼】wwjdwy:
---------------------------------
那你最好怎么弄的 ,我这里采集不到图像呀 。
回复 支持 反对

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2014-12-2
在线时间
34 小时
发表于 2015-3-26 09:17:30 | 显示全部楼层
回复【26楼】wwjdwy:
---------------------------------
HI ,
      之前我也遇到你这样的问题 ,最后查证是 SDA 的那根线的配置方式有问题 , 需要配置为上拉输入 。 另外如果你写数据出错的话 ,实际你的摄像头初始化也是错误的,并没有真的写进去 , 另外如果摄像头没有带晶振的话需要提供时钟给模块工作  。
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
 楼主| 发表于 2015-3-26 12:41:14 | 显示全部楼层
回复【27楼】wendell.li:
---------------------------------
多谢多谢!!!
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2014-9-12
在线时间
0 小时
发表于 2015-5-7 10:31:57 | 显示全部楼层
回复【28楼】wwjdwy:
---------------------------------
你好,我调试OV7670时设置SDA输入方式为IPU时,写入函数int SCCB_WriteByte( u16 WriteAddress , u8 SendByte, u8* eer )
{
if(!SCCB_Start())
{
*eer = 5;
return DISABLE;
}
SCCB_delay();
SCCB_SendByte(DEV_ADR_W);           
if( !SCCB_WaitAck() )
{
SCCB_Stop();
*eer = 6;
return DISABLE;
}运行到这一步就不行了,就是返回eer=6,请问你的调试成功了么
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2015-3-28
在线时间
0 小时
发表于 2015-6-30 08:57:22 | 显示全部楼层
菜鸟一个,学习中
回复 支持 反对

使用道具 举报

9

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2015-8-27
在线时间
22 小时
发表于 2015-10-12 14:36:06 | 显示全部楼层
回复【23楼】wendell.li:
------------------------------
我之前也是IO有问题,我换了一对IO来模拟SIOC和SIOD,就好了,不知道什么原因就不好用了,只能飞线换了一对。
回复 支持 反对

使用道具 举报

106

主题

418

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2016-7-26
在线时间
123 小时
发表于 2017-1-21 21:51:38 | 显示全部楼层
wendell.li 发表于 2015-3-26 09:17
回复【26楼】wwjdwy:
---------------------------------
HI&nbsp;,

请问为什么要配置为上拉输入??
回复 支持 反对

使用道具 举报

7

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
金钱
216
注册时间
2016-2-24
在线时间
39 小时
发表于 2017-12-1 14:38:51 | 显示全部楼层
顶,再次呼叫原子哥啊
回复 支持 反对

使用道具 举报

5

主题

17

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-4-2
在线时间
10 小时
发表于 2019-4-10 13:56:56 | 显示全部楼层
顶一顶,楼主解决了吗,我也遇到一样的问题
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2022-9-15
在线时间
0 小时
发表于 2022-9-15 21:24:01 | 显示全部楼层
我也遇到了同样的问题,SDA一直为高电平
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 04:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表