STM32基础篇:I2C通信协议

news2024/9/25 13:25:00

I2C总线

I2C(IIC---Inter Integrated Circuit  内部集成电路)

以上为I2C大体结构图,其中时钟线SCL用于传输时钟信号,数据线SDA来传输实际的数据。


主机与从机

1.主机的职责

假如由从机1和从机2,从机1想向SDA上发送一个低电平,从机2想向SDA上发送一个高电平,如此同一时刻就会发生冲突。为了避免冲突的发送,必须对总线的使用情况做一个管理。

我们规定:在同一时刻,只允许有一个设备向外去发送数据。此规则由主机负责管理,因此主机相当于I2C总线的管理员。


1、波特率的选择

I2C总线中,由主机产生SCL信号,通过SCL线分配给所有从机。因此主机可以通过控制时钟信号频率来调节波特率(即:控制通信速度)。

2、数据通信的方向

仅又主机可以主动向从机发起数据传输,从机不能主动向主机发送数据,必须等待主机读取从机时,从机才能把准备好的数据发送给主机。

传输方向有:主机-->从机、从机-->主机,不存在从机-->从机。


2.数据接收和发送

每个从机都有一个8位的地址,且地址最后一位X的取值代表读(1)或写(0);

主机在总线上发送地址后才能与对应的从机通信,且通信开始与结束都由主机决定;

当SCL为高电平时,SDA上的数据是不允许变化的,因为SCL在高电平时采集数据(起始、停止除外)。


3.I2C数据帧格式

空闲:SCL和SDA均为高电平。

起始位:当SCL为高电平时,SDA由1置0;

停止位:当SCL为高电平时,SDA由0置1;

应答ACK:主机每向从机发送一帧数据后,会立刻释放掉SDA占控权,此时SDA为高电平;随后从机立刻发送一个低电平,表示“收到”。同样,主机接收到从机发送的数据后,也会向从机发送ACK,表示接收到了。


I2C模块简介

在STM32内部有两个I2C模块(即I2C1、I2C2),挂在APB1总线上。每个I2C模块有三个引脚,分别为:SCL、SDA、SMBA;本文不涉及SMBA引脚的讲述。

如下为I2C引脚的重映射(C8T6为例):

复用功能Remap=0Remap=1
I2C1_SCLPB6PB8
I2C1_SDAPB7PB9
I2C1_SMBAPB5
I2C2_SCLPB10/
I2C2_SDAPB11/
I2C2_SMBAPB12/

寄存器组与内部结构

1.内部结构

如下为I2C内部结构框图:

不管是I2C1还是I2C2,这两个片上外设的时钟都来自于PCLK1,顺着时钟往里走,有个SCL控制电路模块,将PCLK1转换为SCL信号,并且通过配置CCR来控制SCL的频率以及形状

对于SDA,其结构与USART类似,具有双缓冲结构(图中绿色部分)。


2.I2C的初始化

首先将SDA、SCL引脚设置为开漏模式(实现“线与”),然后开启I2C时钟,配置寄存器参数,最后闭合总开关。


3.速度模式

对于I2C的时钟信号,有5种速度(频率)可选择,如下:

速度模式波特率max
标准模式(Sm)100K
快速模式(Fm)400K
快速增强模式(Fm+)1M
高速模式(HSm)3.4M
超快速模式(UFm)5M

而对于STM32,只有标准模式和快速模式,即波特率最大为400K。


一些标志位

BUSY标志位:用于查询总线的空闲状态,0-总线空闲、1-总线忙碌。

START位:用于产生一个起始位,写1-产生起始位、产生后START自动置0。

STOP位:用于产生一个停止位,写1-产生停止位、写0-无停止位。当STM32作主机接收从机数据时,当发送完NAK信号后,要立刻发送停止位。

SB标志位:用于检测起始位是否发送完成,0-没有发生完成、1-发生完成。

AF、ADDR标志位:当寻址或数据发送成功时,ADDR=1(相当于收到ACK信号)、寻址或数据发送失败,AF=1(相当于收到NAK信号)。

