I2C收发引擎及从机软件的实现原理分析

2024-02-28 13:38

本文主要是介绍I2C收发引擎及从机软件的实现原理分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

I2C通信协议的本质其实就是基本的帧通信.之后附加了一些基本功能.

  1. 所有的同步通信都需要一根同步信号线/时钟线, 和若干根数据线. 发送方在同步信号线的无效状态下准备好新的数据放到数据线上, 在进入有效状态后保持数据不变, 接收方在同步信号线的有效状态下读取数据.

  2. 抛开数据的具体内容不谈, 一个基本的帧通信包括: 开始信号(START) + 通信数据流 + 帧结束信号(STOP). I2C使用SCL高电平下SDA的下降沿表示开始信号, 而不需要浪费一个专用字符来表示开始. 同样, 使用SDA高电平下SDA的上升沿表示结束信号. 在数据传输过程中, SDA为一根串行数据线, SCL为同步/时钟线, 高电平有效, 低电平无效, 高低变化的频率限制了串行数据传输的速率.

  3. 为了保证数据通信正确被接收, I2C对每个接收数据的设备(主机或者从机)要求, 在收到数据收要发送应答信号(ACK), 发送方收到接收方的应答信号后才会发送下一个数据.

至此, I2C通信物理帧的定义结束, MCU硬件实现的也是这个层面上的通信, 所以I2C通信引擎在硬件上也可以使用中断或进一步使用DMA进行传输. 至于I2C通信中"设备地址"和"寄存器地址"的概念, 都是协议层面上的约定, 应交由软件处理.

使用I2C对数据内容的常规约定:

  1. 在任何情况下, START都是从主机发出, 之后发送的一个有效数据是从机设备地址. 对于从机MCU硬件实现, 这个阶段也会用从机地址同本机设备地址进行匹配.

  2. 从机设备地址后紧跟寄存器访问地址. 对于从机MCU硬件实现, 这个阶段会将这个寄存器地址写入到从机设备的"当前读写指针/地址"寄存器中, 这个指针在后续的读或者写过程中都会被用到. 到此时可称为"主机的发起过程".

  3. 如果是写数, 主机继续发送待写数据, 从机每接收一个数据, 就写入到"读写指针"指定的位置, 然后递增"读写指针".

  4. 如果是读数, 从机从设备地址的最后一位中就能判断此时的角色. 发送应答信号(应答表示设备地址的数据)之后, 立刻切换成发送模式开始发数. 主机在收到之前发送设备地址对应的应答信号之后, 就立即切换成收数模式, 之后在收到从机发过来的数据之后逐个回复应答, 回复NACK就告诉从机不要再发了. 从机在收到主机发送的NACK之前会不停发数并更新"读写指针".

同其它主从通信系统中的从机实现类似, 从机所有的动作都是在中断中, 由主机驱动触发. 从机内部可以实现一个状态机.

这篇关于I2C收发引擎及从机软件的实现原理分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/755660

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可