记一次和摄像头的摩擦经历

因为时间的原因,这次点亮摄像头的时间特别短,昨天下午模组到公司,今天下午点亮。

几个人一起调试,发现的问题也很多,今天下午发现有一个怀疑的问题,我马上驱车几十公里去模组厂调试,回来的时候,同事已经把摄像头点亮了。时间虽然很短,但是我觉得应该把排查的问题点总结一下,避免下次调试摄像头的时候遇到同样的问题。

也希望大家看了我的文章后,如果遇到调试摄像头相关的工作,可以迎刃而解。

#模组供电电压

  • 模拟供电电源可以理解为里面有ADC转换相关的电路,需要一个基准电压,这个就是模拟电源电压。

  • IOVDD ,这个是I2C通信的GPIO口电压,有的GPIO口电压是3.3V,而摄像头芯片的IOVDD是1.8V,就需要转换电路把电压转换成1.8V。

  • DVDD 是数字电压这个需要按照模组规格书提供正确供电。

这三路电压是供电要求,一定要按照摄像头模组设计要求。

3.3V转1.8V的电路复位脚和PWDN脚电平转换电路

#时钟MCLK

摄像头模组里面是有芯片的,有芯片就需要有时钟,没有时钟的芯片是不能工作的。就好像一个人,没了心跳的话也是不能正常工作的。

时钟这个问题非常关键,我们刚开始有点忽略时钟的问题。实话说,我也很长时间没有调试摄像头了。我2013年在ZTE调过摄像头,到现在也已经很长时间了,经验这个东西还是很有必要的。但是排除经验的话,就是基础的问题了。没有基础的话,根本就不知道其中的原因,只知道需要这个,却不知道为什么需要这个,知所以,但不知所以然。

但是这个时钟是什么时候产生也是很有必要说明的,我跟硬件沟通,这个时钟硬件是直接从CPU连接出来的,中间就加了一个电阻。但是我们开机后还是量不到MCLK。所以这部分应该是软件问题。

从软件流程上可以看出,在开机的时候,我们会打开MCLK,然后去读CHIP ID,如果读到ID,就保持MCLK打开状态,如果读不到,就退出关闭MCLK。所以在开机后去测量MCLK是有可能量不到的。

MCLK在dts里面设置如下

gc5025: gc5025@37 {status = "okay";compatible = "galaxycore,gc5025";reg = <0x37>;clock-frequency = <400000>;pinctrl-names = "default";pinctrl-0 = <&cif_clkout_m0>;clocks = <&cru SCLK_CIF_OUT>;clock-names = "xvclk";avdd-supply = <&vcc2v8_dvp>;dovdd-supply = <&vcc1v8_dvp>;dvdd-supply = <&vdd1v2_dvp>;reset-gpios = <&gpio3 RK_PA3 GPIO_ACTIVE_LOW>;pwdn-gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_HIGH>;rockchip,camera-module-index = <0>;rockchip,camera-module-facing = "front";rockchip,camera-module-name = "CMK-CW4191-FG1";rockchip,camera-module-lens-name = "CK5502";port {ucam_out: endpoint {remote-endpoint = <&mipi_in_ucam>;data-lanes = <1 2>;};};};

对应的dts位置

			cif_clkout_m0: cif-clkout-m0 {rockchip,pins = <2 RK_PB3 RK_FUNC_1 &pcfg_pull_none_12ma>;/* cif_clkout */};

这个GPIO口对应原理图我们开机后会打开MCLK,然后读取CHIP ID。如果读不到呢?就会关闭MCLK。看看代码 获取DTS里面的配置设置MCLK

	gc5025->xvclk = devm_clk_get(dev, "xvclk");if (IS_ERR(gc5025->xvclk)) {dev_err(dev, "Failed to get xvclk\n");return -EINVAL;}ret = clk_set_rate(gc5025->xvclk, GC5025_XVCLK_FREQ);if (ret < 0) {dev_err(dev, "Failed to set xvclk rate (24MHz)\n");return ret;}if (clk_get_rate(gc5025->xvclk) != GC5025_XVCLK_FREQ)dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n");

如果没有读到CHIP ID 会进入这里


static void __gc5025_power_off(struct gc5025 *gc5025)
{int ret;if (!IS_ERR(gc5025->pwdn_gpio))gpiod_set_value_cansleep(gc5025->pwdn_gpio, 1);clk_disable_unprepare(gc5025->xvclk);if (!IS_ERR(gc5025->reset_gpio))gpiod_set_value_cansleep(gc5025->reset_gpio, 1);if (!IS_ERR_OR_NULL(gc5025->pins_sleep)) {ret = pinctrl_select_state(gc5025->pinctrl,gc5025->pins_sleep);if (ret < 0)dev_dbg(&gc5025->client->dev, "could not set pins\n");}regulator_bulk_disable(GC5025_NUM_SUPPLIES, gc5025->supplies);
}

