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

2019-07-21 04:27发布

请教原子哥  先上程序
这是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位
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
麦田稻草
1楼-- · 2019-07-21 05:11
检测一下硬件,看看供电、晶振有没有正常工作先吧,有些模块没有带晶振,就需要外接时钟才能正常工作
刺客mfl
2楼-- · 2019-07-21 11:02
 精彩回答 2  元偷偷看……
刺客mfl
3楼-- · 2019-07-21 11:05
回复【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
刺客mfl
4楼-- · 2019-07-21 14:55
回复【3楼】刺客mfl:
---------------------------------
主函数

int main()
{
delay_init(168);
uart_init(115200);
  LED_Init();
LCD_Init();
POINT_COLOR=RED;//设置字体为红 {MOD} 
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);

}
刺客mfl
5楼-- · 2019-07-21 20:07
回复【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是微雪电子的
刺客mfl
6楼-- · 2019-07-21 22:17






这是OV7670模块电路图

一周热门 更多>