OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11842|回复: 9

粗大事了 失足青年深陷STM32F407VG驱动OV7670在TFT上显示问题

[复制链接]

21

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2014-11-11
在线时间
161 小时
发表于 2014-11-28 20:56:08 | 显示全部楼层 |阅读模式
5金钱
请教原子哥  先上程序
这是OV7670的初始化部分  (感觉不对)
u8 OV7670_Init(void)
{
  u8 temp;
u16 i = 0;
My_DCMI_Init();      //初始化DCMI
SCCB_Init();             //初始化SCCB

if(SCCB_WR_Reg(0x12,0x80))  return 1;       //复位SCCB
delay_ms(50);

//读取产品ID
temp = SCCB_RD_Reg(0x0b);
if(temp != 0x73)  return 2;
temp = SCCB_RD_Reg(0x0a);
if(temp != 0x76)  return 2;

//初始化序列
for(i=0;i<sizeof(ov7670_init_reg_tbl)/sizeof(ov7670_init_reg_tbl[0])/2;i++)
{
 SCCB_WR_Reg(ov7670_init_reg_tbl[0],ov7670_init_reg_tbl[1]);
delay_ms(2);
}
  return 0x00;    //OK
}

//设置窗口大小
void OV7670_Window_Set(u16 sx,u16 sy,u16 width,u16 height)
{
u16 endx;
u16 endy;
u8 temp; 
endx=sx+width*2; //V*2
  endy=sy+height*2;
if(endy>784)endy-=784;
temp=SCCB_RD_Reg(0X03); //读取Vref之前的值
temp&=0XF0;
temp|=((endx&0X03)<<2)|(sx&0X03);
SCCB_WR_Reg(0X03,temp); //设置Vref的start和end的最低2位
SCCB_WR_Reg(0X19,sx>>2); //设置Vref的start高8位
SCCB_WR_Reg(0X1A,endx>>2); //设置Vref的end的高8位

temp=SCCB_RD_Reg(0X32); //读取Href之前的值
temp&=0XC0;
temp|=((endy&0X07)<<3)|(sy&0X07);
SCCB_WR_Reg(0X17,sy>>3); //设置Href的start高8位
SCCB_WR_Reg(0X18,endy>>3); //设置Href的end的高8位
}

最佳答案

查看完整内容[请看2#楼]

检测一下硬件,看看供电、晶振有没有正常工作先吧,有些模块没有带晶振,就需要外接时钟才能正常工作
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

102

帖子

1

精华

高级会员

Rank: 4

积分
991
金钱
991
注册时间
2014-11-19
在线时间
357 小时
发表于 2014-11-28 20:56:09 | 显示全部楼层
检测一下硬件,看看供电、晶振有没有正常工作先吧,有些模块没有带晶振,就需要外接时钟才能正常工作
专注一件事情并做到极致>>> https://shop275468129.taobao.com
回复

使用道具 举报

21

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2014-11-11
在线时间
161 小时
 楼主| 发表于 2014-11-28 20:57:11 | 显示全部楼层
这是DCMI及DMA的配置
void DCMI_DMA_Init(u32 DMA_Memory0BaseAddr,u16 DMA_BufferSize,u32 DMA_MemoryDataSize,u32 DMA_MemoryInc)

DMA_InitTypeDef  DMA_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2时钟使能 
DMA_DeInit(DMA2_Stream1);
while (DMA_GetCmdStatus(DMA2_Stream1) != DISABLE){}//等待DMA2_Stream1可配置 

  /* 配置 DMA Stream */
  DMA_InitStructure.DMA_Channel = DMA_Channel_1;  //通道1 DCMI通道 
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&DCMI->DR;//外设地址为CMI->DR
  DMA_InitStructure.DMA_Memory0BaseAddr = DMA_Memory0BaseAddr;//DMA 存储器0地址
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//外设到存储器模式
  DMA_InitStructure.DMA_BufferSize = DMA_BufferSize;//数据传输量 
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc;//存储器增量模式
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//外设数据长度:32位
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize;//存储器数据长度 
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// 使用循环模式 
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;//高优先级
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable; //FIFO模式        
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;//使用全FIFO 
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//外设突发单次传输
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//存储器突发单次传输
  DMA_Init(DMA2_Stream1, &DMA_InitStructure);//初始化DMA Stream


//DCMI初始化
void My_DCMI_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
DCMI_InitTypeDef DCMI_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB |
                      RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOE,ENABLE);  //使能DCMI的GPIO时钟