里面有一句

clk_disable_unprepare(gc5025->xvclk);

就是用来关闭时钟的。

如果时钟不是问题,那就是其他的问题了,我们开机后,打开时钟,读取CHIP ID,读不到后,就关闭时钟。读不到的原因就应该从其他地方排查了。

#上电时序

上电时序是很重要的,做单片机的同学应该都有调时序的经验。每个芯片都有自己的脾气,有的芯片对时序严格,有的对时序不够严格。但是如果通信不成功。就需要排查这方面的问题。

GC5025要求的上电时序是。三路电开启后,MCLK开启后,需要先拉高PWDN,再拉高reset脚。我们正好在这个问题上做错了。修改后的代码如下

#异常问题

还没调通前,我们摄像头在开机后,我使用命令「如下图」读写I2C寄存器0x37 是手册上写的 GC5025 的器件地址。但是用这个地址是读不出内容的。但是我把器件地址修改成0x24,却能看到应答信号,而且读寄存器都能正常成功。

你们可能想知道我是如何找到这个0x24的,因为我写了一个脚本。

@echo off
setlocal ENABLEDELAYEDEXPANSION
set /a ii=3
for /l %%i in (1,1,116) do (
echo "adb shell i2cget -y -f 2 !ii! 0xf0 w"
adb shell "i2cget -y -f 2 !ii! 0xf0 w"
set /a ii+=1
)
pause

还有i2c-tools的链接 https://github.com/weiqifa0/i2c-tool

今天去模组厂的一个原因就是因为这个问题,为什么我写0x37的器件地址,芯片没有应答。但是我写0x24的器件地址,芯片有应答信号。这真的是百思不得姐啊。

正常I2C有应答的波形

调通后,我想了下,这个现象刚好说明了。因为没有正常的上电时序,芯片里面也没有正常工作了。而且这个不正常工作还让我怀疑这个芯片是不是坏掉了。

#总结

看看深圳的夜景

  回复「 篮球的大肚子」进入技术群聊

回复「1024」获取1000G学习资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法题

简单题 整数反转 给出一个 32 位的有符号整数&#xff0c;你需要将这个整数中每位上的数字进行反转。 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: 假设我们的环境只能存储得下 32 位的有符号整数&#xff0c;则其数值范围…

ES6箭头函数(节选自《ECMAScript 6 入门》)

基本用法 ES6 允许使用“箭头”&#xff08;>&#xff09;定义函数。 var f v > v; 上面的箭头函数等同于&#xff1a; var f function(v) {return v; }; 如果箭头函数不需要参数或需要多个参数&#xff0c;就使用一个圆括号代表参数部分。 var f () > 5; // 等同于…

声明为指针,定义为数组,声明为数组,定义为指针

之前写发的那篇指针和数组的文章&#xff0c;有网友评论觉得不是很舒服&#xff0c;我自己看了&#xff0c;觉得很不满意。所以想再写写&#xff0c;尽量把这个东西讲清楚。#定义为数组&#xff0c;声明为指针1.c中#include "stdio.h" char array[] "abcd"…

python部落稿酬_Python之父考虑重构Python解释器

作者&#xff1a;佚名来源&#xff1a;Python部落7月22日&#xff0c;Python之父Guido在Medium上发表了他的第一篇博文《PEG Parser》。在该文中&#xff0c;Guido说他正在考虑使用PEG Parser代替现有的类LL(1) Parser(名为pgen)&#xff0c;来重构Python解释器。原因是现在的 …

f2fs存储结构初探

前言学习文件系统的第一步&#xff0c;先搞清楚文件系统在设备上的存储结构&#xff0c;先来简单了解一下。F2FS空间布局图和描述选自《F2FS技术拆解》https://mp.weixin.qq.com/s/k1ibtWF_TRQi8wbqUGjMrgF2FS空间布局F2FS空间布局整个存储空间被划分为6个区域&#xff1a;超级…

Android系统驱动【转】

本文转载自&#xff1a;http://www.hovercool.com/en/%E6%B7%BB%E5%8A%A0%E9%A9%B1%E5%8A%A8%E6%A8%A1%E5%9D%97#a_.E5.9B.9B.E3.80.81.E9.85.8D.E7.BD.AE.E7.B3.BB.E7.BB.9F.E7.9A.84autoconfig 一、编写驱动核心程序 这里说的驱动核心程序是指运行在内核空间的&#xff0c;完…

net.conn read 判断数据读取完毕_高并发:缓存模式以及缓存的数据一致性

缓存由于其高性能&#xff0c;支持高并发的特性&#xff0c;在高并发的项目中不可或缺。被大家广泛使用的有Redis&#xff0c;Memcached等。本文主要探讨几种常见的缓存的读写模式&#xff0c;以及如何来保证缓存和数据库的数据一致性。这里大家可以关注一下我的个人专栏《PHP进…

