OpenEdv-开源电子网

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

用的是骑飞的OV2640,但是仔细的核查了SCCB协议,无法发现问题

[复制链接]

62

主题

284

帖子

0

精华

高级会员

Rank: 4

积分
947
金钱
947
注册时间
2014-11-22
在线时间
145 小时
发表于 2015-7-22 13:45:46 | 显示全部楼层 |阅读模式
5金钱
但是依旧读不出模块的ID:希望各位给与纠正
[mw_shl_code=c,true]#include "sccb.h" #include "Delay.h" #include "bsp_usart1.h" void I2C_GPIO(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //SDA?è?? GPIO_InitStructure.GPIO_Pin=I2C_SDA; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIO_I2C,&GPIO_InitStructure); //scl?è?? GPIO_InitStructure.GPIO_Pin=I2C_SCL; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIO_I2C,&GPIO_InitStructure); I2C_SCL_H; I2C_SDA_H; I2C_SDA_OUT(); } void I2C_SDA_OUT(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); GPIO_InitStructure.GPIO_Pin=I2C_SDA; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(GPIO_I2C,&GPIO_InitStructure); } void I2C_SDA_IN(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); GPIO_InitStructure.GPIO_Pin=I2C_SDA; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; GPIO_Init(GPIO_I2C,&GPIO_InitStructure); } //?ú?ú???????? void I2C_Start(void) { I2C_SDA_H; Delay_us(100); I2C_SCL_H; Delay_us(100); I2C_SDA_L; Delay_us(100); I2C_SCL_L; Delay_us(100); } //?ú?ú???????? void I2C_Stop(void) { I2C_SDA_L; Delay_us(100); I2C_SCL_L; Delay_us(100); I2C_SCL_H; Delay_us(100); I2C_SDA_H; Delay_us(100); } //?÷?ú?ú?ú????????ACK void I2C_Ack(void) { I2C_SDA_OUT(); I2C_SDA_H; Delay_us(100); I2C_SCL_H; Delay_us(100); I2C_SCL_L; Delay_us(100); I2C_SDA_H; } //?÷?ú???ú?ú????????NACK void I2C_NAck(void) { I2C_SDA_H; Delay_us(100); I2C_SCL_H; Delay_us(100); I2C_SCL_L; Delay_us(100); I2C_SDA_L; Delay_us(100); } /****?ì?é????????********/ char TestAsk(void) { char ask; I2C_SCL_H; Delay_us(100); I2C_SDA_IN(); Delay_us(100); ask=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7); Delay_us(100); I2C_SCL_L; Delay_us(100); return ask; } unsigned char I2C_Send_Byte(unsigned char DData) { unsigned char j,tem; //??°??????????????? for(j=8;j>0;j--) { I2C_SCL_L; if((DData)&0x80) { I2C_SDA_H; } else { I2C_SDA_L; } DData<<=1; Delay_us(100); I2C_SCL_H; Delay_us(100); I2C_SCL_L; Delay_us(100); } Delay_us(100); I2C_SDA_IN(); Delay_us(100); I2C_SCL_H; Delay_us(100); //???????????????????é??,0±í??????????????1±í???????? if(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA)==1) { tem=0; printf("\r\n????·????§°?\r\n"); } else { tem=1; printf("\r\n????·???????\r\n"); } I2C_SCL_L; Delay_us(100); I2C_SDA_OUT(); return(tem); } unsigned char I2C_Read_Byte(void) { unsigned char read,j; read=0x00; I2C_SDA_IN(); Delay_us(100); I2C_SCL_L; for(j=8;j>0;j--) { Delay_us(100); I2C_SCL_H; Delay_us(100); read<<=1; if(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA)) { read |=0x01; } Delay_us(50); I2C_SCL_L; Delay_us(100); } return read; } //?????????÷???? u8 OV2640_WR_Reg(u8 reg,u8 data) { I2C_Start(); //;//????OV2640??ID if(0==I2C_Send_Byte(SCCB_ID)) { I2C_Stop(); return 0; } Delay_us(100); //;//?????è????×÷???ü?? if(0==I2C_Send_Byte(reg & 0x00ff))//?è???????????· { I2C_Stop(); return 0; } Delay_ms(100); //;//?????è?????? if(0==I2C_Send_Byte(data)) { I2C_Stop(); return 0; } I2C_Stop(); return 1; } //?????????÷???????? u8 OV2640_RD_Data(u8 reg) { u8 val; I2C_Start(); I2C_Send_Byte(SCCB_ID);//?????÷????ID Delay_us(100); I2C_Send_Byte(reg);//?????è????×÷???????÷ Delay_us(100); I2C_Stop(); Delay_us(100); I2C_Start(); I2C_Send_Byte(SCCB_ID | 0x01); Delay_us(100); val=I2C_Read_Byte(); I2C_NAck(); I2C_Stop(); return val; } [/mw_shl_code]
这里是参考原子哥的程序来读取OV2640的ID的
[mw_shl_code=c,true]u8 OV2640_ReadID(void) { u32 reg=0; I2C_GPIO(); OV2640_DataInit(); PCLK_HR_VSYNC_RST_GPIOInit(); OV2640_RST_L;//????????OV2640 Delay_ms(5); OV2640_RST_H; OV2640_WR_Reg(0xff,0x01);//??×÷sensor?????÷ if(0== OV2640_WR_Reg(0x12,0x80))//????OV2640 { printf("\r\nOV2640???????§°?\r\n"); LCD_DispEnCh(5,80,"OV2640 Init ERROR",RED); } OV2640_WR_Reg(OV2640_DSP_RA_DLMT, 0x01);//?????????·???à?????? Delay_ms(5); reg = OV2640_RD_Data(OV2640_SENSOR_MIDH); reg<<=8; reg |= OV2640_RD_Data(OV2640_SENSOR_MIDL); LCD_DispEnCh(5,100,"OV2640 ID:",RED); printf("OV2640??ID??:%d\r\n",reg); LCD_DisNum(65,100,reg,RED); if( (reg!=0)&&(reg != 0xffff) ) { printf("\r\n????OV2640??ID???·\r\n"); return 1; } else { printf("\r\n????OV2640??ID???í\r\n"); return 0; } }[/mw_shl_code]


最佳答案

查看完整内容[请看2#楼]

问题已经解决,点一句:是管脚的输出频率的问题,
爱上一匹野马,可惜放走了,就不回头了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

62

主题

284

帖子

0

精华

高级会员

Rank: 4

积分
947
金钱
947
注册时间
2014-11-22
在线时间
145 小时
 楼主| 发表于 2015-7-22 13:45:47 | 显示全部楼层
问题已经解决,点一句:是管脚的输出频率的问题,
爱上一匹野马,可惜放走了,就不回头了
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2015-8-24
在线时间
0 小时
发表于 2015-8-24 16:38:33 | 显示全部楼层
回复【2楼】jack_zhou:
---------------------------------
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2015-8-24
在线时间
0 小时
发表于 2015-8-24 16:40:33 | 显示全部楼层
我也用骑飞的2640 ID号能读出来,但是JPEG的头是FFDE,尾是FFDC。与原子大侠的FFD8和FFD9不一样,所以串口摄像头不显示图象。请问你也碰到这个问题吗?
回复

使用道具 举报

62

主题

284

帖子

0

精华

高级会员

Rank: 4

积分
947
金钱
947
注册时间
2014-11-22
在线时间
145 小时
 楼主| 发表于 2015-8-28 17:18:28 | 显示全部楼层
回复【4楼】gxd:
---------------------------------我已经搞好了,就是图像干扰厉害
爱上一匹野马,可惜放走了,就不回头了
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-8-21
在线时间
4 小时
发表于 2019-8-21 14:15:55 | 显示全部楼层
jack_zhou 发表于 2015-8-28 17:18
回复【4楼】gxd:
---------------------------------我已经搞好了,就是图像干扰厉害

您好,我想咨询下骑飞OV2640相关问题,方便加个好友沟通下吗?有偿,微信:cxy13762637018 QQ 1638057926
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2021-6-26
在线时间
1 小时
发表于 2021-8-14 20:57:14 | 显示全部楼层
我现在和你的问题一样,寄存器的值一直是OXFF,是不是时钟没给到24MHZ的问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 21:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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