在使用AF之前,通常要先对其清零。对于ADDR,当我们先读取SR1寄存器,再读取SR2寄存器后,就会清除ADDR(不要问为什么,ST公司就是这么设计的)

TxE标志位:1-发送数据寄存器TDR为空、0-TDR里面还有待发送的数据。

RxNE标志位:1-接收数据寄存器RDR非空,0-RDR为空。

BTF标志位:发送数据时:1-TDR和移位寄存器均为空,代表数据发送完成、0-数据未发送完成;接收数据时:1-RDR和移位寄存器均非空、0-相反。

ACK位:将ACK位写1-STM32芯片发送出ACK信号,写0-则发送NAK信号。注意,ACK只发送在正在进入移位寄存器或即将进入移位寄存器的字节之后。


I2C通信接收数据的一般流程:

I2C通信发生数据的一般流程:

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

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

相关文章

瞬态太阳光模拟器特点

技术指标与主要功能 瞬态太阳光模拟器是一种高端的分析仪器,主要用于能源科学技术、环境科学技术和资源科学技术领域。它能够模拟太阳光的光谱、光强和光照条件,为实验室环境中的光伏电池及其他太阳能设备提供稳定可靠的光照环境。技术指标包括但不限于辐…

AI与PS:技术革命下的设计工具比较

在数字化时代,人工智能(AI)和 Photoshop(PS)已成为创新和创意的两大支柱。虽然它们在某些方面有所交集,但本质上却有着根本的不同。本文将深入探讨这两者的不同之处,帮助你更全面地理解 AI 和 P…

《学会 SpringMVC 系列 · 剖析出参处理》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

知乎问答广告开户收费,知乎广告投放价格!

知乎,作为中国最大的知识分享社区,凭借其庞大的用户基础、高质量的内容生态和精准的数据分析能力,成为了众多企业争相投放广告的热门平台。如何在知乎上精准投放广告,实现品牌曝光与业绩增长,成为了众多企业面临的难题…

LeNet5模型搭建

文章目录 LeNet1 搭建模型2 训练模型3 测试模型3.1 预测一3.2 预测二 LeNet LeNet 诞生于 1994 年,是最早的卷积神经网络之一,并且推动了深度学习领域的发展。自从 1988 年开始,在许多次成功的迭代后,这项由 Yann LeCun 完成的开拓…

阿里云ECS之AMD实例

阿里云ECS之AMD实例 计算型实例规格族c8a关于AMD实例的使用AMD的应用场景 关于AMD实例,AMD实例也是云服务器ECS中的一种,AMD实例是阿里云新推出的重磅产品,基于AMD EPYCTM微处理器架构,该架构属于x86架构。目前已知的AMD实例规格族…

【RISC-V设计-09】- RISC-V处理器设计K0A之CIC

【RISC-V设计-09】- RISC-V处理器设计K0A之CIC 文章目录 【RISC-V设计-09】- RISC-V处理器设计K0A之CIC1.简介2.顶层设计3.端口说明4.代码设计5.仲裁代码6.总结 1.简介 核内中断控制器(Core Interrupt Controller,简称CIC)是管理和仲裁中断的…

SQL注入实例(sqli-labs/less-18)

0、初始页面 先使用brup爆破密码,账号admin,密码admin 1、确定闭合字符 判断注入点在post请求参数的User-agent处 闭合字符为单引号 2、爆库名 3、爆表名 4、爆列名 5、查询最终目标 在index.php中有这么一句 $insert"INSERT INTO security.uage…

MySQL基础——数据库客户端,数据库服务器,数据库(目录)

什么是数据库 具体:mysqld服务器结合内部的存储引擎所实现对数据库文件中的数据增删查改的一套方案 ——在磁盘或内存中存储特定结构组织的数据----在磁盘中存储的一套数据方案, 你给我字段或要求,我直接给你结果就行 整体:用户通…

