Перейти к содержанию
    

STM32F4Discovery+OV7670(camera)

Доброго времени суток

OV7670 - без буфера...

Не как не получается пообщаться с камерой(OV7670). На черное/белое/зеленое/красное/синие один ответ - мусор.

Для написания кода я выбрал формат RGB565 и картинку "qcif"(176X144).

Для примера использовал это:

http://supuntharanga.blogspot.com/2014/04/...-ov7660-or.html

С регистрами

http://mbed.org/users/edodm85/code/ov7670/...a4ed/ov7670.cpp

 

Роспиновка:

PA8 - XCLK

PB8 - SDIOC

PB9 - SDIOD

РB7: VSYNC

РA4: HSYNC

РA6: PCLK

РC6: data0

РC7: data1

РC8: data2

РC9: data3

РE4: data4

РB6: data5

РE5: data6

РE6: data7

 

ВОТ САМ КОД в Keil(Р.S. Если у кого то есть готовый рабочий проект поделитесь. Буду очень благодарен. Может есть еще связь с компом будет просто восхитительно!!!):

[code]#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_i2c.h"
#include "stm32f4xx_dcmi.h"
#include "stm32f4xx_dma.h"
#include "misc.h"
#include "ov7670reg.h"

#define ONE_BYTE_REG_ADDR 0x01
#define TWO_BYTE_REG_ADDR 0x02
#define ROW 72
#define COLUMNS 80  //I got only 80 columns instead of 88 columns
#define BYTESPERPIX 2

int frame_buffer[19200]; //160*120

int frame_flag=1;

//FOR TEST LED)))
void InitTestLed()
{
GPIO_InitTypeDef gpioConf;
// ????????????? ?????, ????????????? ? ??????
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
gpioConf.GPIO_Pin = GPIO_Pin_0;
gpioConf.GPIO_Mode = GPIO_Mode_IN;
GPIO_Init(GPIOA, &gpioConf);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
// ????????????? ?????, ????????????? ? ??????????
gpioConf.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
gpioConf.GPIO_Mode = GPIO_Mode_OUT;
gpioConf.GPIO_Speed = GPIO_Speed_100MHz;
gpioConf.GPIO_OType = GPIO_OType_PP;
gpioConf.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD, &gpioConf);
}


//FOR DELAY USE STANDART FUNC
void Delay(uint32_t nCount)
{
   while(nCount--)
   {
   }
}


void SHOWIMAGE()
{   
   int WIDTH=160;
   int HEIGHT=120;
   int BYTES_PER_PIXEL =2;
   int z=0;
   int counter1=0;
   int counter2=0;
   
   for( z=0;z<ROW*COLUMNS*BYTESPERPIX/4;z++)
   {
     int i = frame_buffer[4*z+1];
      int k=frame_buffer[4*z+3];
      int ooo=10;
      if(i<70000000)
      {
       counter1++; 
     }
      else
      {
       counter2++; 
     }
      if((z+1)%40==0)
      {
   //new row
     }
   }
   if(counter1<counter2)
   {
   GPIO_SetBits(GPIOD, GPIO_Pin_13);
   }
   else
   {
  GPIO_SetBits(GPIOD, GPIO_Pin_14);
  }
      
}



//-----------------------------
//Function for camera ov7670
//-----------------------------

//PA8 - XCLK// AND TEST WORK FUNCTION!!! 
void MCO1_Init(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;
   //ENABLE CLOCK
   RCC_ClockSecuritySystemCmd(ENABLE);   
   // Enable GPIOs clocks 
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
   // Enable AS MCO
   GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_MCO);
   // Configure MCO (PA8)
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  
  GPIO_Init(GPIOA, &GPIO_InitStructure);
   //SET divider4  (100/4= 25MHz)(ua => delitel`)
    RCC_MCO1Config(RCC_MCO1Source_PLLCLK, RCC_MCO1Div_4);
}

