ov7670读取ID成功(不带FIFO),记录注意事项

您所在的位置:网站首页 i2c读不出数据 ov7670读取ID成功(不带FIFO),记录注意事项

ov7670读取ID成功(不带FIFO),记录注意事项

2024-01-13 08:44| 来源: 网络整理| 查看: 265

搞了一天了,浏览了各大网站,终于让我读成功了,记录一下这个时刻 在这里插入图片描述 总结: 1.接线:(总共7根) 除SCCB所需四根线 GND — GND 3.3V ---- 3.3V PD0—SCL PD1—SDA

还有 PWDN----PE5 拉高 RET ---- 拉高 看到这篇帖子OV7670读出的ID值为0x00,SCCB_SDA脚为0.5V,拉不高

XCLK—PC6 24MHz pwm 最重要的是OV7670的系统时钟线XCLK ,用STM32输出个最大25MHz的时钟,我用TIM3输出PWM波 ARR =2 PSC=0,频率为24MHz,比较值为1,占空比为1/3,本来以为不行,看来可以。

2.SCCB延时(100us),应该不是这个原因,50us也读成功了 3.写Ox12,之后延时3s SCCB_WR_Reg(0x12,0x80); delay_ms(3000);(这个延时好像也无所谓,我去掉之后也能读) 4.SCL SDA 推完输出 SDA上拉输入 5.有人说要上拉电阻,我的没接也可以读 6.重要代码部分

//SCCB.c #include "SCCB.h" #define SCCB_SCL BITBAND_REG(GPIOD->ODR,0) #define SCCB_SDA BITBAND_REG(GPIOD->ODR,1) #define SCCB_READ_SDA GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1) void SCCB_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD, ENABLE ); GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; GPIO_Init( GPIOD, &GPIO_InitStruct ); } void SCCB_SDA_IN(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD, ENABLE ); GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1; GPIO_Init( GPIOD, &GPIO_InitStruct ); } void SCCB_SDA_OUT(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD, ENABLE ); GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1; GPIO_Init( GPIOD, &GPIO_InitStruct ); } void SCCB_Start(void) { SCCB_SDA=1; SCCB_SCL=1; delay_us(100); SCCB_SDA=0; delay_us(100); //并不是必须为50us,不要太短即可 SCCB_SCL=0; } void SCCB_Stop(void) { SCCB_SDA=0; delay_us(100); SCCB_SCL=1; delay_us(100); SCCB_SDA=1; delay_us(100); } u8 SCCB_WR_Byte(u8 dat)//写1个相 { u8 j,res; for(j=0;j u8 res=0; SCCB_Start(); //启动传输的标志 if(SCCB_WR_Byte(SCCB_ID))res=1; //写入OV7670传感器ID delay_us(100); if(SCCB_WR_Byte(reg))res=1; //写寄存器地址 delay_us(100); if(SCCB_WR_Byte(data))res=1; //写要向寄存器写入的数据 SCCB_Stop(); //结束传输的标志 return res; } void SCCB_No_Ack(void) { delay_us(100); SCCB_SDA=1; SCCB_SCL=1; delay_us(100); SCCB_SCL=0; delay_us(100); SCCB_SDA=0; delay_us(100); } u8 SCCB_RD_Byte(void) { u8 temp=0,j; SCCB_SDA_IN(); //设置主机SDA连接的IO口为输入 for(j=8;j>0;j--) //循环读取bit7-bit0 { delay_us(100); SCCB_SCL=1; temp=temp u8 ID=0; USART1_Configuration(115200); led_init(); PEOut(5) = 1; PBOut(5) = 0; TIM3_PWM_Init(2,0); //arr = 2 psc = 0 24MHz TIM_SetCompare1(TIM3,1); SCCB_GPIO_Init(); printf("initing....\r\n"); SCCB_WR_Reg(0x12,0x80); delay_ms(3000); ID = SCCB_RD_Reg(0x0a); printf("ID=%X\r\n",ID); while(1) { } }

可以 下一步了!!!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3