惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V2EX - 技术
V2EX - 技术
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
S
Schneier on Security
S
Securelist
P
Privacy & Cybersecurity Law Blog
Scott Helme
Scott Helme
T
Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
L
LINUX DO - 热门话题
Cyberwarzone
Cyberwarzone
Cisco Talos Blog
Cisco Talos Blog
量子位
博客园 - Franky
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Latest news
Latest news
T
Troy Hunt's Blog
N
News | PayPal Newsroom
Google Online Security Blog
Google Online Security Blog
Apple Machine Learning Research
Apple Machine Learning Research
N
Netflix TechBlog - Medium
小众软件
小众软件
P
Palo Alto Networks Blog
Spread Privacy
Spread Privacy
C
Cyber Attacks, Cyber Crime and Cyber Security
C
Check Point Blog
aimingoo的专栏
aimingoo的专栏
WordPress大学
WordPress大学
L
Lohrmann on Cybersecurity
L
LINUX DO - 最新话题
D
Darknet – Hacking Tools, Hacker News & Cyber Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Last Watchdog
The Last Watchdog
S
Security @ Cisco Blogs
P
Privacy International News Feed
Last Week in AI
Last Week in AI
Microsoft Security Blog
Microsoft Security Blog
T
Tailwind CSS Blog
博客园_首页
云风的 BLOG
云风的 BLOG
V
Vulnerabilities – Threatpost
D
DataBreaches.Net
Recent Announcements
Recent Announcements
酷 壳 – CoolShell
酷 壳 – CoolShell
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
罗磊的独立博客
Engineering at Meta
Engineering at Meta
Forbes - Security
Forbes - Security
T
Tenable Blog

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解 【002】HTTPS 粗解:证书、TLS 握手与对后端配置的影响 Hermes Agent 一周暴涨五万 Star,但我劝你别急着追 明明连接的是Redis的DB0,为什么能查到DB3的数据? 【从0到1构建一个ClaudeAgent】协作-Agent团队 熟悉电子元器件之后,电子小白下一步该怎么走? MAF快速入门(23)通过C#类定义Skills .NET 高级开发 | 手写一个对象映射框架 FastAPI数据库ORM怎么选?我肝了三个Demo后,终于不再纠结了 mysqldump 参数拾遗:在遗忘与铭记之间 C# .NET 周刊|2026年3月5期 Claude code入门 - 陈彦斌 一文学习入门 ThingsBoard 开源物联网平台 GitHub 热门项目 | 2026年04月16日 如何为GIT设置全局勾子,为每次提交追加信息 Number.isFinite和isFinite与isNaN()和Number.isNaN的区别 PortSwigger SQL注入LAB2 推荐一个测试人必备的Skills,从功能到性能全搞定(附详细实操和安装下载方式) 筑基期:掌握Odoo基础核心知识点02(Odoo XML 开发方式详解) GLM模型这么火,咱们用vllm也咧一个呗! 深入理解 AbortController:从底层原理到跨语言设计哲学 字符串学习笔记 多租户系统框架的基础模块设计和分析设计 Apache SeaTunnel Zeta 为什么能做到“又快又稳”? AI开发-python-LangGraph框架(3-26-LangGraph基本概念及第一个简单样例) Vue 3 组件通信,别只会用 Props 和 Emits 了,这几个狠活儿你得看看 ElasticSearch7.X版本配置密码 用Manim实现动态交点计算--从一个动点问题说起 团结引擎+Addressable+Instant Game打包抖音小游戏 function call 实战:让 LLM 自动判断 pod 异常、调用日志工具并完成故障分析 bubseek —— 让 Agent 的足迹,变成团队的洞察 通过 C# 读取并导出 PDF 书签 如何用 GitHub Actions 实现 Steam 自动化发布 【从0到1构建一个ClaudeAgent】并发-后台任务 .NET 高级开发 | 定制 ASP.NET Core 框架 电子小白:什么是运算放大器(运放) zero2Agent:面向大厂面试的 Agent 工程教程,从概念到生产的完整学习路线 堆上的ORW HC32F460 USB CDC通信异常:非对齐访问异常排查 20260413-Hyperbridge 攻击事件:发生在默克尔山上的验证绕过 那些喊着AI 要淘汰你的人,正在靠你的焦虑赚大钱! 深度学习进阶(八)Swin Transformer 最小二乘问题详解19:带先验约束的增量式SFM优化与实现 SnapTranslate 3.0 正式发布:全局划词翻译 + 完整英语学习闭环,一站式搞定查词、记词、复习 工作的意义、工作的困难认知再思考 .NET + AI 进阶实战:基于类的技能开发 - 打造可治理的 Agent 能力模块 【从0到1构建一个ClaudeAgent】规划与协调-技能 上周热点回顾(4.6-4.12) 电子小白的工具三件套:面包板、杜邦线、万能板 单表五亿数据的查询优化 | Mysql、StarRocks 2. WorkBuddy:从“我是谁”到“帮我干活” C# 如何减少代码运行时间:7 个实战技巧 基于HelixToolkit.SharpDX 渲染3D模型 - 笺上知微 从零开始的双臂具身VLA起源及现阶段发展综述 - SkyXZ 记对 xonsh shell 的使用, 脚本编写, 迁移及调优 - pluvium27 受够了Vibe Coding的失控?换个起点,让AI事半功倍 从开始配置漏洞环境到漏洞复现流程 - 難しい 关于10年工作经验的程序员对OpenClaw的实战经验分享以及看法 - 虚无境 Any metadata 的内存布局 C# .NET 周刊|2026年3月2期 - InCerry 我帮你测过了,测试圈排名第二的 Skill 依然很牛逼 Skill Discovery | 无监督技能发现的经典工作总结 - MoonOut 上下文工程是什么?过时了么?一文讲明白! - 一枫说码 开了 TUN 模式还是直连?90% 的人都踩过这个坑 AScript扩展多种脚本语言 - rockey627 AI 学习笔记:Agent 的记忆机制 你能被装进一个文件里吗?——7 万人把同事"蒸馏"成了 AI - 我没有三颗心脏 Claude Code 通关手册(七):给 AI 装上技能包——Skills 完全指南 - 暮色之狐 在浏览器中快速编辑代码:VSCode Web 集成实践 - Newbe36524 蒸馏自己 skill?基于 Deepseek 的蒸馏器,丐版蒸馏方式,简单便捷 - To_Carpe_Diem Spring AI Aliababa和AgentScope,哪个更好? - 苏三说技术
嵌入式-常见简单通信协议介绍
阿源- · 2026-04-26 · via 博客园_首页

