关于 NXP PCA85073A 实时时钟读取数据时出现 IIC 传输失败的原因解析和解决方法

一、前言
     
      对使用 I2C 传输的 RTC 外设 PCA85073,在 I2C 传输过程中若有复位信号输入,则有概率出现 I2C 死锁的状态,即 SCL为高,SDA一直为低的现象。


二、I2C 基本协议

      在分析问题出现的原因之前,我们首先需对 I2C 信号进行解释。

      首先 SCL 时钟和 SDA 数据线都必须是双向开漏结构,通过总线上的上拉电阻拉到逻辑高电平,当 SCL 与 SDA 为都为高电平时,总线处于空闲状态。                                   

      当 SCL 为高,SDA 由高到低的变化为起始信号。
      当 SCL 为高,SDA 由低变高为结束信号,停止信号是由主机发出的。

      当 SCL 为低时,SDA 才能更改电平状态。


三、I2C “ 挂死 ” 原因解析

      由于是开漏的结构,当 I2C SDA 总线上有任何一个器件拉低总线电平的时候,其它任何器件都无法拉高 SDA 总线,如果 SDA 总线上有一个设备不释放总线,那么这条线会一直被这个设备占用,总线上的通信就会暂停。

      一般情况下,从设备在数据传输完成后就释放 SDA 线,总线就会恢复空闲状态。但在一些情况下,从设备会一直拉低 SDA 线不释放,这种一般被称为 “I2C 挂死 ”或 “I2C 死锁 ”。

      那么哪种情况下 I2C 会挂死呢?

      上面说过,只有当 SCL 为低电平时,SDA 才能变化电平状态,当 I2C 在传输过程中被意外中断,总线停留在 SCL 高,SDA 为低的情况,此时总线就会一直被占用,这种情况原因往往是从机拉低 SDA 不释放,因为若是主机拉低 SDA 不释放,我们能够去通过软件控制主机或者通过复位等操作去解决。而若是从机的原因,由于很多时候 I2C 从机不会带复位引脚,所以就算对整个系统进行复位也没办法解除这种状态,只能通过上下电进行恢复,这种操作对于很多时候都是无法接受的,例如需要连续运行进行计时的 RTC 外设。

      接下来我们继续分析

      首先需要看看哪些情况下 I2C 从机会需要拉低 SDA 线

  1. 传输数据时,从机发出 ACK 应答
  2. 读数据,从机传输 0 时会拉低 SDA

      那么出现挂死的最常见的情况就是主机在通讯的过程中产生了复位。由于复位动作通常会立刻执行,也就发不出完整的 CLK 了。那么等到主机复位完成回来后,SCL 为高,SDA 被从机拉低。主机无法发起 START 起始条件,不能开始下一次与从机的通讯,这称为 SDA 挂死。


四、问题解决方法

      根据 NXP 的 《I2C-bus specification and user manual》最简单的解决办法就是使用 GPIO 模拟 I2C 的连续 9 位时钟或者更多时钟,因为协议规定 I2C 的通常传输的数据宽度为 8 位和 1 位应答位,额外的时钟都会被认为是停止信号,所以不管从机处于何种状态,这种方法都能使从机释放 SDA ,进入正常的传输状态。


五、问题解决实例

      在使用 I2C 对实时时钟 PCA85073 读取数据过程,发现传输中间 MCU 出现复位则有概率出现 I2C 挂死的现象,通过 GPIO 模拟时钟信号可以使 PCA85073 释放 SDA 线,后续就能进行正常的数据读取,下图是通过 GPIO 模拟恢复正常传输的时序图。
 

六、参考文档

      [1] NXP《I2C-bus specification and user manual》

 登录大大通,了解更多详情,解锁1500+完整应用方案,更有大联大700+FAE在线答疑解惑!

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

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

相关文章

