关于OV7670摄像头检测不到VSYNC信号

2019-07-15 22:23发布

本帖最后由 吴伟镖 于 2013-9-25 09:57 编辑

先上传代码,这是我用OV7670摄像头+野火开发板的液晶显示屏做的移植但发现VSYNC检测不到信号,导致进入不到中断,我检测了摄像头初始化正常的,我中断函数写的也是正常的。请教各位大神什么问题呢
//主函数

#include "STM32f10x.h"
#include "lcd_botton.h"
#include "fifo.h"
#include "sensor.h"
#include "Systick.h"
unsigned char i;
static volatile ErrorStatus HSEStartUpStatus = SUCCESS;
static vu32 TimingDelay = 0;
static vu32 SELStatus = 0;
extern unsigned int  a, bn,c_data;
unsigned int  kkk=0,s=0;
unsigned int M=0,N=0;
int main (void)
{
        SystemInit();
        SysTick_Init();
        LCD_Init();
        FIFO_Set_GPIO_Config();
        FIFO_GPIO_INPUT();
        FIFO_CS_L();//准备读数据
  FIFO_WE_H();
        while(1!=Sensor_init()){}//初始化CMOS Sensor
        LCD_open_windows(0, 0, 320, 240);
        bn=0;
        ////////////////////////////////////////
  FIFO_RRST_L();
  FIFO_RD_L();
  FIFO_RD_H();
  FIFO_RD_L();
  FIFO_RRST_H();
  FIFO_RD_H();
  Delay_us(5000);
////////////////////////////////////////
  while(1)
  {

    if(bn==2)
    {

        FIFO_RRST_L();
        FIFO_RD_L();
        FIFO_RD_H();
        FIFO_RD_L();
        FIFO_RRST_H();
        FIFO_RD_H();
        for(a=0;a<9600;a++)
        {

             FIFO_RD_L();
             c_data=GPIOB->IDR&0xff00;//读高位
             FIFO_RD_H();
             FIFO_RD_L();
             c_data|=(GPIOB->IDR>>8)&0x00ff;//读低位
             FIFO_RD_H();  
            // LCD_WriteRAM(c_data);//写RGB数据到TFT GRAM
             LCD_WR_Data(c_data);

             FIFO_RD_L();
             c_data=GPIOB->IDR&0xff00;//读高位
             FIFO_RD_H();
             FIFO_RD_L();
             c_data|=(GPIOB->IDR>>8)&0x00ff;//读低位
             FIFO_RD_H();  
            // LCD_WriteRAM(c_data);//写RGB数据到TFT GRAM
           LCD_WR_Data(c_data);

             FIFO_RD_L();
             c_data=GPIOB->IDR&0xff00;//读高位
             FIFO_RD_H();
             FIFO_RD_L();
             c_data|=(GPIOB->IDR>>8)&0x00ff;//读低位
             FIFO_RD_H();  
            // LCD_WriteRAM(c_data);//写RGB数据到TFT GRAM
              LCD_WR_Data(c_data);

             FIFO_RD_L();
             c_data=GPIOB->IDR&0xff00;//读高位
             FIFO_RD_H();
             FIFO_RD_L();
             c_data|=(GPIOB->IDR>>8)&0x00ff;//读低位
             FIFO_RD_H();  
            // LCD_WriteRAM(c_data);//写RGB数据到TFT GRAM
              LCD_WR_Data(c_data);

             FIFO_RD_L();
             c_data=GPIOB->IDR&0xff00;//读高位
             FIFO_RD_H();
             FIFO_RD_L();
             c_data|=(GPIOB->IDR>>8)&0x00ff;//读低位
             FIFO_RD_H();  
            // LCD_WriteRAM(c_data);//写RGB数据到TFT GRAM
             LCD_WR_Data(c_data);

             FIFO_RD_L();
             c_data=GPIOB->IDR&0xff00;//读高位
             FIFO_RD_H();
             FIFO_RD_L();
             c_data|=(GPIOB->IDR>>8)&0x00ff;//读低位
             FIFO_RD_H();  
            // LCD_WriteRAM(c_data);//写RGB数据到TFT GRAM
             LCD_WR_Data(c_data);

             FIFO_RD_L();
             c_data=GPIOB->IDR&0xff00;//读高位
             FIFO_RD_H();
             FIFO_RD_L();
             c_data|=(GPIOB->IDR>>8)&0x00ff;//读低位
             FIFO_RD_H();  
            // LCD_WriteRAM(c_data);//写RGB数据到TFT GRAM
             LCD_WR_Data(c_data);

             FIFO_RD_L(); ;
             c_data=GPIOB->IDR&0xff00;//读高位
             FIFO_RD_H();
             FIFO_RD_L();
             c_data|=(GPIOB->IDR>>8)&0x00ff;//读低位
             FIFO_RD_H();  
            // LCD_WriteRAM(c_data);//写RGB数据到TFT GRAM
              LCD_WR_Data(c_data);

         }
         bn=0;
       }
     }
}
////////////////////////////////////////////////////////////////////////sensor。c/////////////////////////////////////////////////////