在嵌入式系统中,主控芯片与各类传感器及外设芯片之间的通信通常需要遵循特定的规则。这些规则由固定的硬件连接方式和时序约定共同构成,即通信协议。本文将介绍嵌入式领域中常用的几种基础通信协议,包括串口(UART)、IIC(I2C)以及 SPI。

一、串口

串口(UART)是嵌入式系统中最基础最常用的通信方式之一,简单,通用并且无需时钟同步。串口通信是一种异步串行通信方式,数据按位(bit)依次传输,每次传输一个字节(通常为8位)。由于是异步通信,通信双方不共享时钟信号,而是通过约定好的参数来保证数据正确接收。

1. UART

硬件连接:

最基础的串口通信只需要两根信号线:TX(Transmit):发送数据;RX(Receive):接收数据。UART 数据传输是全双工的,通信双方可以同时发送和接收数据。此外发送和接收双方需要共地以保证参考电平一致。连线方式示意图如下。

串口通信以帧为单位传输数据,一个完整的数据帧通常包括:起始位(1位),数据位(8位最常用),校验位(奇偶校验,可选),停止位(常用1位)。最常用的搭配是8N1,即8位数据位,无校验,1位停止位。由于没有时钟同步,所以通信双方必须约定一个一致的通信速率,也就是波特率。常用的波特率为9600,115200等。串口通信的简单时序如下图所示。

