IIC通讯故障纠错一例

news2024/10/3 4:30:15

1.问题描述

IIC在既有的工作中,用来协调两个外围芯片。一个芯片扩展IO,一个处理显示。仔细核对了IIC的种种配置,并且最终测量了输出的时钟和数据波形,最终的时钟线波形是这样的:

单片机master模式,输出前面的地址部分完毕后, 无回应,电平直接拉高,只传递了一个地址帧,通讯就终止了。为了防止虚焊造成的地址错误,我遍历了0x00~0xff的地址。均无回应。

下面是数据线(因为始终收不到回应帧,我发出了0x00帧——请求地址帧)。

 我记不清IIC的时钟频率有没有变动过。这个震动频率看时钟线是93Kz,接近100KHz。数据线,光标所在的那个地方,看起来像是一个应答,对吧?master没有识别到?

2. IIC协议

  • Start Bit 是1=》0.IIC地址线和数据线均常1.
  • MSB first Transmit.
  • Read/Write Bit  master 要读取是1,要写入是0.
  • ACK is low... to indicate peripheral is ready.
  • TransferBit is switched at CLOCK is low. and read at CLK is High.
  •  Peripheral should ack for each bytes.

2.1识读

所以,上面的示波器数据,时钟震荡时的高位,标志着数据Bits的传输,
前6个Bit,确定无疑,都是0.第7Bit,0.第8Bit1,第9Bit1....9Bit之后,时钟未震荡的第10Bit,数据总线出现0.然后延续大概5个Bits.时钟线复位。

3.分析

上面是一个寄存器读,对比器件的IIC时序:

看这个示例,我的做法似乎不对。

正确的做法是:

Step1.以写模式,输出两个字节:第一个字节:Addr(读写位为0,标志写),第二个字节,寄存器编号。

Step2.以读模式,输出1个字节:第一个字节:Addr(此时读写位为1,标志读),然后读入1个字节,即可。

我的做法,相当于直接:

以读模式,输出1个字节的地址位,然后想要再次写出寄存器编号,没有遇到应答直接报错。

4.纠正

4.1将代码修正为两段模式

 双探针不好操作,我单独测了clk和dat,然后人工对齐,大概是上面这张图这样的。

我的实际代码是:

#define PCA9554ADDR (0x70)
#define REG_IN 0

GP_KEYS GetKeyBoardScanCodes(void)
{
    uint8_t dumb[2];
    dumb[0] = PCA9554ADDR;
    dumb[1] = REG_IN;
    I2C1_WriteNBytes(PCA9554ADDR, dumb, 2);
    dumb[1] = 0xcc;
    I2C1_ReadNBytes(PCA9554ADDR, &dumb[1], 1);
    return (uint8_t)dumb[1];
}

感觉还是不对。

Write2Bytes时,第一组地址,依稀是0x70。送出后,回执收到没,不确定。那个9Bits之后的凹陷,不知道是什么。第一组的第二个字节,未发出。

第二次发送时,地址部分因为最后一个字节变为1. clk-dat实际对齐后应该是这样,回执肯定是1.
没被确认。

查找代码发现PIC代码里的Addr的定义与我的定义不同。我采用的是左对齐的模式,实际上,7位地址应该右对齐,修改地址字段后,时钟线看起来已经正常:

4.2修改7位地址为右对齐模式:

 现在时钟线看起来正常。先发两个字节,然后通知设备要读,设备读完1个字节,连续的8个bit后主机延时应答的第9个bits也是正常的。

但是读到的Bits位不对,试试改为PIC示例代码的寄存器读,时钟线:

4.3改为PIC自带的I2C寄存器读模式

 成功:读写均正常。