/********DCMI GPIO 配置*************************************
PC6 -> D0
PC7 -> D1
PE0 -> D2
PE1 -> D3
PE4 -> D4
PB6 -> D5
PB8 -> D6
PB9 -> D7
PA6 -> PCK 像素时钟
PA4 -> HSYNC 行同步
PB7 -> VSYNC 场同步
PB11 -> SIOD
PB10 -> SIOC
//DCMI->AF13
***********************************************************/
GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_DCMI);//HSYNC 行同步
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_DCMI);//PCLK  像素时钟

GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_DCMI);//D0
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_DCMI);//D1


  GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_DCMI);//D5
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_DCMI);//VSYNC场同步
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_DCMI);//D6
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_DCMI);//D7

GPIO_PinAFConfig(GPIOE, GPIO_PinSource0, GPIO_AF_DCMI);//D2
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource1, GPIO_AF_DCMI);//D3
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource4, GPIO_AF_DCMI);//D4

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_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4;
  GPIO_Init(GPIOE, &GPIO_InitStructure);

/* PCLK(PA6) */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;  //初始化像素时钟
  GPIO_Init(GPIOA, &GPIO_InitStructure);
//DCMI 初始化
DCMI_DeInit();//清除原来的设置
DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_Continuous;//连续模式
  DCMI_InitStructure.DCMI_SynchroMode = DCMI_SynchroMode_Hardware;//硬件同步
  DCMI_InitStructure.DCMI_PCKPolarity = DCMI_PCKPolarity_Falling;//PCLK 下降沿有效
  DCMI_InitStructure.DCMI_VSPolarity = DCMI_VSPolarity_High;      //VSYNC高电平有效
  DCMI_InitStructure.DCMI_HSPolarity = DCMI_HSPolarity_High;      //HSYNC低电平有效
  DCMI_InitStructure.DCMI_CaptureRate = DCMI_CaptureRate_All_Frame;  //全帧捕获
  DCMI_InitStructure.DCMI_ExtendedDataMode = DCMI_ExtendedDataMode_8b; //8位格式
  DCMI_Init(&DCMI_InitStructure);

DCMI_ITConfig(DCMI_IT_FRAME,ENABLE);//开启帧中断 

DCMI_Cmd(ENABLE); //DCMI使能

  NVIC_InitStructure.NVIC_IRQChannel = DCMI_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority =2; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、
 

//DCMI,启动传输
void DCMI_Start(void)
{  
  LCD_SetCursor(0,0);  
LCD_WriteRAM_Prepare(); //开始写入GRAM
DMA_Cmd(DMA2_Stream1, ENABLE);//开启DMA2,Stream1 
DCMI_CaptureCmd(ENABLE);//DCMI捕获使能  
}
//DCMI,关闭传输
void DCMI_Stop(void)

  DCMI_CaptureCmd(DISABLE);//DCMI捕获使关闭

while(DCMI->CR&0X01); //等待传输结束 

DMA_Cmd(DMA2_Stream1,DISABLE);//关闭DMA2,Stream1

回复

使用道具 举报

21

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2014-11-11
在线时间
161 小时
 楼主| 发表于 2014-11-28 20:58:50 | 显示全部楼层
回复【2楼】刺客mfl:
---------------------------------
这是SCCB的配置  只是初始化部分  其余的与原子哥的一样
void SCCB_Init(void)
{    
 
  GPIO_InitTypeDef  GPIO_InitStructure;
 

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);   //使能PB端口时钟

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;  // 端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //SCCB_SIDE3
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);  // 输出高

