最近有个项目需要实现快速开机出摄像头预览(2s内),但是我的板子linux上的qt应用起来都要10s左右了,于是在硬件上增加了一个屏驱芯片TW8836,这是一个mcu,可以直接获取摄像头数据送到lcd显示。

板子上电后首先由8836点亮屏幕并输出摄像头预览,待arm起来后控制8836切换显示,8836接受arm lvds信号并送到lcd显示,同时8836将camera数据(bt656)回传给arm.

由于我们这边主要是搞arm,没有更多的预留时间去熟悉研究8836这颗mcu的用法,但是我们板子上还有一颗当做看门狗的stm32,可以通过iic设置8836的寄存器,从而实现相应功能,最后硬件大致框图如下

板子上电前期,stm32先通过iic控制8836输出camera预览,待arm起来后,再由arm通过iic控制8836显示arm输出的内容。这过程中就涉及到两个主机公国iic控制同一个从机的逻辑。

首先验证smt32单独通过iic单独控制8836,验证ok。

其次验证arm单独通过iic单独控制8836,验证ok。

但是将stm32 、8836及arm都通过iic连接在一起的时候,stm32可以与8836通讯,但是arm无法与8836通讯。

对应log如下:

[root@t3_p3 ~]# insmod gt9xx_ts.ko
[ 24.608866] kyleprint: >>> goodix_ts_init
[ 24.613541] ctp_fetch_sysconfig_para: ctp_power_io is invalid.
[ 24.621138] tab:-----------------ms 1----------------------
[ 24.627253] GTP9xx***CTP*** ctp_wakeup:status:0,ms = 0
[ 24.633091] GTP9xx***config_info.wakeup_gpio.gpio = 227
[ 24.690100] GTP9xx***CTP*** ctp_wakeup:status:1,ms = 0
[ 24.695742] GTP9xx***config_info.wakeup_gpio.gpio = 227
[ 24.720675] i2c-core: driver [gt9xx] using legacy suspend method
[ 24.727331] i2c-core: driver [gt9xx] using legacy resume method
[ 24.734093] GTP9xxctp_detect: addr = 45
[ 24.738550] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 24.747991] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 24.757244] i2c_test:I2C retry timeout, reset chip.
[ 24.780260] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 24.789830] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 24.799080] i2c_test:I2C retry timeout, reset chip.
[ 24.820227] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 24.829752] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 24.838982] i2c_test:I2C retry timeout, reset chip.
[ 24.860384] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 24.869811] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 24.879086] i2c_test:I2C retry timeout, reset chip.
[ 24.900415] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 24.909992] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 24.919239] i2c_test:I2C retry timeout, reset chip.
[ 25.150324] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 25.159883] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 25.169112] i2c_test:get tw8836_id failed ret = -70
[ 25.380296] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 25.389787] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 25.399036] i2c_test:get tw8836_id failed ret = -70
[ 25.610448] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 25.620066] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 25.629189] i2c_test:get tw8836_id failed ret = -70
[ 25.840414] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 25.849863] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 25.859075] i2c_test:get tw8836_id failed ret = -70
[ 26.070362] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 26.079971] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 26.089269] i2c_test:get tw8836_id failed ret = -70
[ 26.300313] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 26.309776] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 26.319022] i2c_test:get tw8836_id failed ret = -70
[ 26.530240] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 26.539667] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 26.549098] i2c_test:get tw8836_id failed ret = -70
[ 26.760332] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 26.769763] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 26.779047] i2c_test:get tw8836_id failed ret = -70
[ 26.990276] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 26.999848] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 27.009101] i2c_test:get tw8836_id failed ret = -70
[ 27.220466] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 27.230077] sunxi_i2c_do_xfer()902 - [i2c2] incomplete xfer (status: 0x20, dev addr: 0x45)
[ 27.239151] i2c_test:get tw8836_id failed ret = -70
[ 27.244752] ctp_detect:I2C connection might be something wrong

iic从设备没有响应,只能用示波器抓波形观察,发现sda数据项一直处于高电平无法拉低,但是在stm32与8836通讯的时候却可以正常高低切换。