gradio之进度条

输出控件显示进度,进度结束显示控件结果 import gradio as gr import timedef slowly_reverse(word, progressgr.Progress()):progress(0, desc"Starting")time.sleep(1)progress(0.05)new_string ""for letter in progress.tqdm(word, desc&…

概率论原理精解【9】

文章目录 集类拓扑空间基 参考文献 集类 C是一个集类(以G的某些子集为元素的集合称为G的集类)。 A i ∈ C , ∩ i 1 n A i ∈ C , 此为有限交封闭 C 所得集类 C ∩ f A_i \in C,\cap_{i1}^nA_i \in C,此为有限交封闭C所得集类C_{\cap f} Ai​∈C,∩i1n…

2024年黑龙江公安招聘报名流程(建议电脑)

2024年黑龙江省公安机关人民警察专项招录公告(2810人) 报名时间:2024年8月16日9:00至8月20日17:00 查询资格审查结果时间:2024年8月16日9:00至8月20日17:00 缴费确认时间:2024年8月16日9:00至8月21日17:00 网上打印准考…

程序员保碗之策

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 1. **持续深化技术实力:从基础到前沿**夯实基础紧跟技术前沿跨领域融合 2. **提升实战能力:从项目到产品**参与实际项目自主实践产品思维 3. **建立个人品牌与影响力&#xff…

代码随想录算法训练营day36:动态规划04:1049.最后一块石头的重量II;494.目标和;474.一和零

1049.最后一块石头的重量II 力扣题目链接(opens new window) 有一堆石头&#xff0c;每块石头的重量都是正整数。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果如下&…

WEB应用(十五)---文件包含

文件包含的概念 在各种开发语言中都提供了内置的文件包含函数&#xff0c;可以使得开发人员在一个代码文件中直接包含&#xff08;引入&#xff09;另外一个代码文件。 由于文件包含可以达到复用和方便修改的目的&#xff0c;在代码设计中常常使用。 大多数情况下&#xff0…

构建生成工具cmake的使用(2)

一.制作库文件 Linux下动态库是以 .lib开头&#xff0c;以 .so为结尾。静态库以 .lib 开头&#xff0c;.a为结尾。 Windows下动态库以dll为结尾&#xff0c;以 .lib为结尾 1.1.cmake编写生成动态库 我们想把add.cc和sub.cc打成一个动态库 …

Spring Boot 3.x Rest API最佳实践之统一响应结构

上一篇&#xff1a;Spring Boot 3.x Rest API最佳实践之API实现 下一篇&#xff1a;Spring Boot 3.x Rest API统一异常处理最佳实践 前面我们完成了电商示例API的设计和简单实现&#xff0c;本小节在此基础上完成统一响应结构的实战。 文章目录 定义Response响应体拦截Rest A…

【Day04】0基础微信小程序入门-学习笔记

文章目录 基础加强学习目标自定义组件1. 创建与引用2. 样式3. 数据、方法和属性4. 数据监听器5. 纯数据字段6. 组件生命周期6.1 created6.2 attached&#xff08;使用最多&#xff09;6.3 detached6.4 定义生命周期函数 7. 组件所在页面的生命周期7.1 定义使用7.2 生成随机的RG…

【QGroundControl二次开发】九. QGC地面站替换自定义MAVLINK协议

一. 生成自定义mavlink协议 具体操作参考之前文章->【QGroundControl二次开发】四.QGC自定义MAVLink消息 -------------------------下面为具体操作--------------------------- 在mavlink源码下的mavlink-master\message_definitions\v1.0\common.xml加入自定义协议&…

(javaweb)请求响应postman

目录 一.请求响应概述 二.请求参数的接收及封装 1.postman 2. 简单参数 3.实体参数 4.数组集合参数 5.日期参数 6.JSON参数 二.设置响应数据 一.请求响应概述 1.Tomcat又称为servlet容器 前端浏览器发起请求携带http请求数据&#xff0c;web服务器负责请求协议的解析&a…