手里有探索者开发板和ov7670摄像头,目的是制作一个照相机。ov7670是没有fifo和晶振。
在对ov7670初始化时,写寄存器没问题(因为返回值正常),但是在读寄存器时,总是卡在写读取命令(打印printf("
step-02
");),截图上传。
部分代码:
unsigned char bsp_sccbWrReg(unsigned char reg, unsigned char dat)
{
bsp_sccbStart();
if(bsp_sccbWrByte(SCCB_ID))
{
bsp_sccbStop();
return (1);
}
bsp_delayUs(100); //100us
if(bsp_sccbWrByte(reg))
{
bsp_sccbStop();
return (1);
}
bsp_delayUs(100); //100us
if(bsp_sccbWrByte(dat))
{
bsp_sccbStop();
return (1);
}
bsp_sccbStop();
return (0);
}
unsigned char bsp_sccbRdReg(unsigned char reg, unsigned char *val)
{
bsp_sccbStart();
if(bsp_sccbWrByte(SCCB_ID))
{
bsp_sccbStop();
printf("
step-00
");
return (1);
}
bsp_delayUs(100); //100us
if(bsp_sccbWrByte(reg))
{
bsp_sccbStop();
printf("
step-01
");
return (1);
}
bsp_sccbStop();
bsp_delayUs(50); //100us
bsp_sccbStart();
if(bsp_sccbWrByte(SCCB_ID | 0x01))
{
bsp_sccbStop();
printf("
step-02
");
return (1);
}
bsp_delayUs(100); //100us
*val = bsp_sccbRdByte();
bsp_sccbNoAck();
bsp_sccbStop();
return (0);
}
uint8_t bsp_ov7670Init(void)
{
uint8_t ucDatH = 0, ucDatL = 0;
uint16_t usManuID = 0, usProdID = 0;
uint16_t i = 0;
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOG_CLK_ENABLE();
/*Configure GPIO pins */
GPIO_InitStruct.Pin = OV7670_PWDN_Pin | OV7670_RST_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
ov7670_XCLK_ON(); //提供XCLK
OV7670_PWDN(0); //正常工作模式
bsp_delayMs(10);
OV7670_RST(0); //硬件复位OV7670
bsp_delayMs(10);
OV7670_RST(1); //结束复位
bsp_sccbInit();
//bsp_sccbWrReg(OV7670_SENSOR_COM7, 0x80); //软复位
if(bsp_sccbWrReg(OV7670_SENSOR_COM7, 0x80))
{
printf("
Software reset fault.
");
return(1);
}
bsp_delayMs(50);
if(bsp_sccbRdReg(OV7670_SENSOR_MIDH, &ucDatH))//读取厂家ID 高八位
{
printf("
Get MID_H fault.
");
return(1);
}
if(bsp_sccbRdReg(OV7670_SENSOR_MIDL, &ucDatL))//读取厂家ID 低八位
{
printf("
Get MID_L fault.
");
return(1);
}
usManuID = ucDatH;
usManuID = (usManuID << 8) | ucDatL;
if(usManuID != OV7670_MID)
{
printf("
MID: %x
", usManuID);
return(2);
}
if(bsp_sccbRdReg(OV7670_SENSOR_PID, &ucDatH))//读取产品ID 高八位
{
return(3);
}
if(bsp_sccbRdReg(OV7670_SENSOR_VER, &ucDatL))//读取产品ID 低八位
{
return(3);
}
usProdID = ucDatH;
usProdID = (usProdID << 8) | ucDatL;
if(usProdID != OV7670_HID)
{
printf("
HID: %x
", usProdID);
return(4);
}
/* 初始化OV7670各个寄存器 */
for(i = 0; i < sizeof(ov7670_sxga_init_reg_tbl)/2; i++)
{
bsp_sccbWrReg(ov7670_sxga_init_reg_tbl[i][0], ov7670_sxga_init_reg_tbl[i][1]);
}
return 0;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>