回想对比,发现问题的根本原因是,我在stm32操作完iic后没有将scl和sda释放,因为stm32那边的iic走的是软件模拟的方式,空闲状态下SDA和SCL两个io口都被我拉高了,导致arm这边无法将电平拉低。

最后在stm iic部分,每次操作完iic就将SDA 和SCL释放,设置成输入状态。

释放io口后arm已经可以正常与8836通讯,能够正常获取到chip id 0x36

[  686.617078] kyleprint: >>> goodix_ts_init
[ 686.621729] ctp_fetch_sysconfig_para: ctp_power_io is invalid.
[ 686.630192] goodix_ts_init:requst irq gpio fail!
[ 686.635399] tab:-----------------ms 1----------------------
[ 686.635399] GTP9xx***CTP*** ctp_wakeup:status:0,ms = 0
[ 686.635399] GTP9xx***config_info.wakeup_gpio.gpio = 227
[ 686.690186] GTP9xx***CTP*** ctp_wakeup:status:1,ms = 0
[ 686.695816] GTP9xx***config_info.wakeup_gpio.gpio = 227
[ 686.721011] i2c-core: driver [gt9xx] using legacy suspend method
[ 686.727638] i2c-core: driver [gt9xx] using legacy resume method
[ 686.734423] GTP9xxctp_detect: addr = 45
[ 686.739420] i2c_test pass
[ 686.950714] i2c_test: i= 1 get tw8836_id 0x00 ret 2
[ 686.956180] i2c_test: i= 1 get tw8836_id 0x36 ret 2
[ 687.170542] i2c_test: i= 2 get tw8836_id 0x00 ret 2
[ 687.176041] i2c_test: i= 2 get tw8836_id 0x36 ret 2
[ 687.390399] i2c_test: i= 3 get tw8836_id 0x00 ret 2
[ 687.395851] i2c_test: i= 3 get tw8836_id 0x36 ret 2
[ 687.610415] i2c_test: i= 4 get tw8836_id 0x00 ret 2
[ 687.615858] i2c_test: i= 4 get tw8836_id 0x36 ret 2
[ 687.830542] i2c_test: i= 5 get tw8836_id 0x00 ret 2
[ 687.835980] i2c_test: i= 5 get tw8836_id 0x36 ret 2
[ 688.050448] i2c_test: i= 6 get tw8836_id 0x00 ret 2
[ 688.055920] i2c_test: i= 6 get tw8836_id 0x36 ret 2
[ 688.270492] i2c_test: i= 7 get tw8836_id 0x00 ret 2
[ 688.275955] i2c_test: i= 7 get tw8836_id 0x36 ret 2
[ 688.490476] i2c_test: i= 8 get tw8836_id 0x00 ret 2
[ 688.495963] i2c_test: i= 8 get tw8836_id 0x36 ret 2
[ 688.710888] i2c_test: i= 9 get tw8836_id 0x00 ret 2
[ 688.716341] i2c_test: i= 9 get tw8836_id 0x36 ret 2
[ 688.930820] i2c_test: i= 10 get tw8836_id 0x00 ret 2
[ 688.936359] i2c_test: i= 10 get tw8836_id 0x36 ret 2