基础串口通信的优点在于硬件连接简单,无需额外的时钟信号即可实现数据传输,但这也带来了一些局限性。首先,串口通信的传输速率相对较低,其设计以简单可靠为主,在较高波特率或复杂电磁环境下,误码率可能会有所上升。其次,串口通信不适合长距离传输,信号在传输过程中容易受到电磁干扰以及线路延迟等因素的影响,从而降低通信可靠性。此外,串口通信通常采用点对点方式,仅适用于两个设备之间的数据交换,难以支持多设备组网通信。综上所述,串口通信常用于对实时性和速率要求不高的场景,例如调试信息输出、板级模块之间的通信以及短距离程序下载等。

2. RS232

为了解决基本串口通信在传输距离和抗干扰能力以及通信规模等方面的限制,逐渐发展出了 RS232 和 RS485 等更完善的串行通信标准。需要注意的是,这些标准并不是对 UART 协议的替代,而是在物理层对其电气特性进行改善,从而提升通信性能和适用范围。

RS232 是较早提出的一种串行通信标准,广泛应用于计算机与外设之间的连接(笔者常用的设备与上位机通信很多基于 DP9 接口)。RS232 同样是全双工通信,它通过提高信号电压幅度(通常为 ±3V~±15V)来增强抗干扰能力,并定义了完整的接口规范(如 DB9 接口)。需要注意的是,RS232 除了提高了信号电平幅度之外,其逻辑极性是与 TTL 电平相反的,可见下面时序图。RS232 仍然采用单端信号传输方式,通常用于点对点通信,传输距离一般在 15 米以内,速率相对有限。因此,它常见于早期计算机串口、工业设备调试接口以及一些简单的外设通信场景。下图是 RS232 典型的设备通信连线示意图。

RS232 的时序如下图所示:

3. RS485

随着工业控制等场景对通信距离和可靠性的要求不断提高,RS485 应运而生。RS485 采用了差分信号传输,能够有效抑制共模干扰,从而显著提升抗干扰能力和传输距离(可达上千米)。同时,RS485 支持多节点通信,一条总线上可以挂接多个设备(典型为 32 个或更多),非常适合构建分布式系统。需要注意的是,RS-485 本身只定义了物理层规范,具体的数据通信规则通常由上层协议实现,例如 Modbus 等工业通信协议。

由于 RS485 采用了差分信号传输,一位信号的表示需要两根线的电位差来判断,因此其仅支持半双工通信。差分信号采用两根线来进行信号传输,接收设备通过两根线的电压差判断逻辑值(≥+200mV 为 1,≤−200mV 为 0),因此天然抗共模干扰。

RS485 的时序逻辑如下图所示,其核心改良就是使用差分信号进行数据传输以提高长距离通信的抗干扰能力,本质上还是电气特性的改良,而时序规范还是依据串口标准。RS485 的另一特性是可以支持多设备通信,如上图所示,一般是有一个主机和若干个从机。由于 RS485 本身只是物理层标准,它只定义了电气特性(差分信号、电压范围、阻抗),不包含任何地址或寻址机制,因此要实现多设备通信需要依赖 RS485 之上的通信协议,最常见的协议是Modbus。这里只做简单介绍,知道逻辑即可。首先主机发送广播帧,广播帧中含有目标通信从机的地址,广播帧所有从机都可以收到,不匹配的从机就静默处理,匹配的从机就接收数据并发送应答帧。

二、I2C

I2C(Inter-Integrated Circuit) 是嵌入式系统中非常常用的一种同步串行通信协议,该协议最初由飞利浦(现恩智浦)提出,广泛应用于芯片之间的短距离通信,比如传感器、EEPROM、ADC/DAC 等外设。

