STM32F4驱动OV7670摄像头的完整总结

前言:之前因为贪图便宜买了一个7块钱的ov7670摄像头,然后想用我的stm32开发板驱动起来结合rtthread做个小项目出来,但是一路上遇到了许多问题,最终没能成功,在此记录一下用stm32驱动ov7670的过程

项目框架如下:

image-20230405125106690

现阶段只能驱动起lcd屏幕,在摄像头驱动这一步卡住了。

屏幕部分:

液晶控制器芯片为NT35510,NT35510 控制器根据自身的 IM[3:0] 信号线电平决定它与 MCU 的通讯方式,它本身支持 SPI 及8080 通讯方式,本示例中液晶屏的NT35510 控制器在出厂前就已经按固定配置好 (内部已连接硬件电路),它被配置为通过 8080 接口通讯,使用 16 根数据线的 RGB565 格式,且背光 LED 引脚不与 NT35510 相连,而是直接引出到排针供外部控制器控制。

电容屏含触控IC 型号为GT917S ,它接收触摸屏的信号进行处理,把触摸信息使用 I2C接口输出到 STM32 等控制器,前期屏幕仅做显示,后期添加操作系统以及触控

电容屏引脚与开发板引脚连接图:

image-20230319154632332

引脚说明:

信号线 NT35510对应信号线 说明
LCD_DB[15:0] DB[15:0] 数据信号
LCD_RD RDX 读数据信号,低电平有效
LCD_RS D/CX 数据/命令信号,高电平时,D[15:0] 表示的是数据,
LCD_RESET RESX 复位信号,低电平有效
LCD_WR WRX 写数据信号,低电平有效
LCD_CS CSX 片选信号,低电平有效
LCD_BK 背光信号,低电平点亮
RST 与触摸 IC 相连 触摸 IC 的复位引脚
INT 与触摸 IC 相连 触摸 IC 的中断信号引脚
SCL 与触摸 IC 相连 触摸 IC 的 IIC 总线的时钟信号
SDA 与触摸 IC 相连 触摸 IC 的 IIC 总线的数据信号

带x表示低电平有效

屏幕的使用方式:

可以通过IO口模拟8080通信时序,但是IO口速度慢,同时STM32的外设FSMC通信协议与8080时序类似,只需稍微修改一下即可使用。

摄像头部分:

摄像头使用OV7670

实物图

image-20230319161920509

SCCB协议与IIC协议基本相同,通过该协议发送控制信号,

注意:SCCB协议在接收到读寄存器的命令后不会发送应答信号,所以使用HAL库的HAL_I2C_MemRead函数会出现卡住的情况。

OV7670内部芯片管脚图

image-20230319160858819

功能框图

image-20230319160916966

引脚图

image-20230319160958693

时钟

首先是时钟的问题,因为ov7670本身没有晶振,需要外接晶振或者其他时钟信号给XCLK引脚提供24MHz的时钟信号,这里使用的是STM32的MCO1,

image-20230405130457353

image-20230405130527444

注意:亲测必须使用24MHz的频率,此时读取的设备ID跟OV7670数据手册上的数值才会一致,频率过高或过低会出现读取的ID与数据手册不一致的情况。

SCCB通信协议

SCCB用于读取/写入寄存器,控制OV7670的参数以及模式
具体参考数据手册的寄存器部分

image-20230405131311031

SCCB通信协议与I2C类似,只需要将对应的I2C引脚初始化即可。

DCMI

DCMI是数字摄像头接口,用于摄像头与主控之间的数据传输。我就是在这一步卡住的。在初始化DCMI与DMA并且确保摄像头初始化成功且DCMI的GPIO有数据后,首先发现DMA不能正常传输数据,上网查了一下,1,说是HAL自动生成的初始化代码会导致DMA不能正常开启,但是修改代码后还是读取不到数据。2,然后继续往上排查,我把DCMI数据寄存器的值打印出来发现里面的值是空的,说明DCMI没有接收到数据。但是我通过打印DCMI的数据传输的GPIO后发现GPIO的电平是由变化的,说明摄像头向DCMI发送数据了,但是DCMI并没有接收到,说明是DCMI的问题。网上有关DCMI的资料比较少,所以暂时先不研究了,在这一步卡了太久,有点浪费时间了。
—————————————————————————————————-
改了一下DCMI的PCLK极性和垂直同步信号的极性后DCMI的DR寄存器里面有值了,但是DMA还是没法传输数据
DCMI的初始化代码如下

  hdcmi.Instance = DCMI;
  hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE;
  hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING;
  hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_HIGH;
  hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_LOW;
  hdcmi.Init.CaptureRate = DCMI_CR_ALTERNATE_4_FRAME;
  hdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B;
  hdcmi.Init.JPEGMode = DCMI_JPEG_DISABLE;
物联沃分享整理
物联沃-IOTWORD物联网 » STM32F4驱动OV7670摄像头的完整总结

发表评论