一从二主IIC连接调试的更多相关文章

  1. Redis源码漂流记(二)-搭建Redis调试环境

    Redis源码漂流记(二)-搭建Redis调试环境 一.目标 搭建Redis调试环境 简要理解Redis命令运转流程 二.前提 1.有一些c知识简单基础(变量命名.常用数据类型.指针等) 可以参考这篇 ...

  2. 调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置

    调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置 调试SQLSERVER (一)生成dump文件的方法调试SQLSERVER (三)使用Windbg调试SQLSERVER ...

  3. 【转】android 电容屏(二):驱动调试之基本概念篇

    关键词:android  电容屏 tp 工作队列 中断 多点触摸协议平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:S5PV310(samsung ...

  4. 百度APP移动端网络深度优化实践分享(二):网络连接优化篇

    本文由百度技术团队“蔡锐”原创发表于“百度App技术”公众号,原题为<百度App网络深度优化系列<二>连接优化>,感谢原作者的无私分享. 一.前言 在<百度APP移动端网 ...

  5. 用unity3d实现简单的主server连接

    用unity3d实现简单的主server连接 參考自鹰大的网络实例 -------------------------------------------------华丽的切割线----------- ...

  6. MIP开发教程(二) 使用MIP-CLI工具调试MIP网页

    初始化 MIP 配置 新建一个 MIP 网页 编写 MIP 网页代码 校验 MIP 网页 调试 MIP 网页 1. 初始化 MIP 配置 首先在html目录下进行初始化 MIP 配置: $ mip i ...

  7. Baidu 人脸识别FireFly 与PC连接调试

    1.USB线插到离屏幕较远的双层USB口上方.2.安装驱动,OK.,然后就可以直接拷贝安装包或者连接调试了. 其它几个口都不行.

  8. MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习

    MySQL之多表查询 阅读目录 一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习 一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建 ...

  9. 【转】WinDbg调试器:启动程序时自动连接调试器方法

    当我们调试服务进程或子进程时,无法直接用调试加载进程的方式启动,此时需要在启动程序时自动连接调试器方法: 第一步:注册表展开到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft ...

随机推荐

  1. 谈谈如何进阶Java高级工程师

    从入门到瓶颈(++文末附学习脑图++) 首先,先自我介绍一下,楼主94年的,四川人,普通大专毕业. 第一阶段 实习阶段 2015年,实习阶段去浙江温州(没错,就是皮革厂的那个地方)找了份软件实施的工作 ...

  2. vue注意点

    template下面只能有一个节点,不能是多个

  3. mysql将数据导入到另外一张操作

    insert into ydcq_member_class (ClassId,signcount,UserId) select 64,2,`员工编号` from `学员名单`

  4. 大白话透彻讲解 Promise 的使用,读完你就懂了

    一.为什么使用Promise? 我们知道 js 执行的时候,一次只能执行一个任务,它会阻塞其他任务.由于这个缺陷导致 js 的所有网络操作,浏览器事件,都必须是异步执行.异步执行可以使用回调函数执行. ...

  5. 【CTF】msf和impacket联合拿域控内网渗透-拿域控

    前言 掌控安全里面的靶场内网渗透,练练手! 内网渗透拿域控 环境:http://afsgr16-b1ferw.aqlab.cn/?id=1 1.进去一看,典型的sql注入 2.测试了一下,可以爆库,也 ...

  6. 火爆全网的《鱿鱼游戏》,今天用 Python 分析一波影评

    Hello,各位读者朋友们好啊,我是小张~ 这不国庆嘛,就把最近很火的一个韩剧<鱿鱼游戏>刷了下,这部剧整体剧情来说还是非常不错的,很值得一看, 作为一个技术博主,当然不能在这儿介绍这部剧 ...

  7. 踩坑系列《十一》完美解决阿里云vod视频点播无法播放音频和视频点播控制台里的媒资库里面的视频无法播放

    刚开始项目部署的时候,音频还是正常播放,后面直接报了 获取m3u8文件失败(manifestLoadError) 的错误,原因是 我的域名 xxx.com 这个域名没有解析到点播提供的CNAME上,所 ...

  8. HTML选择器的权重(优先级)

    选择器的优先级主要用于样式发生冲突的情况下 选择器范围越小,优先级越高 行内样式>id选择器>类选择器>标签选择器>通用选择器 这里涉及一个权重值的问题,权重值越高,优先级越大 ...

  9. Windows 11正式版来了,下载、安装教程、一起奉上!

    Windows 11正式版已经发布了,今天给大家更新一波Win11系统的安装方法,其实和Win10基本一样,有多种方法.   安装Win11前请先查看电脑是否支持Win11系统,先用微软自家的PC H ...

  10. Linux下关于用户账户的几个文件解析

    Linux下关于用户账户的几个文件解析 Linux是一个多用户系统,但是对于一个多用户共存的系统中,当然不能够出现用户相互越权等一系列的安全问题,所以如何正确的管理账户成为了Linux系统中至关重要的 ...