SCCB_SDA_OUT();    
}
对应SCCB.H的配置
#define SCCB_SDA_IN()  {GPIOB->MODER&=~(3<<(11*2));GPIOB->MODER|=0<<2*11;}    //PB11输入
#define SCCB_SDA_OUT() {GPIOB->MODER&=~(3<<(11*2));GPIOB->MODER|=1<<2*11;}    //PB11输出

//IO操作函数  
#define SCCB_SCL     PBout(10)   //SCL
#define SCCB_SDA     PBout(11)  //SDA  

#define SCCB_READ_SDA     PBin(11)   //输入SDA    
#define SCCB_ID    0X42   //OV7670的ID
回复

使用道具 举报

21

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2014-11-11
在线时间
161 小时
 楼主| 发表于 2014-11-28 20:59:22 | 显示全部楼层
回复【3楼】刺客mfl:
---------------------------------
主函数

int main()
{
delay_init(168);
uart_init(115200);
  LED_Init();
LCD_Init();
POINT_COLOR=RED;//设置字体为红色 
LCD_ShowString(60,70,200,16,16,"DCMI Camera Test!");
while(OV7670_Init())              //初始化OV7670
{
  LCD_ShowString(60,130,200,16,16,"OV7670 Error");
delay_ms(200);
LCD_Fill(60,130,239,246,WHITE);
delay_ms(200);
}
LCD_ShowString(60,90,200,16,16,"OV7670 Init OK");
delay_ms(1000);
LCD_WriteReg(0x0011,0x6068);
LCD_SetCursor(0,0);
OV7670_Window_Set(10,174,240,320);

  DMA_Cmd(DMA2_Stream1, ENABLE);
  DCMI_Cmd(ENABLE); 
  DCMI_CaptureCmd(ENABLE);

}
回复

使用道具 举报

21

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2014-11-11
在线时间
161 小时
 楼主| 发表于 2014-11-28 21:18:24 | 显示全部楼层
回复【4楼】刺客mfl:
---------------------------------
问题来了   仿真运行后在显示屏上看到的是DCMI Camera Test!   OV7670 Error
经过一步一步的排查    发现错误出现在SCCB.C里u8 SCCB_WR_Byte(u8 dat)函数中的if(SCCB_READ_SDA)res=1;  //SDA=1发送失败,返回1
处    请教原子哥  这怎么解决    同时请教原子哥 对应的OV7670应该怎么初始化 要是有相应的例程更好了    在程序中加了#include "ov7670config.h"了
用的OV7670是微雪电子的
回复

使用道具 举报

21

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2014-11-11
在线时间
161 小时
 楼主| 发表于 2014-11-28 21:20:09 | 显示全部楼层






这是OV7670模块电路图
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-11-28 22:34:55 | 显示全部楼层
你这个是SCCB通信都有问题,其他都不用考虑了,直接检查SCCB通信部分,这个和我们OV2640差不多,我们的例程是OV2640的,你可以移植过来试试,先读ID。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

21

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2014-11-11
在线时间
161 小时
 楼主| 发表于 2014-11-29 11:28:17 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
我就是移植了您们的程序   但还是出现了这种问题里u8 SCCB_WR_Byte(u8 dat)函数中的if(SCCB_READ_SDA)res=1;  //SDA=1发送失败,返回1 
问题就是出现在这里   不知道该怎么解决
回复

使用道具 举报

21

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
624
金钱
624
注册时间
2014-11-11
在线时间
161 小时
 楼主| 发表于 2014-11-29 21:21:31 | 显示全部楼层
回复【8楼】刺客mfl:
---------------------------------
回复【8楼】刺客mfl:
---------------------------------
SDA引脚当不插摄像头的时候时0.1V左右    插上摄像头的时候3.2V     也就是说SCCB老是收不到应答信号。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 09:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表