当前位置: 首页 > news >正文

【嵌入式学习笔记】嵌入式入门7——IIC总线协议

1.IIC简介

IIC即Inter Integrated Circuit,集成电路总线,是一种同步,串行,半双工通信总线。
IIC总线协议——总线就是传输数据通道,协议就是传输数据的规则
,有以下特点:

  • 由时钟线SCL和数据线SDA组成,并且都接上拉电阻,确保总线空闲状态为高电平
  • 总线支持多设备连接,允许多主机存在,每个设备都有一个唯一的地址
  • 连接到总线上的数目受总线的最大电容400pf限制
  • 数据传输速率:标准模式100k bit/s 快速模式400k bit/s 高速模式3.4Mbit/s
    在这里插入图片描述

IIC协议时序

在这里插入图片描述
在这里插入图片描述

IIC通信过程

  • 写操作过程
    在这里插入图片描述
  • 读操作过程
    在这里插入图片描述

2.EEPROM与24C02简介

EEPROM是一种掉电后数据不丢失的储存器,常用来存储一些配置信息,在系统重新上电时就可以加载
AT24C02是一个2K bit的EEPROM存储器,使用IIC通信方式。
在这里插入图片描述

  • A0/1/2 : 设备地址决定引脚
  • WP : 写保护引脚
  • SCL : 时钟线
  • SDA : 数据线

24C02的通讯地址

在这里插入图片描述

24C04的储存范围是4Kbit=512KB,使用8位地址无法表示全其储存地址(28=256KB),需要在设备地址中借位(29=512KB)

24C02的读写时序

  • 写操作
    字节写模式:一个地址一个数据进行写入。
    页写模式:连续写入数据。只需要写一个地址,连续写入数据时地址会自增,但存在页的限制,超出一页时,超出数据覆盖原先写入的数据。但读会自动翻页。

  • 读操作
    当前读模式:基于上一次读/写操作的最后位置继续读出数据。
    随机地址读模式:指定地址读出数据。
    顺序读模式:连续读出数据。

  • 写操作过程(字节写入/页写入)
    注意:EEPROM比较慢,必须等到10ms后再写下一个字节
    在这里插入图片描述
    在这里插入图片描述

  • 读操作过程
    在这里插入图片描述

3.IIC协议驱动24C02实验

  • 硬件IIC——使用复杂、速度快、较稳定、特定引脚
  • 软件IIC——使用简单、速度较慢、稳定、任意引脚

推荐使用软件IIC,一是因为硬件IIC设计复杂,稳定性一般;二是因为软件IIC方便移植

3.1.IIC配置步骤

  • 使能SCL和SDA对应时钟——__HAL_RCC_GPIOB_CLK_ENABLE()
  • 设置GPIO工作模式——SDA开漏SCL推挽输出,使用HAL_GPIO_Init初始化
  • 编写基本信号——起始信号、停止信号、应答信号
  • 编写读和写函数——iic_read_byte、iic_send_byte
    注意:发送完成,主机释放SDA

为什么IIC总线SDA建议用开漏模式?

  • IIC的SDA脚即要作为输出,又要作为输入,用开漏输出模式,很好实现输出输入共用,避免IO模式频繁切换带来的麻烦。
  • 输出时:主机(MCU)输出0,可以拉低信号,实现低电平发送,主机输出1(实际不起作用),由外部上拉电阻上拉,实现高电平发送
  • 输入时:主机(MCU)设置输出1状态,此时因为MCU无法输出1,相当于释放了SDA脚,此时外部器件可以主动拉低SDA脚/释放SDA脚(同样由上拉电阻提供“输出1的功能”),实现SDA脚的高低电平变化。
  • 由于开漏输出模式下,MCU还是可以读取IDR状态寄存器,来获取引脚高低电平,因此MCU读取IDR,即可获得SDA脚的高低电平状态,从而实现输入检测。
    也可以参考http://t.csdn.cn/fLxa9和http://t.csdn.cn/3x1wU

3.2.24C02配置步骤

  • 初始化IIC接口
  • 编写写入/读取一个字节数据函数——遵循时序流程编写
  • 编写连续读和连续写函数——在上面的基础上进行实现

相关文章:

【嵌入式学习笔记】嵌入式入门7——IIC总线协议

1.IIC简介 IIC即Inter Integrated Circuit,集成电路总线,是一种同步,串行,半双工通信总线。 IIC总线协议——总线就是传输数据通道,协议就是传输数据的规则,有以下特点: 由时钟线SCL和数据线S…...

你永远想象不到有多折磨的 Android 开发 react-native gradle*!¥%#

很难过,拿到项目运行不起来,错误报告研究几天没研究明白,改代码,装gradle,忙和好久还是一个样,也不知道是码的问题还是什么,一开始 后面装完gradle,不报错了,但是也跑不起…...

