嵌入式学习笔记——I2C

IIC协议详解

    • 一、IIC协议简介
    • 二、IIC总线结构图
    • 三、IIC通信流程详解
      • 1. 空闲状态 : 双高空闲
      • 2. 起始信号(START): 时高数下开始
      • 3. 停止信号(STOP): 时高数上结束
      • 4. 数据传输格式 : 时高数稳,时低数变
      • 5. 应答信号
    • 四、写操作流程
    • 五、读操作流程
    • 六、IIC代码(STM32)详解
      • 1. 初始化函数
      • 2. 写数据函数(主写从)
    • 七、小结
    • 八、常见问题

一、IIC协议简介

IIC(I²C)是由飞利浦公司提出的一种串行通信协议,仅用两根线:

  • SDA:串行数据线
  • SCL:串行时钟线

它是一种半双工、多主机、主从通信协议,每个从设备都有唯一的地址。数据传输速度支持:

  • 标准模式:100kbps
  • 快速模式:400kbps
  • 高速模式:3.4Mbps

二、IIC总线结构图

两条总线连接主从设备,SDA和SCL均需上拉电阻保持高电平(空闲状态)。

三、IIC通信流程详解

1. 空闲状态 : 双高空闲

SDA 和 SCL 都为高电平时为空闲状态

2. 起始信号(START): 时高数下开始

在 SCL 为高电平时,SDA 从高变低,表示通信开始。

3. 停止信号(STOP): 时高数上结束

在 SCL 为高电平时,SDA 从低变高,表示通信结束。

4. 数据传输格式 : 时高数稳,时低数变

  • 数据按字节(8位)发送
  • 每个字节后跟一个应答位(ACK)
  • 传输过程中,SDA 数据需在 SCL 高电平期间稳定
    当SCL为高电平时,便会获取SDA数据值,其中SDA数据必须是稳定的(若SDA不稳定就会变成起始/停止信号)。
    当SCL为低电平时,便是SDA的电平变化状态。
    若主从机在传输数据期间,需要完成其它功能(例如一个中断),可以主动拉低SCL,使I2C进入等待状态,直到处理结束再释放SCL,数据传输会继

5. 应答信号

I2C总线上的数据都是以8位数据(字节)进行的,当发送了8个数据后,发送方会在第9个时钟脉冲期间释放SDA数据,当接收方接收该字节成功,便会输出一个ACK应答信号,当SDA为高电平,表示为非应答信号NACK,当SDA为低电平,表示为有效应答信号AC

  • ACK:SDA 被接收方拉低,表示接收成功
  • NACK:SDA 保持高电平,表示接收失败或结束

四、写操作流程

  1. 主机发送起始信号
  2. 发送从机地址 + 写方向(最低位,第八位为0)
  3. 等待从机应答ACK
  4. 发送寄存器地址和数据
  5. 每发送1字节都需从机应答
  6. 最后发送停止信号

五、读操作流程

  1. 主机发送起始信号
  2. 发送从机地址 + 写方向(0)
  3. 等待应答,发送寄存器地址
  4. 发送重新开始信号(重复START): 主机要改变通信模式(主机将由发送变为接收,从机将由接收变为发送),所以主机重新发送一个开始start信号,然后紧跟着发送一个从机地址,注意此时该地址的第8位为1,表明将主机设置成接收模式,开始读取数据
  5. 发送从机地址 + 读方向(1)
  6. 接收数据,每接收一个字节主机需发送 ACK
  7. 最后一个字节发 NACK + 停止信号

六、IIC代码(STM32)详解

1. 初始化函数

void I2C_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;I2C_InitTypeDef I2C_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  // 开启GPIOB时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);   // 开启I2C1时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; // SCL = PB6, SDA = PB7GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;        // 复用开漏输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);                 // 初始化GPIOBI2C_InitStructure.I2C_Mode = I2C_Mode_I2C;             // I2C模式I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;     I2C_InitStructure.I2C_OwnAddress1 = 0x00;              // 本机地址I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;            // 打开应答I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 100000;             // 100kHz速率I2C_Init(I2C1, &I2C_InitStructure);I2C_Cmd(I2C1, ENABLE);  // 使能I2C
}