前端基础篇-深入了解 JavaScript(JSON、BOM、DOM 和事件监听)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 JS - JSON 2.0 JS - BOM 2.1 Window 浏览器窗口对象 2.2 Location 地址栏对象 3.0 JS - DOM 3.1 获取 HTML 元素对象 3.2 调用 Element 对象的属性、方法 4.0 事件…

威联通(QNAP) TS-466C NAS 开箱评测,4盘位NAS,N6005,存储服务器

威联通(QNAP) TS-466C 四盘位NAS (Network Attached Storage:网络附属存储) 开箱评测 之前用的TS-551经过几轮系统升级后明显感觉性能跟不上了,变卡了,所以升级一下,换了TS-466C。 威联通迁移NAS还挺方便的,只有将原先NAS里的硬…

Spring Boot项目怎么从Nacos注册中心上获取其他服务列表信息?

一、前言 在spring boot项目开发过程中,为了进行微服务之间的调用,我们一般会使用注册中心,比如Nacos。假设我们有一个业务需求,应用A需要从Nacos注册中心上获取服务信息进行分析,需要怎么实现呢? 二、开…

数据结构(四)——串的定义和基本操作

四、串 4.1 串的定义和实现 4.1.2 串的定义 串:即字符串(String)是由零个或多个字符组成的有限序列。例:T‘iPhone 11 Pro Max?’子串:串中任意个连续的字符组成的子序列。 Eg:’iPhon…

蓝桥杯每日一题:血色先锋队

今天浅浅复习巩固一下bfs 答案&#xff1a; #include<iostream> #include<algorithm> #include<cstring>using namespace std; typedef pair<int,int> PII;const int N510; int n,m,a,b; int dist[N][N]; PII q[N*N]; int hh0,tt-1;int dx[]{1,0,-1,…

【医学图像处理】ECAT和HRRT格式转nii格式【超简单】

之前从ADNI上下载PET数据的时候发现有许多数据的格式不是DICOM的而是ECAT或者是HRRT格式&#xff0c;这对原本就少的PET数据是血上加霜啊。 当然只使用DICOM格式的数据也会得到不少的数据&#xff0c;我一开始也是只使用DICOM格式的样本&#xff0c;后来为了得到更多的数据&a…

【LabVIEW FPGA入门】浮点数类型支持

如今&#xff0c;使用浮点运算来设计嵌入式系统的需求变得越来越普遍。随着 FPGA 因其固有的大规模并行性而在浮点性能方面继续超越微处理器&#xff0c;这种情况正在加剧。线性代数和数字信号处理 (DSP) 等高级算法可以受益于浮点数据类型的高动态范围精度。LabVIEW FPGA 通过…

力扣hot100:33. 搜索旋转排序数组(二分的理解)

33.搜索旋转排序数组 ​ 这是一个非常有趣的问题&#xff0c;如果不要求使用O(logn)应该没人会想到吧。。 方法一&#xff1a; 极致的分类讨论。旋转排序数组&#xff0c;无非就是右边的增区间的数小于左边的增区间的数&#xff0c;然后依次排序。因此我们只需要分三类讨论即可…

CMAKE_CUDA_ARCHITECTURES set to ‘native’多版本与版本号矛盾问题,报错

CMAKE_CUDA_ARCHITECTURES set to ‘native’多版本与版本号矛盾问题&#xff0c;报错 1. 报错提醒如下图2. 原因本地安装多个cuda版本导致native寻找到多个版本&#xff0c;导致报错3. 具体配置需要根据你的显卡型号来确认 1. 报错提醒如下图 2. 原因本地安装多个cuda版本导致…

【prometheus】k8s集群部署prometheus server(文末送书)

目录 一、概述 1.1 prometheus简介 1.2 prometheus架构图 1.3测试环境 二、k8s集群中部署prometheus server 2.1创建sa账号和数据目录 2.2安装prometheus 2.2.1创建configmap存储卷存放prometheus配置信息 2.2.2 通过deployment部署prometheus 2.2.3prometheus pod创…