//THIS FUCNCTION TO CONFIGURATION CAMERA(I2C)
//PB8 - SDIOC PB9 - SDIOD 
void Hardware_InitI2C(void)
{
GPIO_InitTypeDef GPIO_InitStructure; // this is for the GPIO pins used as I2C1SDA and I2C1SCL
I2C_InitTypeDef I2C_InitStructure; // this is for the I2C1 initilization

// Enable APB1 peripheral clock for I2C1
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
// Enable the peripheral clock for the pins used 
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

//Set up the I2C1SDA and I2C1SCL pins
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; // Pins 10(I2C1_SCL) and 11(I2C1_SDA)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // the pins are configured as alternate function so the USART peripheral has access to them
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;// this defines the IO speed and has nothing to do with the baudrate!
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;// this defines the output type as open drain
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;// this activates the pullup resistors on the IO pins
GPIO_Init(GPIOB, &GPIO_InitStructure);// now all the values are passed to the GPIO_Init() 

//Configurated pins to Alternative FUNCTION
GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_I2C1); 
GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_I2C1);

// Configure I2C1
  I2C_StructInit(&I2C_InitStructure);
  I2C_DeInit(I2C1);
   
   // Enable the I2C peripheral 
  I2C_Cmd(I2C1, ENABLE);
   
   //Set the I2C structure parameters 
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  I2C_InitStructure.I2C_OwnAddress1 = 0x00;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_ClockSpeed = 100000;
  // I2C Peripheral Enable 
   I2C_ITConfig(I2C1, I2C_IT_ERR, ENABLE);
  // Initialize the I2C peripheral
  I2C_Init(I2C1,&I2C_InitStructure);
  I2C_Cmd(I2C1, ENABLE);
}

//FUNCTION TO SEND DATA FOR CONFIGURATE CAMERA
int i2c_send_data(u8 slave_addr, u16 reg_addr, u8 data, u8 addr_len)
{
   int timeout = 0x7FFFFF;
   int ret = 0;
   //SEND I2C
   I2C_GenerateSTART(I2C1, ENABLE);
   while( !I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)) 
  {
   if ((timeout--) == 0) 
   {
    ret = 1;
    goto exit;
   }
  }
   I2C_Send7bitAddress(I2C1, slave_addr, I2C_Direction_Transmitter);  
  while(!(I2C1->SR1 & (1 << 1))) // check ADDR bit
  {
   if ((timeout--) == 0) 
   {
    ret = 2;
    goto exit;
   }
  }
    while(!(I2C1->SR2 & (1 << 2)))   // check TRA bit
  {
   if ((timeout--) == 0) 
   {
    ret = 3;
    goto exit;
   }
  }
   /* 2 byte reg address */
  if(addr_len == TWO_BYTE_REG_ADDR)
  {
   // MSB
   I2C_SendData(I2C1, (0xFF & (reg_addr >> 8)) );   
   while(!(I2C1->SR1 & (1 << 7)))
   {
   if ((timeout--) == 0) 
   {
    ret = 4;
    goto exit;
   }
   }
     
   // LSB
   I2C_SendData(I2C1, (0xFF & reg_addr));   
   while(!(I2C1->SR1 & (1 << 7)))
   {
   if ((timeout--) == 0) 
   {
    ret = 5;
    goto exit;
   }
   }
  
  }
  /* 1 byte reg address */
  else 
  {
   I2C_SendData(I2C1, (0xFF & reg_addr));   
   while(!(I2C1->SR1 & (1 << 7)))
   {
   if ((timeout--) == 0) 
   {
    ret = 6;
    goto exit;
   }
   } 
  }

  I2C_SendData(I2C1, data);  
  while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED))
  {
//   if ((timeout--) == 0) 
   {
    ret = 7;
    goto exit;
   }
  } 

  exit:  
  I2C_GenerateSTOP(I2C1, ENABLE);  
  return ret;
}