4.结论

  1. I2C只有两根线。发生故障时首先查时钟线的反馈是更好的策略。
  2. I2C的一个完整的Byte传输会有9个bits,最后一个bit因为可能涉及master和slave的交互,如果有交互,时钟线会被master首先设置为浮动高阻,然后slave会拉低,直到准备好拉高回应。
  3. I2C示波器读取时,Bit位在高电平处读取。
  4. 时钟和数据线平时常高。
  5. 大多数地址字节都是在低7Bits。不要弄错。

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

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

相关文章

ES6基础知识八:你是怎么理解ES6中Proxy的?使用场景?

一、介绍 定义: 用于定义基本操作的自定义行为 本质: 修改的是程序默认形为,就形同于在编程语言层面上做修改,属于元编程(meta programming) 元编程(Metaprogramming,又译超编程,是指某类计算…

【Java练习题汇总】《第一行代码JAVA》异常处理篇,汇总Java练习题——异常的概念及处理标准格式(try、catch、finally、throws、throw)、断言机制 Assertion ~

Java练习题 异常处理篇 1️⃣ 异常处理篇 1️⃣ 异常处理篇 一、填空题 Throwable 下的两个子类是______________ 、______________ 。ArthmeticException 类表示______________ 异常, ArraysIndexOutOfBoundsException 表示______________ 异常。一个 try 代码后…

Linux内核提权漏洞(Dirty-pipe)复现

前言:CVE-2022-0847 是存在于 Linux内核 5.8 及之后版本中的本地提权漏洞。攻击者通过利用此漏洞,可覆盖重写任意可读文件中的数据,从而可将普通权限的用户提升到特权 root。 CVE-2022-0847 的漏洞原理类似于 CVE-2016-5195 脏牛漏洞&#xf…

Vue入门项目——WebApi

Vue入门——WebApi vue3项目搭建组合式API响应式APIreactive()ref() 生命周期钩子computed计算属性函数watch监听函数父子通信模板引用组合选项 vue3项目搭建 简单看下Vue3的优势吧 下载安装npm及node.js16.0以上版本(确保安装成功可用如下代码检查版本&#xff0…

YOLOX-PAI 论文学习

1. 解决了什么问题? 对 YOLOX 做加速,在单张 Tesla V100 上取得了 42.8 42.8 42.8mAP,推理速度为 1 毫秒。 2. 提出了什么方法? 2.1 主干网络 YOLOv6 和 PP-YOLOE 都将主干网络从 CSPNet 切换到了 RepVGG。RepVGG 在推理时&a…

PHP在线相册--【强撸项目】

强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 上效果图phpStudy 设置导数据库项目目录如图:代码部分:主页 配套资源作业: 本系列校训 用免费公开视频,卷飞培训班哈人&…

【深度学习】【Image Inpainting】Free-Form Image Inpainting with Gated Convolution

模型:DeepFillv2 (CVPR’2019) 论文:https://arxiv.org/abs/1806.03589 代码:https://github.com/JiahuiYu/generative_inpainting 文章目录 效果AbstractIntroductionRelated WorkAutomatic Image InpaintingGuided Image Inpainting and Sy…

KaiwuDB 资深解决方案专家周幸骏:打造核心时序引擎,释放数据新价值

以下为浪潮 KaiwuDB 资深解决方案专家周幸骏受邀于7月4日在京举行的可信数据库发展大会发表演讲的实录摘要,欢迎大家点赞、收藏、关注! 01 聚焦“时序” 据 IDC 等权威数据统计,预估 2025 年物联网设备产生的数据可达到 79.4ZB ;…

ubuntu与windows之间的文件共享

最近在做项目,需要用到ubuntu进行代码编译生成可执行文件,但是我个人阅读和编写代码喜欢用source insight这个软件IDE。安利一下这个软件,阅读代码和编辑代码真的很棒啊,谁用谁知道吧! 由于在ubuntu中安装source insig…

ShardingJDBC - 学习笔记

一、简介 官网:Apache ShardingSphere 下载地址:下载 :: ShardingSphere 快速入门:ShardingSphere-JDBC :: ShardingSphere 分库分表框架 ShardingSphere包括Sharding-JDBC、Sharding-Proxy、Sharding-Sidecar三个开源分布式数据库中间件解…

每月被攻击4000万次,全球最不安全的关键基础设施实锤了

在当今不确定的地缘政治环境中,无论是个人还是企业都高度关注潜在的网络攻击。而这其中最令人担忧的是对关键基础设施和工业资产的攻击。 关键基础设施中尤其是电力、交通、通信、金融等系统均在现代社会中发挥着至关重要的作用,因此关键基础设施一直是…

程序员如何向老板提加薪?

今天的问题不仅适用于程序员,对于其他职业同样适用。如果你认为自己所做的工作应该得到更多的报酬,并且想为此做点什么,你有两个选择:找一个新的高薪工作或要求加薪。 这两种选择都会带来新的焦虑,但它们都会带来新的…

【框架篇】Spring Boot 配置文件(详细教程)

Spring Boot 配置文件 一,配置文件的用途 配置文件在Spring Boot项目中的地位是比较重要,其功能可主要归纳为以下几个: 进行配置程序属性:配置文件允许设置应用程序的各种属性,如数据库连接、端口号、日志级别、缓存…

多态及其原理

文章目录 构成多态的条件虚函数作用:完成重写 重写重载 重写 隐藏为什么析构函数要搞成符合多态?原理预热对于基类指针或引用指向父类或者子类的成员函数是如何调用不同的函数呢? 一个类如果是基类,它的析构函数最好加上virtual 构成多态的条…

【【51单片机的LCD1602 最简单的一集】】

最简单的一集&#xff0c;明白运算显示就没问题 这一节相对简单 其实只要明白显示行列就可以了 剩下来的取什么基本上就是遍历 然后读取到\0停止 下面是基础的LCD1602的功能 #include <REGX52.H> sbit LCD_RSP2^6; sbit LCD_RWP2^5; sbit LCD_EP2^7; #define LCD_Data…

ES6基础知识七:你是怎么理解ES6中 Generator的?使用场景?

一、介绍 Generator 函数是 ES6 提供的一种异步编程解决方案&#xff0c;语法行为与传统函数完全不同 回顾下上文提到的解决异步的手段&#xff1a; 回调函数promise 那么&#xff0c;上文我们提到promsie已经是一种比较流行的解决异步方案&#xff0c;那么为什么还出现Gen…

归并排序法解释

什么是归并排序法 归并排序是一种常见的排序算法&#xff0c;它基于分治策略&#xff0c;将一个大问题分解为小问题来解决。归并排序的主要思想是将待排序的数组分成两个子数组&#xff0c;分别对这两个子数组进行排序&#xff0c;最后将两个有序的子数组合并成一个有序的数组…

Openlayers入门,Openlayers调整中心点坐标、Openlayers调整缩放级别、Openlayers调整地图可视角度和地图复位

专栏目录: OpenLayers入门教程汇总目录 前言 本章介绍一下Openlayers最基础的调整中心点坐标方式、调整缩放级别、调整地图可视角度和地图复位的小功能示例,非常简单,可直接上手。 二、依赖和使用 "ol": "^6.15.1"使用npm安装依赖npm install ol@6…

重学C++系列之继承

一、什么是继承 继承是面向对象三大特性之一&#xff0c;C中&#xff0c;被继承的类称为基类&#xff08;父类&#xff09;&#xff0c;继承别的类的类成为派生类&#xff08;子类&#xff09;&#xff0c;继承除了基类的构造函数和析构函数不继承外&#xff0c;其余成员全部继…

【安卓】视频播放器实现过程,超详细注释,自定义视频进度条,打开本地文件播放视频等功能。

一、实现效果 废话不多说&#xff0c;直接上代码&#xff0c;里面有详细注释&#xff0c;不清楚的评论区留言。 二、布局代码 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res…