ConsiStory:Training-Free的主体一致性生成

Overview 一、总览二、PPT详解 ConsiStory 一、总览 题目&#xff1a; Training-Free Consistent Text-to-Image Generation 机构&#xff1a;NVIDIA, Tel-Aviv University 论文&#xff1a;https://arxiv.org/pdf/2402.03286.pdf 代码&#xff1a;https://consistory-paper.g…

zookeeper快速入门三:zookeeper的基本操作

在zookeeper的bin目录下&#xff0c;输入./zkServer.sh start和./zkCli.sh启动服务端和客户端&#xff0c;然后我们就可以进行zookeeper的基本操作了。如果是windows&#xff0c;请参考前面章节zookeeper快速入门一&#xff1a;zookeeper安装与启动 目录 一、节点的增删改查 …

【Java基础知识总结 | 第三篇】深入理解分析ArrayList源码

文章目录 3.深入理解分析ArrayList源码3.1ArrayList简介3.2ArrayLisy和Vector的区别&#xff1f;3.3ArrayList核心源码解读3.3.1ArrayList存储机制&#xff08;1&#xff09;构造函数&#xff08;2&#xff09;add()方法&#xff08;3&#xff09;新增元素大体流程 3.3.2ArrayL…

react03

react03 修改脚手架创建的打包命令 根据scripts中的命令&#xff0c;执行npm run eject ,输入y, 如果对原始的脚手架文件有过改动需要进行将修改后的文件提交到git 历史区 &#xff0c;防止暴露后的代码覆盖我们自己的文件 git 提交&#xff1a; git add . git commit -m ‘…

java----网络编程(一)

一.什么是网络编程 用户在浏览器中&#xff0c;打开在线视频网站&#xff0c;如优酷看视频&#xff0c;实质是通过网络&#xff0c;获取到网络上的一个视频资源。 与本地打开视频文件类似&#xff0c;只是视频文件这个资源的来源是网络。所谓网络资源就是网络中获取数据。而所…

LabVIEW提升舱救援通讯监测系统

LabVIEW提升舱救援通讯监测系统 随着科技的进步&#xff0c;煤矿救援工作面临着许多新的挑战。为了提高救援效率和安全性&#xff0c;设计并实现了一套基于LabVIEW的提升舱救援通讯监测系统。该系统能够实时监控提升舱内的环境参数和视频图像&#xff0c;确保救援人员和被困人…

el-input设置max、min无效的解决方案

目录 一、方式1&#xff1a;type“number” 二、方式2&#xff1a;oninput&#xff08;推荐&#xff09; 三、计算属性 如下表所示&#xff0c;下面为官方关于max&#xff0c;min的介绍&#xff1a; el-input&#xff1a; max原生属性&#xff0c;设置最大值min原生属性&a…

06.共享内存

1.内存映射&#xff08;mmap&#xff09; 我们在单片机中首先接触到了映射的概念 将一个寄存器的地址映射到了另外的一个存储空间中 内存映射: 内存映射&#xff08;Memory Mapping&#xff09;是一种在计算机科学中使用的技术&#xff0c;它允许将文件或其他设备的内容映射…

idea warning:java源值已过时将在未来所有发行版中删除

在idea中运行maven项目 如果出现idea warning:java源值已过时将在未来所有发行版中删除&#xff0c;详见如下截图所示&#xff1a; 注意&#xff1a;jdk8 要解决这个警告需要设置3个地方 首先打开File->Project Structure中的Project&#xff0c;将SDK和language level都设…

五、保持长期高效的七个法则(二)Rules for Staying Productive Long-Term(1)

For instance - lets say youre a writer.You have a bunch of tasks on your plate for the day, but all of a sudden you get a really good idea for an essay. You should probably start writing now or youll lose your train of thought.What should you do? 举例来说…