PHP配置环境中开启GD库

下配置好的PHP环境中&#xff0c;GD库不像windows那样可以直接用&#xff0c;而是默认关闭&#xff0c;需要把它打开&#xff0c;去到php.ini文件中 找到php_gd2.dll把分号去掉即可。(注&#xff1a;GD库跟绘制二维码等有关) 转载于:https://www.cnblogs.com/mrszhou/p/7421161…

USB协议普及文

#目录#USB#USB On-The-Go Supplement#技术指标#机械和电气标准#编码方式#软件架构#端点#HCD#USB 封包格式#设备分类#USB接头#电源#Storage#人机接口设备&#xff08;HID&#xff09;通用串行总线(Universal Serial Bus, USB&#xff09;是连接外部设备的一个串口总线标准&#…

mysql jdbc驱动_JDBC认识与实践

一、什么是JDBC&#xff1f;Java数据库连接&#xff0c;&#xff08;Java Database Connectivity&#xff0c;简称JDBC&#xff09;是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口&#xff0c;提供了诸如查询和更新数据库中数据的方法。JDBC思维导图二、JDBC应…

画布实现拼图原理

1. 页面布局 1.1 bg: 背景提示图&#xff0c;使用半透明效果&#xff0c;移动图片后显示&#xff0c;层级最低&#xff0c;z-index:-1; 1.2 cvs: 当前画布&#xff0c;层级默认0&#xff1b; 1.3 content: 覆盖在画布之上 z-index:1; 1.3.1 currentCheckpoint: 显示当前关卡数…

晚归的码农老公

呃&#xff0c;我是本号主的贤内助&#xff0c;我们的儿子叫楠哥~由于疫情的影响&#xff0c;我们已经很久没有带楠楠回他外婆家玩了&#xff0c;只能用电话跟外婆聊聊家常。每一次通话结束&#xff0c;他外婆总会加问一句&#xff0c;启发回来了吧。我们每次的回答都是&#x…

100篇文章(5)

On Libraries’ Service Library are very important to students’campus life. However,many students’complain that libraries in their universities cannot meet their needThe first problem is nearly of all school libraries is their limited space.There always …

python绘制图像的参数_图像绘制.draw.line():系统错误:新样式getargs格式,但参数不是tup...

我在这个问题上看到了多个问题&#xff0c;但没能找到问题的答案。基本上&#xff0c;我只想在图像上画一条线&#xff0c;从python中的外部文件中获取坐标。我的代码是&#xff1a;import Image, ImageDrawimport sysimport csvim Image.open("screen.png")draw I…

Rockchip USB转485

#RS232 / RS485 简介#RS232#RS485#R485与RS232比较#开发#DTS配置#驱动开发#POSIX规范API#HAL层以上APP层#APK call JNI#APP#调试#log开启#RS232/RS485/RS422常见问题#RS232 / RS485 简介#RS232RS-232是美国电子工业联盟&#xff08;EIA&#xff09;制定的串行数据通信的接口标…

100篇范文(7)

How should college students spend their spare time? College is a place where students arrange their own studies and take part in all kinds of activities as they like.Thus,plenty of time is left at college students’disposal.How should student spend their…

高嘌呤食物搜索引擎_“高嘌呤”的食物已发现,尿酸高的人,要尽量挑着吃!...

导语&#xff1a;在我们的生活中又出现了一种现象&#xff0c;越来越频发&#xff0c;也是越来越倾向于年轻化&#xff0c;那么就是高尿酸&#xff0c;现在高尿酸已经被列为了我们国家的第四高&#xff0c;身体内的嘌呤含量是一部分&#xff0c;那么另一部分也是来源于我们平时…

罗老师带货了

相对比其他事情&#xff0c;我对罗老师带货很感兴趣&#xff0c;也许这样说&#xff0c;我对罗老师这个人比较感兴趣。罗老师是一个经过大风大浪的男人&#xff0c;经过了各种风雨&#xff0c;终于找到自己的位置&#xff0c;也决定在这个位置上发光发热了。我觉得他会像冯提莫…

缓存优化过程中的一些思考

最近一段时间在做双十一的优化&#xff0c;对于缓存的使用和改造渐渐有了一些思考&#xff0c;记录一下 缓存的使用、选择 * 读简单&#xff0c;写复杂的业务最好放在写入端 * 读复杂&#xff0c;写简单的业务逻辑放在读取端 * 根据业务的类型&#xff0c;选择是使用集中式缓存…

【Linux笔记】LED驱动程序

前言 上一篇我们分享了字符设备驱动框架&#xff1a;【Linux笔记】驱动基础篇&#xff0c;当时分享的是hello驱动程序。学STM32我们从点灯开始&#xff0c;学Linux驱动我们自然也要点个灯来玩玩&#xff0c;尽量在从这些基础例程中榨取知识&#xff0c;细抠、细抠&#xff0c;为…