根据逻辑分析仪实际波形,解析IIC通信及可能出现的问题(从机控制时钟SCL)

news2025/1/12 23:04:31

1、通信是信息的传递

1.1、信息

信息是多种多样的,在数字电路中,最基本的信息是高低电平,高低电平的提供需要电路转化的,维持高/低是要消耗能量的,信息需要借助能量来存在。

1.2、传递

从发送端传递到接收端需要媒介(物质),可以分为有线和无线。

2、IIC通信

2.1、通信角色(主机、从机)

IIC的全称是Inter IC,意为IC器件之间的通信协议,占主导地位、负责控制何时开始/结束通信、通信什么特定内容的器件称为主机,被控的器件称为从机。

主机:通常是可编程的控制端,比如各种单片机(stc8,stm8,stm32);

从机:通常是实现具体功能的,比如电池管理(电量计bq40z50)、屏幕显示(0.96寸OLED),数据存储器(AT24C02);

2.2、通信角色(发送端、接收端)

7位从机地址,加1位读写控制,这个读写控制的就是发送/接收的角色转换

主机首先作为发送端,7位从机地址+1位写,代表主机向从机写数据,主机将继续作为发送端,那么从机就是接收端;

主机首先作为发送端,7位从机地址+1位读,代表主机从从机读数据,主机将转而作为接收端,那么从机就是发送端;

2.3、通信的开始和结束信号

起始信号:SCL 是高电平时, SDA 由高电平向低电平切换
结束信号: SCL 是高电平时 , SDA 由低电平向高电平切换

2.4、通信的最小单位(位传输)

通信其实就是要做到:发送端发送什么,接收端就接收什么。

比如要传输0x16,二进制00010110,下图是单独数据线SDA的0x16的波形,如果你是接收端如何解析,会不会把3个0当成2个0?会不会刚好检测到01的跳变的时候导致数据错误?

有了时钟,我们就可以解决:

1、每个位的长度:1个时钟周期代表1个位;

2、数据检测的时机:高电平数据有效,低电平允许数据变化;

下图是时钟SCL和数据SDA的共同波形,现在你就可以清楚地知道发送的数据是什么了。

补一个位传输的时序图:

2.5、通信的一个个数据(字节传输)

传输8个位就是1个字节,需要注意的是先传输MSB,也就是最高位。

2.6、响应

响应是在发送端发送一个字节的数据后,下一个时钟周期高电平期间,数据线上的电平状态,低电平0代表响应,高电平1代表不响应;

不管是响应ACK还是不响应NACK,都是通信过程中的一个信息。

3、实例

3.1、从机(电量计应用手册)要求的IIC通信流程如下:

“主机-发送端”:起始位

“主机-发送端”:地址+写

“从机-接收端”:ACK

“主机-发送端”:Gauge指令

“从机-接收端”:ACK

“主机-发送端”:重新起始位

“主机-发送端”:地址+读

“从机-接收端”:ACK

“从机-发送端”:第一个字节

“主机-接收端”:ACK

“从机-发送端”:第二个字节

“主机-接收端”:NACK (表示主机读取数据完毕)

“主机-发送端”:停止位

3.2、逻辑分析仪波形

3.2.1、先看实际总体的波形

从波形和右下角IIC解析结果,可以看到数据通信是成功的。

由于是GPIO口模拟IIC,受程序中别的代码影响,时钟SCL并不是标准的占空比50%的固定频率的时钟,大概是占空比为46%、74KHz的时钟;

从这里也可以反映出前面2.4节说的时钟的必要性,现实情况下难免不准,每个位的时间并不是固定的。

3.2.2、起始+寻址+应答过程

都在图中标了,位传输、从机应答信号

3.2.3、主机寻址后发送第一个数据+应答过程

可以看到第二次的应答非常慢,一开始这里认为从机有问题,一直没有ACK应答,后来才发现是有应答的,但是要等很久。

3.2.4、应答信号不在下一个周期,不代表从机没有应答