//FUNCTION TO RECIVE DATE FROM CAMERA
int i2c_receive_data(u8 slave_addr, u16 reg_addr, u8* data, u8 addr_len)
{
  int timeout = 0x7FFFFF;
  int ret = 0;
   /* send i2c*/
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
  I2C_GenerateSTART(I2C1, ENABLE); 
  while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT))
  {
   if ((timeout--) == 0) 
   {
    ret = 1;
    goto exit;
   }
  }
  
  I2C_Send7bitAddress(I2C1, slave_addr, I2C_Direction_Transmitter);  
  while(!(I2C1->SR1 & (1 << 1))) // check ADDR bit
  {
   if ((timeout--) == 0)    
   {
    ret = 2;
    goto exit;
   }
  }
  
  while(!(I2C1->SR2 & (1 << 2)))   // check TRA bit
  {
   if ((timeout--) == 0) 
   {
    ret = 3;
    goto exit;
   }
  }
  
  /* 2 byte reg address */
  if(addr_len == TWO_BYTE_REG_ADDR)
  {
   // MSB
   I2C_SendData(I2C1, (0xFF & (reg_addr >> 8)) );   
   while(!(I2C1->SR1 & (1 << 7))) 
   {
   if ((timeout--) == 0) 
   {
    ret = 4;
    goto exit;
   }
  }
     
   // LSB
   I2C_SendData(I2C1, (0xFF & reg_addr));   
   while(!(I2C1->SR1 & (1 << 7)))
   {
   if ((timeout--) == 0) 
   {
    ret = 5;
    goto exit;
   }
  }
  }
  
  /* 1 byte reg address */
  else 
  {
   I2C_SendData(I2C1, (0xFF & reg_addr));
   while(!(I2C1->SR1 & (1 << 7)))
   {
   if ((timeout--) == 0) 
   {
    ret = 6;
    goto exit;
   }
  }
  }

  I2C_GenerateSTOP(I2C1, ENABLE);
  I2C_GenerateSTART(I2C1, ENABLE);
  while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT))
  {
   if ((timeout--) == 0) 
   {
    ret = 7;
    goto exit;
   }
  }
  I2C_Send7bitAddress(I2C1, slave_addr, I2C_Direction_Receiver);
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) // check ADDR bit
  {
   if ((timeout--) == 0) 
   {
    ret = 8;
    goto exit;
   }
  }
    
  I2C_AcknowledgeConfig(I2C1, DISABLE);
                /* Send STOP Condition */
                I2C_GenerateSTOP(I2C1, ENABLE);
  
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))
  {
   if ((timeout--) == 0) 
   {
    ret = 10;
    goto exit;
   }
  }
  
  *data = I2C_ReceiveData(I2C1);
  I2C_AcknowledgeConfig(I2C1, ENABLE);
  return ret;
  
exit:
  I2C_GenerateSTOP(I2C1, ENABLE);
  return ret;
}

////////////////////////////////////////////////////////////////////
//FOR COMFORTING WRITE AND READ FROM CAMERA 2 FUNCTION//////////////
////////////////////////////////////////////////////////////////////
int camera_read_reg(u8 reg, u8* data)
{ 
return i2c_receive_data(0x42, (u16) reg, data, ONE_BYTE_REG_ADDR);
}
/*******************************************************************************/
int camera_write_reg(u8 reg, u8 data)
{ 
return i2c_send_data(0x43, (u16) reg, data, ONE_BYTE_REG_ADDR);
}
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////

int WriteReg(int x, int y)
{
int ret = camera_write_reg(x, y);  
if(ret < 0)
return ret;
Delay(0xFFFF);
return ret;
}

