赞
踩
前言:之前因为贪图便宜买了一个7块钱的ov7670摄像头,然后想用我的stm32开发板驱动起来结合rtthread做个小项目出来,但是一路上遇到了许多问题,最终没能成功,在此记录一下用stm32驱动ov7670的过程
现阶段只能驱动起lcd屏幕,在摄像头驱动这一步卡住了。
液晶控制器芯片为NT35510,NT35510 控制器根据自身的 IM[3:0] 信号线电平决定它与 MCU 的通讯方式,它本身支持 SPI 及8080 通讯方式,本示例中液晶屏的NT35510 控制器在出厂前就已经按固定配置好 (内部已连接硬件电路),它被配置为通过 8080 接口通讯,使用 16 根数据线的 RGB565 格式,且背光 LED 引脚不与 NT35510 相连,而是直接引出到排针供外部控制器控制。
电容屏含触控IC 型号为GT917S ,它接收触摸屏的信号进行处理,把触摸信息使用 I2C接口输出到 STM32 等控制器,前期屏幕仅做显示,后期添加操作系统以及触控
电容屏引脚与开发板引脚连接图:
引脚说明:
信号线 | 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
实物图
SCCB协议与IIC协议基本相同,通过该协议发送控制信号,
注意:SCCB协议在接收到读寄存器的命令后不会发送应答信号,所以使用HAL库的HAL_I2C_MemRead函数会出现卡住的情况。
OV7670内部芯片管脚图
功能框图
引脚图
首先是时钟的问题,因为ov7670本身没有晶振,需要外接晶振或者其他时钟信号给XCLK引脚提供24MHz的时钟信号,这里使用的是STM32的MCO1,
注意:亲测必须使用24MHz的频率,此时读取的设备ID跟OV7670数据手册上的数值才会一致,频率过高或过低会出现读取的ID与数据手册不一致的情况。
SCCB用于读取/写入寄存器,控制OV7670的参数以及模式
具体参考数据手册的寄存器部分
SCCB通信协议与I2C类似,只需要将对应的I2C引脚初始化即可。
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;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。