stmf407 + ov7670

2019-07-21 03:54发布

手里有探索者开发板和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;
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。