//FOR CONFIG CAMERA VERY IMPORTANT FUNCTION...DATA FROM IT IN DATASHEET
int camera_config()
{
int ret = 0;
  
//RESET
ret = WriteReg(0x12, 0x80); 
ret = WriteReg(0x12, 0x80); 
// 
ret = WriteReg(REG_RGB444, 0x00);

ret = WriteReg(REG_COM10, 0x02);  
    
ret = WriteReg(REG_MVFP, 0x27);  
     
ret = WriteReg(REG_CLKRC, 0x80);  
     
ret = WriteReg(DBLV, 0x0a);  
    
ret = WriteReg(REG_COM11, 0x0A);  
     
ret = WriteReg(REG_TSLB, 0x04);  
    
ret = WriteReg(REG_COM13, 0x88);  

//RGB565
     
ret = WriteReg(REG_COM7, 0x04);  
     
ret = WriteReg(REG_RGB444, 0x00);  
     
ret = WriteReg(REG_COM15, 0x10);  
    
ret = WriteReg(REG_COM3, 0x04);  
    
ret = WriteReg(REG_CLKRC, 0x80);  

///
     
ret = WriteReg(0x70, 0x3A);  
     
ret = WriteReg(0x71, 0x35);  
    
ret = WriteReg(0xA2, 0x02);  

// 160*120
     
ret = WriteReg(REG_COM14, 0x1a);  

ret = WriteReg(0x72, 0x22);  
     
ret = WriteReg(0x73, 0xf2);  
    
ret = WriteReg(REG_HREF, 0xa4);  
    
ret = WriteReg(REG_HSTART, 0x16);  
    
ret = WriteReg(REG_HSTOP, 0x04);  
    
ret = WriteReg(REG_VREF, 0x0a);  
     
ret = WriteReg(REG_VSTART, 0x02);  
     
ret = WriteReg(REG_VSTOP, 0x7a);  


        WriteReg(0x7a, 0x20);
        WriteReg(0x7b, 0x1c);
        WriteReg(0x7c, 0x28);
        WriteReg(0x7d, 0x3c);
        WriteReg(0x7e, 0x5a);
        WriteReg(0x7f, 0x68);
        WriteReg(0x80, 0x76);
        WriteReg(0x81, 0x80);
        WriteReg(0x82, 0x88);
        WriteReg(0x83, 0x8f);
        WriteReg(0x84, 0x96);
        WriteReg(0x85, 0xa3);
        WriteReg(0x86, 0xaf);
        WriteReg(0x87, 0xc4);
        WriteReg(0x88, 0xd7);
        WriteReg(0x89, 0xe8);
        
        WriteReg(0x13, 0xe0);
        WriteReg(0x00, 0x00);
        WriteReg(0x10, 0x00);
        WriteReg(0x0d, 0x40);
        WriteReg(0x14, 0x18);
        WriteReg(0xa5, 0x05);
        WriteReg(0xab, 0x07);
        WriteReg(0x24, 0x95);
        WriteReg(0x25, 0x33);
        WriteReg(0x26, 0xe3);
        WriteReg(0x9f, 0x78);
        WriteReg(0xa0, 0x68);
        WriteReg(0xa1, 0x03);
        WriteReg(0xa6, 0xd8);
        WriteReg(0xa7, 0xd8);
        WriteReg(0xa8, 0xf0);
        WriteReg(0xa9, 0x90);
        WriteReg(0xaa, 0x94);
        WriteReg(0x13, 0xe5);
        
        WriteReg(0x0e, 0x61);
        WriteReg(0x0f, 0x4b);
        WriteReg(0x16, 0x02);

        WriteReg(0x21, 0x02);
        WriteReg(0x22, 0x91);
        WriteReg(0x29, 0x07);
        WriteReg(0x33, 0x0b);
        WriteReg(0x35, 0x0b);
        WriteReg(0x37, 0x1d);
        WriteReg(0x38, 0x71);
        WriteReg(0x39, 0x2a);
        WriteReg(0x3c, 0x78);
        WriteReg(0x4d, 0x40);
        WriteReg(0x4e, 0x20);
        WriteReg(0x69, 0x00);

        WriteReg(0x74, 0x10);
        WriteReg(0x8d, 0x4f);
        WriteReg(0x8e, 0x00);
        WriteReg(0x8f, 0x00);
        WriteReg(0x90, 0x00);
        WriteReg(0x91, 0x00);
        WriteReg(0x92, 0x00);

        WriteReg(0x96, 0x00);
        WriteReg(0x9a, 0x80);
        WriteReg(0xb0, 0x84);
        WriteReg(0xb1, 0x0c);
        WriteReg(0xb2, 0x0e);
        WriteReg(0xb3, 0x82);
        WriteReg(0xb8, 0x0a);
        
        WriteReg(0x43, 0x0a);
        WriteReg(0x44, 0xf0);
        WriteReg(0x45, 0x34);
        WriteReg(0x46, 0x58);
        WriteReg(0x47, 0x28);
        WriteReg(0x48, 0x3a);
        WriteReg(0x59, 0x88);
        WriteReg(0x5a, 0x88);
        WriteReg(0x5b, 0x44);
        WriteReg(0x5c, 0x67);
        WriteReg(0x5d, 0x49);
        WriteReg(0x5e, 0x0e);
        WriteReg(0x64, 0x04);
        WriteReg(0x65, 0x20);
        WriteReg(0x66, 0x05);
        WriteReg(0x94, 0x04);
        WriteReg(0x95, 0x08);

        WriteReg(0x6c, 0x0a);
        WriteReg(0x6d, 0x55);
        WriteReg(0x6e, 0x11);
        WriteReg(0x6f, 0x9f);
        WriteReg(0x6a, 0x40);
        WriteReg(0x01, 0x40);
        WriteReg(0x02, 0x40);
        WriteReg(0x13, 0xe7);
        WriteReg(0x15, 0x02);

        WriteReg(0x4f, 0x80);
        WriteReg(0x50, 0x80);
        WriteReg(0x51, 0x00);
        WriteReg(0x52, 0x22);
        WriteReg(0x53, 0x5e);
        WriteReg(0x54, 0x80);
        WriteReg(0x58, 0x9e);
        
        WriteReg(0x41, 0x08);
        WriteReg(0x3f, 0x00);
        WriteReg(0x75, 0x05);
        WriteReg(0x76, 0xe1);
        WriteReg(0x4c, 0x00);
        WriteReg(0x77, 0x01);
        WriteReg(0x3d, 0xc1);
        WriteReg(0x4b, 0x09);
        WriteReg(0xc9, 0x60);
        WriteReg(0x41, 0x38);
        WriteReg(0x56, 0x40);
        
        WriteReg(0x34, 0x11);
        WriteReg(0x3b, 0x02);
        WriteReg(0xa4, 0x88);
        WriteReg(0x96, 0x00);
        WriteReg(0x97, 0x30);
        WriteReg(0x98, 0x20);
        WriteReg(0x99, 0x30);
        WriteReg(0x9a, 0x84);
        WriteReg(0x9b, 0x29);
        WriteReg(0x9c, 0x03);
        WriteReg(0x9d, 0x4c);
        WriteReg(0x9e, 0x3f);
        WriteReg(0x78, 0x04);
        
        WriteReg(0x79, 0x01);
        WriteReg(0xc8, 0xf0);
        WriteReg(0x79, 0x0f);
        WriteReg(0xc8, 0x00);
        WriteReg(0x79, 0x10);
        WriteReg(0xc8, 0x7e);
        WriteReg(0x79, 0x0a);
        WriteReg(0xc8, 0x80);
        WriteReg(0x79, 0x0b);
        WriteReg(0xc8, 0x01);
        WriteReg(0x79, 0x0c);
        WriteReg(0xc8, 0x0f);
        WriteReg(0x79, 0x0d);
        WriteReg(0xc8, 0x20);
        WriteReg(0x79, 0x09);
        WriteReg(0xc8, 0x80);
        WriteReg(0x79, 0x02);
        WriteReg(0xc8, 0xc0);
        WriteReg(0x79, 0x03);
        WriteReg(0xc8, 0x40);
        WriteReg(0x79, 0x05);
        WriteReg(0xc8, 0x30);
        WriteReg(0x79, 0x26);
        WriteReg(0x09, 0x03);
        WriteReg(0x3b, 0x42);
        
        WriteReg(0xff, 0xff);   /* END MARKER */ 


return ret;  
}