主机等待从机应答信号,不一定是发送完数据的下一个时钟周期就能等到,可能要等多个时钟周期,可以用标尺对比一下两次的从机应答时间。

 3.2.5、从机需要准备数据之后,再发送数据

一开始是以为主机寻址从机应答,之后就可以直接开始读数据了,但是读不到,后面发现从机无法在收到主机读指令之后就准备好数据,要等待多个时钟周期,这个延时大概都是50us左右。

4、从机也是控制时钟SCL的

3.2.3和3.2.5中出现的问题,都是因为不知道从机也是可以控制时钟的,我一直错误地记忆主机控制时钟,从机根据时钟接收/发送数据。

下图来自《I2C总线规范》的第4章“I2C总线的概念” ,提到了慢速从机器件可以控制并延长时钟信号。

下图来自《TI 电量计应用指导》的5.2.1 电量计通信协议,也提到,如果从设备不能马上响应,会把时钟线hold住延长,等可以响应了再释放。

这就解释了实际波形中,从机应答和从机发送数据前,出现的SCL线较长时间被拉低的现象。

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

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

相关文章

【复杂网络建模】——ER网络和SF网络的阈值分析

目录 1、介绍ER网络和SF网络 2、计算网络阈值 2.1 ER(Erdős-Rnyi)网络 2.2 SF(Scale-Free)网络 3、 研究网络阈值的意义 1、介绍ER网络和SF网络 在复杂网络理论中,ER网络(Erdős-Rnyi网络&#xff…

C++------map和set的使用

文章目录 关联式容器键值对树型结构的关联式容器set的介绍map的介绍 关联式容器 什么是关联式容器&#xff1f;它与序列式容器有什么区别&#xff1f; 关联式容器也是用来存储数据的&#xff0c;与序列式容器不同的是&#xff0c;其里面存储的是<key&#xff0c;value>结…

数据库备份和Shell基础测试及AWK(运维)

第一题&#xff1a;简述一下如何用mysql命令进行备份和恢复&#xff0c;请以test库为例&#xff0c;创建一个备份&#xff0c;并再用此备份恢复备份 备份步骤&#xff1a; 备份test库&#xff1a;使用mysqldump命令备份test库&#xff0c;并将备份写入一个.sql文件中。命令示例…

C语言基础之——结构体

前言&#xff1a;小伙伴们又见面啦&#xff0c;那么本篇文章&#xff0c;我们就将对C语言基础知识的最后一个章节——结构体展开讲解。 世上无难事&#xff0c;只要肯攀登&#xff01; 目录 一.什么是结构体 二.结构体讲解 1.结构体的声明和变量的定义 2.结构体成员的类型…

〖Python网络爬虫实战㉞〗- 图形验证码OCR识别

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;订阅本专栏前必读关于专栏〖Python网络爬虫实战〗转为付费专栏的订阅说明作者&#xff1…

操作系统_文件管理(三)

目录 3. 文件系统 3.1 文件系统结构 3.2 文件系统布局 3.2.1 文件系统在磁盘中的结构 3.2.2 文件系统在内存中的结构 3.3 外存空闲空间管理 3.3.1 空闲表法 3.3.2 空闲链表法 3.3.3 位示图法 3.3.4 成组链接法 3.4 虚拟文件系统 3.5 分区和安装 3.6 小结 3. 文件系…

Javaweb入门

Spring Spring发展到今天已经形成一种开发生态圈&#xff0c;Spring提供若干个子项目&#xff0c;每个项目用于完成特定的功能。 Spring Boot可以帮助我们非常快速的构建应用程序、简化开发、提高效率 SpringBootWeb入门 需求&#xff1a;使用Spring Boot开发一个web应用&a…

不同代码写法的区别

目录 神经网络中输入在layer中写输入在build中写输入 输出format写法f代替format写法 zip不加*加* 打平Flatten方法reshape方法 数据打包(batch)tensorflowpytorch 神经网络中输入 在layer中写输入 layers.Dense(512, activationrelu, namelayer1,input_shape(784,)),此处784…

C语言 实现atoi函数

实现类似atoi函数&#xff0c;把字符串“123456”转换成数值123456 函数int atoi(char *str); 使用ubuntu进行多文件编译&#xff08;main.c head.h test.c&#xff09; head.h&#xff08;预处理&#xff09; #ifndef __HEAD_H__ #define __HEAD_H__#include <stdio.…

freertos之信号量

介绍 信号量这个名字很恰当&#xff1a; 信号&#xff1a;起通知作用 量&#xff1a;还可以用来表示资源的数量 当"量"没有限制时&#xff0c;它就是"计数型信号量"(Counting Semaphores) 当"量"只有0、1两个取值时&#xff0c;它就是"二进…

2023必备AIGC人工智能软件Top 6

随着人工智能技术的迅猛发展&#xff0c;越来越多的应用程序开始集成AIGC&#xff08;Artificial Intelligence Generated Content&#xff0c;人工智能生成内容&#xff09;功能&#xff0c;为用户提供更高效、更创造性的体验。在本文中&#xff0c;我们将分享6款实用的AIGC软…

C++ DAY7

一、类模板 建立一个通用的类&#xff0c;其类中的类型不确定&#xff0c;用一个虚拟类型替代 template<typename T> 类template ----->表示开始创建模板 typename -->表明后面的符号是数据类型&#xff0c;typename 也可以用class代替 T ----->表示数据类型…

php开发环境搭建_宝塔、composer

宝塔面板下载&#xff0c;免费全能的服务器运维软件 一 下载宝塔面板 解压安装 登录之后修改安全入口 1 进入软件商店下载nginx,mysql5.6,php7.2 2 将php的安装路径配置到环境变量中 此电脑--右键--点击属性---高级系统设置---环境变量---系统变量path---添加确定 输入php -v…

DC/DC开关电源学习笔记(三)开关频率和储能元件

&#xff08;三&#xff09;开关频率和储能元件 1.开关频率2.储能元件 1.开关频率 频率是开关电源的一个基本属性&#xff0c;它代表了直流电压开启和关断的速率。了解开关频率就可以了解实际应用中电源线路的工作原理。 开关电源利用开关动作将直流电转换为特定频率的脉冲电…

【教程】部署apprtc服务中安装google-cloud-cli组件的问题及解决

前置条件 已经安装完成node&#xff0c;grunt&#xff0c;node 组件和python pip包等。需要安装google-cloud-cli组件。 Ubuntu安装google-cloud-cli组件 apprtc项目运行需要google-cloud-cli前置组件&#xff0c;且运行其中的dev_appserver.py。 根据google官方的关于安装g…

应用于伺服电机控制、 编码器仿真、 电动助力转向、发电机、 汽车运动检测与控制的旋变数字转换器MS5905P

MS5905P 是一款 12bit 分辨率的旋变数字转换器。 片上集成正弦波激励电路&#xff0c;正弦和余弦允许输入峰峰值 幅度为 2.3V 到 4.0V &#xff0c;可编程激励频率为 10kHz 、 12kHz 、 15kHz 、 20kHz 。 转换器可并行或串行输出角度 和速度对应的数字量。 MS5905…

第 3 章 栈和队列(顺序栈,算法 3.1 、3.2、3.4)

1. 示例代码&#xff1a; 1) status.h /* DataStructure 预定义常量和类型头文件 */#ifndef STATUS_H #define STATUS_H/* 函数结果状态码 */ #define TRUE 1 /* 返回值为真 */ #define FALSE 0 /* 返回值为假 */ #define RET_OK 0 /* 返回值正确 */ #d…

Python Opencv实践 - Canny边缘检测

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_GRAYSCALE) print(img.shape)#图像Canny边缘检测 #cv.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradien…

【第1章 数据结构概述】

目录 一. 基本概念 1. 数据、数据元素、数据对象 2. 数据结构 二. 数据结构的分类 1. 数据的逻辑结构可分为两大类&#xff1a;a. 线性结构&#xff1b;b. 非线性结构 2. 数据的存储结构取决于四种基本的存储方法&#xff1a;顺序存储、链接存储、索引存储、散列存储 3. …