I2C 仅通过一条串行数据线(SDA)和一条串行时钟线(SCL)即可在多个设备间进行同步、半双工的数据传输。I2C 适用于多设备通信,每个设备都有自己的地址(一般是7位),主设备负责产生时钟并发起通信,从设备则响应主设备的请求。I2C 的典型速率包括标准模式(100 kbps)、快速模式(400 kbps)以及更高速模式(如1 Mbps快速模式+和3.4 Mbps高速模式),因引脚少、连接简单且能灵活扩展,I2C被广泛应用于同一电路板内芯片之间的短距离低速通信。

I2C 的 SDA 和 SCL 都采用一种开漏结构的输出方式,其特点是只能主动输出低电平,而不能主动输出高电平。 如果所有设备都只能拉低,那“高电平”从哪来?此时就需要上拉电阻来提供高电平。上拉电阻把总线“默认拉到高电平”,任意设备需要发送“0”时把线拉低,没人拉低时线路被电阻拉回高电平。典型的硬件结构如下图所示。

I2C 的读写时序时序如下图所示,此外后面给出了一个具体的写时序示例。

需要注意的点:

  • 起始信号:SCL 为高时,SDA 从高 → 低
  • 停止信号:SCL为高时,SDA从低 → 高
  • SDA 在 SCL 为高期间必须保持稳定,也就是说数据只能在 SCL 低电平时改变,在 SCL 高电平时读取数据
  • 每次传输:8位数据 + 1位 ACK,高位先传(MSB first)
  • 起始信号后的 8 位数据,高 7 位为地址,最低位为读写位

三、SPI

相比于 UART 和 IIC,SPI 是相对速度很高的一种同步全双工通信协议。SPI 依赖四条线来工作,分别为:

  1. SCLK (Serial Clock): 时钟信号,由“主设备”产生,决定了数据传输的速度。

  2. MOSI (Master Out Slave In): 主设备发送,从设备接收。

  3. MISO (Master In Slave Out): 从设备发送,主设备接收。

  4. SS/CS (Slave Select / Chip Select): 片选信号,用于指定主设备想和哪一个从设备说话。

与前两种协议不同,SPI 通常有四种工作模式,由时钟极性 (CPOL) 和时钟相位 (CPHA) 两个寄存器来控制。

  • CPOL (Clock Polarity): 决定时钟空闲时是高电平还是低电平,0 表示空闲时为低电平。

  • CPHA (Clock Phase): 决定是在时钟的第几个边沿采样数据,0 表示在第1个时钟边沿采集数据。

以“00”为例,空闲时低电平,第一个时钟沿就是上升沿,就是第一个上升沿就开始采集数据。

模式 CPOL CPHA 触发边沿
Mode 0 0 0 空闲时低电平,第一个时钟沿:上升沿
Mode 1 0 1 空闲时低电平,第二个时钟沿:下降沿
Mode 2 1 0 空闲时高电平,第一个时钟沿:下降沿
Mode 3 1 1 空闲时高电平,第二个时钟沿:上升沿

SPI 的典型速率:

  • 低速应用 (100 kHz - 1 MHz): 常用于简单的传感器(如温湿度传感器 DHT 系列)、低速 ADC 或 电子墨水屏。

  • 中速应用 (1 MHz - 20 MHz): 这是最常见的范围。大多数微控制器(如 Arduino、STM32 的普通外设)在这个区间运行。常见的 SD 卡读取、OLED 显示屏驱动、以及高精度的惯性传感器(IMU)通常工作在此频率。

  • 高速应用 (20 MHz - 100 MHz+): 常见于高性能主控与高速存储器(如 QSPI Flash)、以太网控制器(如 W5500)或高分辨率 TFT 液晶屏之间的通信。

image-20260426173120312

image-20260426173151520


Steady Progress!