//////////////////////////////////
//////////////////////////////////
//OTHER CONNECT   
      /* B7: VSYNC*/
    /* A4: HSYNC*/
    /* A6: PCLK*/
    /* C6: data0*/
    /* C7: data1*/
    /* C8: data2*/ 
    /* C9: data3*/
    /* E4: data4*/
    /* B6: data5*/
    /* E5: data6*/
    /* E6: data7*/
///////////////////////////////////
void DCMI_Configure(void)
{
  DCMI_InitTypeDef DCMI_InitStructure;
  DMA_InitTypeDef  DMA_InitStructure; 
  NVIC_InitTypeDef NVIC_InitStructure;
   GPIO_InitTypeDef GPIO_InitStructure; 
  /* GPIOD Periph clock enable */
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI, ENABLE);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);

  /* Configure PD12, PD13, PD14 and PD15 in output pushpull mode */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

   /* B7: VSYNC*/
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_DCMI);
    /* A4: HSYNC*/
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_DCMI);
    /* A6: PCLK*/
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_DCMI);
    /* C6: data0*/
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_DCMI);
    /* C7: data1*/
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_DCMI);
    /* C8: data2*/  
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_DCMI);
    /* C9: data3*/ 
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_DCMI);
    /* E4: data4*/
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource4, GPIO_AF_DCMI);
    /* B6: data5*/
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_DCMI);
    /* E5: data6*/
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource5, GPIO_AF_DCMI);
    /* E6: data7*/
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource6, GPIO_AF_DCMI);
/* DCMI GPIO configuration */

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOE, &GPIO_InitStructure);


      /* DCMI configuration */
   
      DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_SnapShot;  
      DCMI_InitStructure.DCMI_ExtendedDataMode = DCMI_ExtendedDataMode_8b; 
      DCMI_InitStructure.DCMI_CaptureRate = DCMI_CaptureRate_All_Frame;   
      DCMI_InitStructure.DCMI_VSPolarity = DCMI_VSPolarity_High;    
      DCMI_InitStructure.DCMI_HSPolarity = DCMI_HSPolarity_Low;           
      DCMI_InitStructure.DCMI_PCKPolarity = DCMI_PCKPolarity_Rising;       
      DCMI_InitStructure.DCMI_SynchroMode = DCMI_SynchroMode_Hardware;     
      
     
                                                                             
      DCMI_Init(&DCMI_InitStructure);

     
     //DCMI_ITConfig(DCMI_IT_VSYNC, ENABLE);
     //DCMI_ITConfig(DCMI_IT_LINE, ENABLE);
     //DCMI_ITConfig(DCMI_IT_FRAME, ENABLE);
     //DCMI_ITConfig(DCMI_IT_OVF, ENABLE);
     //DCMI_ITConfig(DCMI_IT_ERR, ENABLE);
   


      /* Configures the DMA2 to transfer Data from DCMI */

      /* DMA2 Stream1 Configuration */
      DMA_DeInit(DMA2_Stream1);
  
      DMA_StructInit(&DMA_InitStructure);
  
      DMA_InitStructure.DMA_Channel = DMA_Channel_1;
      DMA_InitStructure.DMA_PeripheralBaseAddr =  (uint32_t)(&DCMI->DR);
      DMA_InitStructure.DMA_Memory0BaseAddr =  (uint32_t)frame_buffer;
      DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
      DMA_InitStructure.DMA_BufferSize = ROW*COLUMNS*BYTESPERPIX/4;/* size of image in bytes/4 */     
         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
      DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
      DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
      DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
      DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
      DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
      DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
      DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
      DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
      DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
      DMA_Init(DMA2_Stream1, &DMA_InitStructure);
      DMA_ITConfig(DMA2_Stream1, DMA_IT_TC, ENABLE);
      DMA_ITConfig(DMA2_Stream1, DMA_IT_TE, ENABLE);
   
      /* DMA2 IRQ channel Configuration */
      
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
   
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = DCMI_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
   