关于STM32 hal printf重定向 “FILE“ is undefined

> 关于STM32 hal printf重定向,及报错。“FILE” is undefined 增加以下内容: #include "string.h" #include "stdio.h" #pragma import(__use_no_semihosting) 标准库需要的支持函数 struct __…...

“深入剖析JVM内部机制:理解Java虚拟机的工作原理“

标题:深入剖析JVM内部机制:理解Java虚拟机的工作原理 介绍: Java虚拟机(JVM)是Java语言的核心组件,负责将Java源代码转换为可以在计算机上运行的机器码。了解JVM的内部机制对于开发人员来说非常重要&#…...

939. 最小面积矩形;2166. 设计位集;2400. 恰好移动 k 步到达某一位置的方法数目

939. 最小面积矩形 核心思想:枚举矩形的右边那条边的两个点,并用一个哈希表存储相同纵坐标的最近出现的列的列数,不断更新最近出现的左边那条边。 2166. 设计位集 核心思想:这题主要是时间复杂度的优化,用一个flag来标记当前翻转…...

GPT垂直领域相关模型 现有的开源领域大模型

对于ToC端来说,广大群众的口味已经被ChatGPT给养叼了,市场基本上被ChatGPT吃的干干净净。虽然国内大厂在紧追不舍,但目前绝大多数都还在实行内测机制,大概率是不会广泛开放的(毕竟,各大厂还是主盯ToB、ToG市…...

学习Vue:slot使用

在Vue.js中,组件高级特性之一是插槽(Slots)。插槽允许您在父组件中插入内容到子组件的特定位置,从而实现更灵活的组件复用和布局控制。本文将详细介绍插槽的使用方法和优势。 什么是插槽? 插槽是一种让父组件可以向子…...

【Linux】Shell脚本之流程控制语句 if判断、for循环、while循环、case循环判断 + 实战详解[⭐建议收藏!!⭐]

👨‍🎓博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 🐋 希望大家多多支…...

【数据结构】“栈”的模拟实现

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...

12 注册登录

12 注册登录 整体概述 使用数据库连接池实现服务器访问数据库的功能,使用POST请求完成注册和登录的校验工作。 本文内容 介绍同步实现注册登录功能,具体涉及到流程图、载入数据库表、提取用户名和密码、注册登录流程与页面跳转的代码实现。 流程图&a…...

动态规划之最长上升子序列模板

今天开始更新动态规划的模板(动态规划哪有模板呀!!!)话是这么说,但我们经常做题会发现有些题目有些共性,我们抽取共性总结出来,应付动态规划基础题目还是可以的。 回归正题&#xf…...

Python源码05:使用Pyecharts画词云图图

**Pyecharts是一个用于生成 Echarts 图表的 Python 库。Echarts 是一个基于 JavaScript 的数据可视化库,提供了丰富的图表类型和交互功能。**通过 Pyecharts,你可以使用 Python 代码生成各种类型的 Echarts 图表,例如折线图、柱状图、饼图、散…...

MariaDB 10.11.4 安装教程(zip格式,Windows环境)

前言 MariaDB 10.11.4 这个版本是目前最新的长期支持版,下面来安装下 下载 官网:MariaDB 10.11.4 打开上面链接,点Download 安装 解压缩下载的 zip 文件,到 bin 目录,管理员运行cmd,执行如下命令 mys…...

【Python国内源】pip换源终极方法【Windows】

1、为什么要pip换源下载 安装第三方库时,很多库来自于国外,下载速度慢得感人! 2、常见的国内源 https://pypi.tuna.tsinghua.edu.cn/simple #清华 http://mirrors.aliyun.com/pypi/simple/ #阿里云 https://pypi.mirrors.ustc.e…...

【elementUi】绘制自定义表格、绘制曲线表格

要求绘制下图系列表格: 实现步骤: 1.绘制树,实现树勾选字段—>表格绘制字段 逻辑: 树:check-change“treeChart.handleCheckChange” 绑定点击选择事件,改变data.column3数据项;表格:columns"data…...

使用 Python 中的 Langchain 从零到高级快速进行工程

大型语言模型 (LLM) 的一个重要方面是这些模型用于学习的参数数量。模型拥有的参数越多,它就能更好地理解单词和短语之间的关系。这意味着具有数十亿个参数的模型有能力生成各种创造性的文本格式,并以信息丰富的方式回答开放式和挑战性的问题。 ChatGPT 等法学硕士利用 T...

神经网络基础-神经网络补充概念-07-使用计算图求导

步骤 定义计算节点和操作: “x” 是输入变量。 “Add” 表示加法操作。 “Sub” 表示减法操作。 “Multiply” 表示乘法操作。 计算函数值: 首先,我们将 x0 的值代入计算图中,计算出函数的值。 反向传播计算导数: 我…...

docker常用指令

一、Docker指令 1、启动Docker :systemctl start docker 2、查看Docker状态:systemctl status docker 状态为active表示正在运行中 3、停止运行Docker:systemctl stop docker 4、重启Docker:systemctl restart docker 5、开机启动Docker:systemctl enable docker 二…...

【金融量化】对企业进行估值的方法有哪些?

估值的方法有哪些? 如何对企业进行估值?有2个方法估算。 1 绝对估值法 它是一种定价模型,用于计算企业的内在价值。 比如说你可以根据公司近N年的现金流情况。借此去预测未来N年的现金流情况。所有的现金流数据都可以在年报上查询到。最后…...

Qt+C++自定义控件仪表盘动画仿真

程序示例精选 QtC自定义控件仪表盘动画仿真 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC自定义控件仪表盘动画仿真>>编写代码&#xff0c;代码整洁&#xff0c;规则&…...

跨域请求解决方案全解析

跨域请求可以通过多种技术方案实现&#xff0c;核心是绕过浏览器的同源策略限制。以下是主流解决方案及具体实现方式&#xff1a; 一、CORS&#xff08;跨域资源共享&#xff09; 最常用的标准化方案&#xff0c;通过服务器设置HTTP响应头实现&#xff1a; Access-Control-Al…...

【第三十九周】ViLT

ViLT 摘要Abstract文章信息介绍提取视觉特征的方式的演变模态融合的两种方式四种不同的 VLP 模型Q&A 方法模型结构目标函数Whole Word Masking&#xff08;WWM&#xff09; 实验结果总结 摘要 本篇博客介绍了ViLT&#xff08;Vision-and-Language Transformer&#xff09;…...

智慧充电:新能源汽车智慧充电桩的发展前景受哪些因素影响?

全球能源结构转型与碳中和目标的推进&#xff0c;新能源汽车产业迎来爆发式增长&#xff0c;而智慧充电桩作为其核心基础设施&#xff0c;发展前景备受关注。智慧充电不仅关乎用户充电体验的优化&#xff0c;更是电网平衡、能源效率提升的关键环节。 然而&#xff0c;其发展并…...

Spark流水线+Gravitino+Marquez数据血缘采集

1.Openlinage和Marquez简介 1.1 OpenLineage 概述 OpenLineage 是一个开放标准和框架&#xff0c;用于跨工具、平台和系统捕获数据血缘信息。它定义了通用的数据血缘模型和API&#xff0c;允许不同的数据处理工具&#xff08;如ETL、调度器、数据仓库&#xff09;以标准化格…...

Cloudflare 免费域名邮箱 支持 Catch-all 无限别名收件

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 与自建 Poste.io 还有 Serv00 邮局不同,Cloudflare 的域名邮箱并不需要 VPS,也没有复杂的配置。只要有一个托管在 Cloudflare 的域名就可以部署,像是常见的免费域名 eu.org 或者 dpdns.org 都是可以使用的。 需要…...

华为OD机试 - 猴子吃桃 - 二分查找(Java 2025 B卷 200分)

public class Test14 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {String[] s = sc.nextLine().split(" ");int[] arr = new int[s.length-1];int count = Integer.parseInt(s[s...

Spark 之 AQE

个人其他链接 AQE 执行顺序https://blog.csdn.net/zhixingheyi_tian/article/details/125112793 AQE 产生 AQE 的 循环触发点 src/main/scala/org/apache/spark/sql/execution/adaptive/AdaptiveSparkPlanExec.scala override def doExecute(): RDD[InternalRow] = {withFin…...

electron-vite串口通信

一、构建项目后&#xff0c;安装“串口通信库” npm install serialport二、设置 npm install --save-dev electron-rebuild ./node_modules/.bin/electron-rebuild 注意&#xff1a;如果执行报错以下问题 1、未配置python变量 2、没有Microsoft Visual Studio BuildTools 3…...

安全访问家中 Linux 服务器的远程方案 —— 专为单用户场景设计

在现代远程办公与频繁差旅的背景下&#xff0c;许多人需要从外地访问家中的 Linux 文件服务器&#xff0c;以获取重要文件。在涉及敏感数据&#xff08;如客户资料、财务信息&#xff09;时&#xff0c;数据的安全性成为首要考虑因素。以下内容将聚焦于如何在仅有一台笔记本电脑…...

Nginx Stream 层连接数限流实战ngx_stream_limit_conn_module

1.为什么需要连接数限流&#xff1f; 数据库/Redis/MQ 连接耗资源&#xff1a;恶意脚本或误配可能瞬间占满连接池&#xff0c;拖垮后端。防御慢速攻击&#xff1a;层叠式限速&#xff08;连接数&#xff0b;带宽&#xff09;可阻挡「Slow Loris」之类的 TCP 低速洪水。公平接入…...