IIC挂死问题解决过程
0.环境:arm CPU 带有IIC控制器作为slave端,带有调试串口。
1.bug表现:IIC slave 在系统启动后概率挂死,导致master无法detect到slave。
猜测1:认为IIC device程序有问题
检查1:查看程序发现有可能溢出的部分,使用IIC 工具刷过量数据到slave,未出问题。
猜测2:认为IIC device寄存器进入异常状态未能恢复
检查2:检查正常IIC寄存器和异常状态IIC寄存器,未能发现问题。
猜测3:时钟分频问题
检查3:询问同事,答固定分频。
猜测4:看波形分析
检查4:波形未量到,测量波形导致通信异常,部分设备破坏,放弃该方法。
2.发现新情况:系统启动过程中如果调试串口有数据输入,问题会概率出现。如果串口没有输入则多次测试不会出现问题。
猜测1:串口中断导致IIC初始化时被打断产生问题。
检查1:删除调试串口设备树节点,发现IIC启动100%出现问题 T-T。
猜测2: 100%复现的问题和之前的概率出现的问题相同
检查2:检查寄存器,检查设备detect 表现,认为是相同问题。
3.删除调试串口,IIC受影响的原因?
删除串口设备树节点,IIC device 必出问题。
猜测1:怀疑调试串口外部硬件电平高低导致IIC外设受影响
检查1:检查原理图,未发现影响的可能性。
猜测2:怀疑串口初始化部分处理了部分IIC设备依赖的初始化(导致不初始化串口IIC不能正常工作)。
检查2:查看串口初始化代码未能发现有值得注意的初始化。
猜测3:怀疑串口初始化影响公共寄存器间接影响IIC。
检查3:发现公共寄存器IIC div分频部分和正常工作的分频不一样,改回后问题解决。
4.公共寄存器怎么被修改的?
删除串口设备后公共寄存器值不正常,串口收到数据后公共寄存器值不正常。
猜测1:调试串口或IIC代码异常导致寄存器值被修改。
检查1:增加打印,发现问题原因在于IIC初始化过程中分频寄存器设置失败。但是同样方法在IIC device端初始化时设置该寄存器是成功的。
5.公共寄存器为什么不能写入?
猜测1: 特定配置下IIC 分频寄存器为只读
检查1:芯片设计方核实不存在这样的设计。
检查1:在写入分频寄存器前增加打印,dump所有公共寄存器。和正常公共寄存器做比较,未发现问题。写入IIC分频器成功。
猜测2:增加打印信息后写入成功为必现,去掉打印会写入不成功。
检查2:证实猜测。
猜测3:写入成功和读取公共寄存器相关
检查3:减少dump范围,小范围dump写入失败,大范围dump写入成功。
猜测4:写入成功和写入时间相关
检查4:dump的寄存器次数不变dump相同寄存器。证实写入成功与写入时间相关。
6.为什么不能写入和时间相关?
思考:可能和时钟初始化相关,但是公共寄存器的时钟初始化状态dump是正常的。
猜测1:dump过程中时钟初始化完成(证据:增加dump后写入正常)。
检查1:减少dump范围,发现公共寄存器的mpll稳定寄存器未稳定。
猜测2:时钟相关初始化未完成导致写入失败。
检查2:根据时钟依赖,在写入前增加等待,同时去掉打印,写入成功。
去掉串口设备导致问题100%复现,原因是串口不用初始化导致IIC 时钟分频更早初始化,写入IIC分频寄存器失败。
总结:
1.解决问题过程中,曾经怀疑过时钟分频问题但是未检查寄存器,导致问题解决时间拉长。
2.最开始未能考虑问题和时间相关的情况,如果直接思考该可能性,预计提高解决问题速度。
IIC挂死问题解决过程的更多相关文章
- NFS Server宕机后,NFS Client主机上df命令挂死
方法1: 使用root用户:Oracle@NDMCDB05:~> su -Password: NDMCDB05:~ # cat /etc/mtab /dev/sda2 / reiserfs rw ...
- 应用程序出现挂死,.NET Runtime at IP 791F7E06 (79140000) with exit code 80131506.
工具出现挂死问题 1.问题描述 工具出现挂死问题,巡检IIS发现以下异常日志 现网系统日志: 事件类型: 错误 事件来源: .NET Runtime 描述: Application: Di ...
- 关于用strace工具定位vrrpd进程有时会挂死的bug
只做工作总结备忘之用. 正在烧镜像,稍总结一下进来改bug遇到的问题. 一个项目里要用到L3 switch的nat,vrrp功能,但实地测试中偶然出现write file挂死的情况,但不是必现.交付在 ...
- I2C 挂死,SDA一直为低问题分析【转】
转自:https://blog.csdn.net/winitz/article/details/72460775 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csd ...
- MySQL 连接为什么挂死了?
摘要:本次分享的是一次关于 MySQL 高可用问题的定位过程,其中曲折颇多但问题本身却比较有些代表性,遂将其记录以供参考. 一.背景 近期由测试反馈的问题有点多,其中关于系统可靠性测试提出的问题令人感 ...
- MySQL 连接为什么挂死了
声明:本文为博主原创文章,由于已授权部分平台发表该文章(知乎.云社区),可能造成发布时间方面的困扰. 一.背景 近期由测试反馈的问题有点多,其中关于系统可靠性测试提出的问题令人感到头疼,一来这类问题有 ...
- 用strace处理程序异常挂死情况
1. 环境: ubuntu 系统 + strace + vim 2.编写挂死程序:(参考博客) #include <stdio.h> #include <sys/types.h> ...
- 记录sqoop同步失败问题解决过程,过程真的是很崎岖。(1月6日解决)
记录sqoop同步失败问题解决过程,过程真的是很崎岖.事发原因:最近突然出现sqoop export to mysql时频繁出错.看了下日志是卡在某条数据过不去了,看异常.看sqoop生成的mr并未发 ...
- java多线程解决应用挂死的问题
这两天为了定位JBOSS老是挂死的问题,学习了一下JAVA多线程方面的知识,在此总结一下 1.在Java程序中,JVM负责线程的调度.线程调度是指按照特定的机制为多个线程分配CPU的使用权. 调度的模 ...
随机推荐
- 使用webuploader实现大文件传输
这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...
- 爬虫(八):分析Ajax请求抓取今日头条街拍美图
(1):分析网页 分析ajax的请求网址,和需要的参数.通过不断向下拉动滚动条,发现请求的参数中offset一直在变化,所以每次请求通过offset来控制新的ajax请求. (2)上代码 a.通过aj ...
- AdvanceEast源码理解
目录 文章思路 源码理解 一. 标签点形式 按顺序排列四个点,逆时针旋转,且第一个点为左上角点(刚开始选择最左边的点, 二. 标签切边 三. loss计算 四. NMS 最后说明 文章思路 大神的gi ...
- luogu_P3345[zjoi2015]幻想乡战略游戏
传送门 Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看 ...
- excel被保护或者锁定时候按住alt和enter可以输入换行
excel被保护或者锁定时候按住alt和enter可以输入换行
- vue 弹窗式 滑动图片验证码
效果图: 具体代码: test.vue //整个页面是个弹窗 visible 控制弹窗的显示关闭 默认打开 <template> <div class="mask_laye ...
- VIM快速掌握
vi/vim 基本使用方法 vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的 ...
- Docker,就放弃了把日志写入文件
日志配置 既然用 Docker,就放弃了把日志写入文件,直接写到标准输出. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ...
- requests与urllib.request
requests很明显,在写法上与urllib.request不同,前者多一个 S.导入包时:import requestsimport urllib.requesturllib.request请求模 ...
- 123457---com.threeObj.Baobaoshizi01--- 宝宝识字01
com.threeObj.Baobaoshizi01--- 宝宝识字01