DMA_Cmd(DMA2_Stream1, ENABLE);
   
DCMI_Cmd(ENABLE);
DCMI_CaptureCmd(ENABLE);
}

void DMA2_Stream1_IRQHandler(void)
{
static  int K;
  //Test on DMA2 Channel1 Transfer Complete interrupt
  if(DMA_GetITStatus(DMA2_Stream1,DMA_IT_TCIF1) ==  SET)
  {
  frame_flag = 1;//when frame_flag =1,all the data will be send through serial port in main function while loop
    DMA_ClearITPendingBit(DMA2_Stream1,DMA_IT_TCIF1);
  }
  if(DMA_GetITStatus(DMA2_Stream1,DMA_IT_TEIF1) ==  SET)
  {  
    DMA_ClearITPendingBit(DMA2_Stream1,DMA_IT_TEIF1);
  } 
}

void DCMI_IRQHandler(void)
{
static volatile int line,col,i,j = 0;
    if(DCMI_GetFlagStatus(DCMI_FLAG_FRAMERI) == SET)
    {
   DCMI_ClearFlag(DCMI_FLAG_FRAMERI);   
    }
   if(DCMI_GetFlagStatus(DCMI_FLAG_OVFRI) == SET)
    {
   DCMI_ClearFlag(DCMI_FLAG_OVFRI);   
    }
}

int main(void)
{
   MCO1_Init();
   Hardware_InitI2C(); 
   camera_config();
   DCMI_Configure();
   
  while (1)
  {
  if( frame_flag == 1)
  {
    SHOWIMAGE();
    frame_flag = 0;
  }   
  }
}

[/code]

Изменено пользователем slavaSTM32F4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обязательно вечером посмотрю :rolleyes:

)))

С китайского пудна есть какой-то пример, может, пригодится....

DCMI_OV7670.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Р.S. Если у кого то есть готовый рабочий проект поделитесь. Буду очень благодарен.

Ну, вот как бы рабочий код. Правда синхронизация по кадрам пока не в порядке. А то что, на ATmega48 состряпано, так перевести на АРМ, я думаю, труда не составит. Сам планирую такое сделать, когда до ума на АВР-е доведу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...