#include "sensor.h"
#include "sensor_confi.h"
/////////////////////////////
//VSYNC GPIO INIT
//guanfu_wang
void Sensor_GPIO_Init(void)//
{

  GPIO_InitTypeDef GPIO_InitStructure;
   // Enable GPIOC  clock
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  Sensor_VSYNC_BIT;
  GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IN_FLOATING;////浮空
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
}

//////////////////////////////////////////////////
////函数功能:中断配制
//guanfu_wang

void Sensor_Interrupts_Config(void)//VSYNC 中断
{
  NVIC_InitTypeDef NVIC_InitStructure;
  /* Configure one bit for preemption priority */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    /* Configure one bit for preemption priority */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  /* Enable the EXTI9_5 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);




}
////////////////////////////////////////////////////////////////////////
void Sensor_EXTI_Config(void)//VSYNC 中断
{
  EXTI_InitTypeDef EXTI_InitStructure;


  GPIO_EXTILineConfig(GPIO_PORT_SOURCE_VSYNC_CMOS, GPIO_PIN_SOURCE_VSYNC_CMOS);
  EXTI_InitStructure.EXTI_Line = EXTI_LINE_VSYNC_CMOS;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
  EXTI_GenerateSWInterrupt(EXTI_LINE_VSYNC_CMOS);

}


///////////////////////////////////////////////////////////////////////////
//功能:写OV7660寄存器
//返回:1-成功        0-失败
//guanfu_wang
unsigned char wr_Sensor_Reg(unsigned char regID, unsigned char regDat)
{
                startSCCB();//发送SCCB 总线开始传输命令
        if(0==SCCBwriteByte(0x42))//写地址
        {
                stopSCCB();//发送SCCB 总线停止传输命令
                return(0);//错误返回
        }
        Delay_us(20);
          if(0==SCCBwriteByte(regID))//积存器ID
        {
                stopSCCB();//发送SCCB 总线停止传输命令
                return(0);//错误返回
        }
        Delay_us(20);
          if(0==SCCBwriteByte(regDat))//写数据到积存器
        {
                stopSCCB();//发送SCCB 总线停止传输命令
                return(0);//错误返回
        }
          stopSCCB();//发送SCCB 总线停止传输命令
       
          return(1);//成功返回
}
////////////////////////////
//功能:读OV7660寄存器
//返回:1-成功        0-失败
//guanfu_wang
unsigned char rd_Sensor_Reg(unsigned char regID, unsigned char *regDat)
{
        //通过写操作设置寄存器地址
        startSCCB();
        if(0==SCCBwriteByte(0x42))//写地址
        {
                stopSCCB();//发送SCCB 总线停止传输命令
                return(0);//错误返回
        }
        Delay_us(20);
          if(0==SCCBwriteByte(regID))//积存器ID
        {
                stopSCCB();//发送SCCB 总线停止传输命令
                return(0);//错误返回
        }
        stopSCCB();//发送SCCB 总线停止传输命令
       
        Delay_us(20);
       
        //设置寄存器地址后,才是读
        startSCCB();
        if(0==SCCBwriteByte(0x43))//读地址
        {
                stopSCCB();//发送SCCB 总线停止传输命令
                return(0);//错误返回
        }
        Delay_us(20);
          *regDat=SCCBreadByte();//返回读到的值
          noAck();//发送NACK命令
          stopSCCB();//发送SCCB 总线停止传输命令
          return(1);//成功返回
}




/* Sensor_init() */
//返回1成功,返回0失败
//guanfu_wang
unsigned char Sensor_init(void)
{
        unsigned char temp;
       
        unsigned int i=0;
    //     XCLK_init_ON();//开启MCO功能 提供时钟给CMOS传感器
        //uchar ovidmsb=0,ovidlsb=0;
        Sensor_GPIO_Init();
        SCCB_GPIO_Config();//io init..

        temp=0x80;
        if(0==wr_Sensor_Reg(0x12, temp)) //Reset SCCB
        {
               
          return 0 ;//错误返回
               
        }
        Delay_us(10000);
        if(0==rd_Sensor_Reg(0x0b, &temp))//读ID
        {
                return 0 ;//错误返回
        }

         if(temp==0x73)//OV7670
         {
           for(i=0;i<OV7670_REG_NUM;i++)
           {
                if( 0==wr_Sensor_Reg(OV7670_reg[0],OV7670_reg[1]))
                {
                        return 0;//错误返回
                }
            }

   Sensor_EXTI_Config();
        Sensor_Interrupts_Config();
        }

        return 0x01; //ok


}
////////////////////////////////SCCB文件//////////////////////////////////////////////////////////////

#include "sccb.h"
/*
-----------------------------------------------
   功能: 初始化模拟SCCB接口
   参数: 无
返回值: 无
-----------------------------------------------
*/
void SCCB_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
   /* Enable GPIOC  clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  SCCB_SIC_BIT|SCCB_SID_BIT;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

}
void SCCB_SID_GPIO_OUTPUT(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
   /* Enable GPIOC  clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  SCCB_SID_BIT;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
}
void SCCB_SID_GPIO_INPUT(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
   /* Enable GPIOC  clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  SCCB_SID_BIT;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉 若无外部上拉电阻 必须内部有上拉
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
}

/*
-----------------------------------------------
   功能: start命令,SCCB的起始信号
   参数: 无
返回值: 无
-----------------------------------------------
*/
void startSCCB(void)
{
    SCCB_SID_H();     //数据线高电平
    Delay_us(50);

    SCCB_SIC_H();           //在时钟线高的时候数据线由高至低
    Delay_us(50);

    SCCB_SID_L();
    Delay_us(50);

    SCCB_SIC_L();         //数据线恢复低电平,单操作函数必要
    Delay_us(50);


}
/*
-----------------------------------------------
   功能: stop命令,SCCB的停止信号
   参数: 无
返回值: 无
-----------------------------------------------
*/
void stopSCCB(void)
{
    SCCB_SID_L();
    Delay_us(50);

    SCCB_SIC_H();       
    Delay_us(50);


    SCCB_SID_H();       
    Delay_us(50);

}

/*
-----------------------------------------------
   功能: noAck,用于连续读取中的最后一个结束周期
   参数: 无
返回值: 无
-----------------------------------------------
*/
void noAck(void)
{
       
        SCCB_SID_H();       
        Delay_us(50);
       
        SCCB_SIC_H();       
        Delay_us(50);
       
        SCCB_SIC_L();       
        Delay_us(50);
       
        SCCB_SID_L();       
        Delay_us(50);

}

/*
-----------------------------------------------
   功能: 写入一个字节的数据到SCCB
   参数: 写入数据
返回值: 发送成功返回1,发送失败返回0
-----------------------------------------------
*/
unsigned char SCCBwriteByte(unsigned char m_data)
{
        unsigned char j,tem;

        for(j=0;j<8;j++) //循环8次发送数据
        {
                if((m_data<<j)&0x80)
                {
                        SCCB_SID_H();       
                }
                else
                {
                        SCCB_SID_L();       
                }
                Delay_us(50);
                SCCB_SIC_H();       
                Delay_us(50);
                SCCB_SIC_L();       
                Delay_us(2);

        }
        //Delay_us(50);
        SCCB_SID_IN;/*设置SDA为输入*/
        Delay_us(10);
        SCCB_SIC_H();       
        Delay_us(80);
        if(SCCB_SID_STATE){tem=0;}   //SDA=1发送失败,返回0}
        else {tem=1;}   //SDA=0发送成功,返回1
        SCCB_SIC_L();       
        Delay_us(50);       
        SCCB_SID_OUT;/*设置SDA为输出*/

        return (tem);  
}

/*
-----------------------------------------------
   功能: 一个字节数据读取并且返回
   参数: 无
返回值: 读取到的数据
-----------------------------------------------
*/
unsigned char SCCBreadByte(void)
{
        unsigned char read,j;
        read=0x00;
       
        SCCB_SID_IN;/*设置SDA为输入*/
        Delay_us(50);
        for(j=8;j>0;j--) //循环8次接收数据
        {                     
                //Delay_us(100);
                SCCB_SIC_H();
                Delay_us(50);
                read=read<<1;
                if(SCCB_SID_STATE)
                {
                        read=read+1;
                }
                SCCB_SIC_L();
                Delay_us(50);
        }       
        SCCB_SID_OUT;/*设置SDA为输出*/
        return(read);
}
//////////////////////////中断函数、、、、、、、、、、、、、、、、、、、、、
#include "stm32f10x_it.h"
#include "SysTick.h"
#include "sensor.h"
#include "fifo.h"
unsigned int  bn=0,c=0,a=0,c_data=0;

void EXTI3_IRQHandler(void)
{
     if(EXTI_GetITStatus(EXTI_LINE_VSYNC_CMOS) != RESET)
     {  
       if(bn==0)
       {  
                                  bn=1;
            FIFO_WE_H();        //拉高使FIFO写允许
     //   FIFO_WE_H();

        FIFO_WE_H();

       }
       else if(bn==1)
       {
          FIFO_WE_L();
          bn=2;
       }
       EXTI_ClearITPendingBit(EXTI_LINE_VSYNC_CMOS);
     }


}

void SysTick_Handler(void)
{

        TimingDelay_Decrement();       
}




OV7670(3.2TFT).zip 下载积分: 积分 -1 分
4.86 MB, 下载次数: 61, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。