2. 写数据函数(主写从)

void I2C_SendData(uint8_t slaveAddress, uint8_t* pBuffer, uint16_t numByteToWrite)
{I2C_GenerateSTART(I2C1, ENABLE);  // 产生起始信号while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));I2C_Send7bitAddress(I2C1, slaveAddress, I2C_Direction_Transmitter); // 发地址+写方向while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));while (numByteToWrite--){I2C_SendData(I2C1, *pBuffer++);  // 发送数据while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // 等待发送完成}I2C_GenerateSTOP(I2C1, ENABLE); // 发送停止信号
}

七、小结

名称描述
SDA数据线(双向)
SCL时钟线(主机控制)
STARTSDA下降沿 + SCL高,表示开始
STOPSDA上升沿 + SCL高,表示结束
ACK/NACK接收方对字节的响应

八、常见问题

  • 为什么要加上拉电阻?
    因为SDA/SCL为开漏结构,无法主动输出高电平。
  • 为什么要重复发送START?
    切换读写模式或设备地址时,需发START而不是STOP。

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

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

相关文章

Apifox Helper 与 Swagger3 区别

核心定位差异 Apifox Helper 定位:基于 IDEA 的代码注释解析工具,与 Apifox 平台深度集成,实现文档自动生成接口管理测试协作的一体化流程。 特点: 通过解析 Javadoc、KDoc 等注释生成文档,代码零侵入(无…

单片机实现多线程的方法汇总

在单片机上实现“多线程”的方法有几种,下面按照从简单到复杂、从轻量到系统性来列出常见的方案: 🧵 一、伪多线程(最轻量) 方法:主循环 状态机 / 定时器轮询 主循环中轮流调用各个任务的处理函数&#x…

网络:华为数通HCIA学习:静态路由基础

文章目录 前言静态路由基础静态路由应用场景 静态路由配置静态路由在串行网络的配置静态路由在以太网中的配置 负载分担配置验证 路由备份(浮动静态路由)配置验证 缺省路由配置验证 总结 华为HCIA 基础实验-静态路由 & eNSP静态路由 基础…

[项目总结] 在线OJ刷题系统项目技术应用(下)

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…

Qt音频输出:QAudioOutput详解与示例

1. 简介 QAudioOutput是Qt多媒体框架中的一个关键类,它提供了将PCM(脉冲编码调制)原始音频数据发送到音频输出设备的接口。作为Qt多媒体组件的一部分,QAudioOutput允许开发者在应用程序中实现音频播放功能,支持多种音…

【计算机网络】Linux配置SNAT/DNAT策略

什么是NAT? NAT 全称是 Network Address Translation(网络地址转换),是一个用来在多个设备共享一个公网 IP上网的技术。 NAT 的核心作用:将一个网络中的私有 IP 地址,转换为公网 IP 地址,从而…

Redis淘汰策略详解!

目录 一、为什么需要淘汰策略? 🤔二、Redis 的淘汰策略详解 👇三、如何选择合适的淘汰策略? 🤔➡️✅四、如何切换 Redis 的淘汰策略? ⚙️🔧五、总结 🎉 🌟我的其他文章…

存储基石:深度解读Linux磁盘管理机制与文件系统实战

Linux系列 文章目录 Linux系列前言一、磁盘1.1 初识磁盘1.2 磁盘的物理结构1.3 磁盘的存储结构1.4 磁盘的逻辑结构 二、文件系统2.1 系统对磁盘的管理2.2 文件在磁盘中的操作 前言 Linux 文件系统是操作系统中用于管理和组织存储设备(如硬盘、SSD、USB 等&#xff…

本节课课堂总结

匿名子类: 说明 和 Java 一样,可以通过包含带有定义或重写的代码块的方式创建一个匿名的子类。 单例对象(伴生对象) Scala语言是完全面向对象的语言,所以并没有静态的操作(即在Scala中没有静态的概念&a…

I²C、SPI、UART、CAN 通信协议详解

一、协议基本特性对比 特性ICSPIUARTCAN通信类型同步、半双工同步、全双工异步、全双工异步、多主多从信号线SDA(数据)、SCL(时钟)MOSI、MISO、SCK、SS(片选)TX(发送)、RX&#xff…

【diffusers 进阶(十五)】dataset 工具,Parquet和Arrow 数据文件格式,load dataset 方法

系列文章目录 【diffusers 极速入门(一)】pipeline 实际调用的是什么? call 方法!【diffusers 极速入门(二)】如何得到扩散去噪的中间结果?Pipeline callbacks 管道回调函数【diffusers极速入门&#xff0…

第十三章:持久化存储_《凤凰架构:构建可靠的大型分布式系统》

第十三章 持久化存储 一、Kubernetes存储设计核心概念 (1)存储抽象模型 PersistentVolume (PV):集群级别的存储资源抽象(如NFS卷/云存储盘)PersistentVolumeClaim (PVC):用户对存储资源的声明请求&#…

以太网安全

前言: 端口隔离可实现同一VLAN内端口之间的隔离。用户只需要将端口加入到隔离组中,就可以实现隔离组内端口之间的二层数据的隔离端口安全是一种在交换机接入层实施的安全机制,旨在通过控制端口的MAC地址学习行为,确保仅授权设备能…

跨域问题前端解决

由于浏览器的同源策略,前后端分离的项目,调试的时候总是会遇到跨域的问题,这里通过修改前端代码解决跨域问题。 首先先查看前端代码的根目录下,有没有vue.config.js文件, 若有,使用方法1,若没有此文件&…

Elasticsearch 报错index_closed_exception

index_closed_exception 是 Elasticsearch 中的一个异常类型,它通常发生在尝试对一个已经被关闭(closed)的索引执行搜索、写入或其他操作时。在 Elasticsearch 中,索引是用来存储和检索数据的逻辑命名空间,可以将其类比…

LearnOpenGL-笔记-其九

今天让我们完结高级OpenGL的部分: Instancing 很多时候,在场景中包含有大量实例的时候,光是调用GPU的绘制函数这个过程都会带来非常大的开销,因此我们需要想办法在每一次调用GPU的绘制函数时尽可能多地绘制,这个过程就…

PDF预览-搜索并高亮文本

在PDF.js中实现搜索高亮功能可以通过自定义一些代码来实现。PDF.js 是一个通用的、基于Web的PDF阅读器,它允许你在网页上嵌入PDF文件,并提供基本的阅读功能。要实现搜索并高亮显示文本,你可以通过以下几个步骤来完成: 1. 引入PDF…

二叉树——队列bfs专题

1.N叉树的层序遍历 我们之前遇到过二叉树的层序遍历,只需要用队列先进先出的特性就可以达到层序遍历的目的。 而这里不是二叉树,也就是说让节点的孩子入队列时不仅仅是左右孩子了,而是它的所有孩子。而我们看这棵多叉树的构造,它…

Python高级爬虫之JS逆向+安卓逆向1.1节-搭建Python开发环境

目录 引言: 1.1.1 为什么要安装Python? 1.1.2 下载Python解释器 1.1.3 安装Python解释器 1.1.4 测试是否安装成功 1.1.5 跟大神学高级爬虫安卓逆向 引言: 大神薯条老师的高级爬虫安卓逆向教程: 这套爬虫教程会系统讲解爬虫的初级&…

Windows 安装和使用 ElasticSearch

SpringBoot3 整合 Elasticsearch 1. ElasticSearch 1.1 ES (1)ES 是一个开源的分布式搜索和分析引擎,专为处理大模型数据而设计,它能够实现近乎实时的数据检索、分析和可视化,广泛用于全文搜索、日志分析和监控&…