🧩 当城市之间开始通信,它们是低语、广播、还是被指令召唤?
UART / SPI / I²C,看似只是接口协议,其实是文明之间的语言协定。
如果你也是一位主控规划者,你会为模块居民选择哪种交流方式?
🎯 用"位元灵力世界"世界观理解 PWM
📚 系列:位元灵力 · 模块觉醒手册 - Day 1 PWM
🌐 城市之间的通信
三种通信方式
1. UART:点对点私聊
基本概念:
- UART = Universal Asynchronous Receiver/Transmitter(通用异步收发器)
- 两根管线:
- TX = Transmit(发送):主城区的总发送口
- RX = Receive(接收):主城区的总接收口
- 像主城市可以选定一个卫星城市,建立专用电话线
异步通信的特点:
- 不需要统一的时钟信号:不像同步通信那样需要统一的节拍器(时钟信号)
- 类比:时钟信号就像合作项目的具体进度工期,工期结束就进入下一个城市的合作。UART 这种固定输送的专线不需要设定这样的时间期限
- 双方约定传输速度:虽然不需要统一节拍器,但两个城市需要提前约定好传输速度(波特率),就像约定好说话的快慢
- 可以同时发送和接收:因为没有统一的时间期限限制,双边城市可以同时发送和接收,互相输送资源
工作原理:
- 可以连接不同设备:主城市的两根线(TX、RX)可以连接到不同的卫星城市
- 每次只能选一个:同时只能连接一个卫星城市,选中之后这两根线就变成与这个卫星城市的专线
- 有来有回的双向通信:两个城市可以同时发送和接收,互相输送资源
- 要换设备需要重新连接:如果要连接另一个卫星城市,需要先物理断开当前连接,再重新连接
连接方式:
- A 城市的 TX 接 B 城市的 RX
- A 城市的 RX 接 B 城市的 TX
- 必须交叉连接,不然会"对着自己说话",收不到信息
Arduino UNO 的 UART 接口:
- 引脚 0 (RX):接收外部世界的粒子
- 引脚 1 (TX):向外部世界发送粒子
- 这是连接外部世界(电脑)的通道
⚠️ 重要:主城区的总发送和接收口,不能随意使用!
- 这是城市规划者与外部世界(电脑)通信的唯一通道
- 如果在这两个接口上接其他设备,会影响:
- 程序上传(城市规划者无法向城市发送指令)
- 串口调试(无法接收城市的反馈信息)
- 城市与外部世界的通信会被中断
2. SPI:指挥官调度
基本概念:
- SPI = Serial Peripheral Interface(串行外设接口)
- 四根管线:
- MOSI = Master Out, Slave In:主设备发 → 从设备收
- MISO = Master In, Slave Out:从设备发 → 主设备收
- SCLK = Serial Clock:时钟节拍器(由主设备发出)
- SS = Slave Select:选中哪个从设备(片选线)
- 像主城市对下属城市的调度系统
- 主城市掌握时钟,每个从城市有自己的选中线
- 不是"大家都说话,主城市挑着听",而是"没被点名的就闭麦"
Arduino UNO 的 SPI 接口:
- 引脚 10 (SS):选中从设备
- 引脚 11 (MOSI):主设备发,从设备收
- 引脚 12 (MISO):从设备发,主设备收
- 引脚 13 (SCLK):时钟节拍器
工作原理:
- 主城市选择合作城市:主城市选中需要资源输送的下级城市,由主城市来选择城市进行工程合作,一次只选择一个
- 有具体合作期限和顺序安排:SCLK 是主设备发出的"节拍器"(时钟信号),就像合作项目的具体进度工期,让被选中的从设备按节奏说话
- SS 是"选人按钮":每个从设备需要自己单独的 SS 线,主设备按下哪个 SS 按钮,就只让那一个从设备参与合作
- 没被选中的城市:没被选中不代表那个下级城市没有在运行,可能还在运行其他任务,只是没有在参与这种有具体合作期限和顺序安排的合作(不参与 SPI 通信)
- 接多个 SPI 设备时:
- 主控只有三个引脚:MOSI、MISO、SCLK(主控只有这三个引脚,不是分线器)
- 所有从设备并联连接:所有从设备的 MOSI 都连接到主控的 MOSI 引脚,所有从设备的 MISO 都连接到主控的 MISO 引脚,所有从设备的 SCLK 都连接到主控的 SCLK 引脚(所有设备都并联在这三个引脚上)
- SS 线是每个设备一根专属线:每个从设备有自己的 SS 线,连接到主控的不同引脚(可以用 D10、D9、D8...),主控通过切换不同的 SS 线来选择当前合作的设备
- 工作原理:所有从设备都并联连接在主控的三个引脚上,主控发送的信号所有设备都能"听到",但只有被 SS 选中的设备才会参与通信(响应),其他设备虽然连接着,但会自动"静音"(不响应)
关键理解:
- SCLK 不切换"仆从"本身,而是驱动当前被选中的仆从同步讲"01"的节拍器
- SS 负责切换仆从(谁能参与合作)
- 只有当前被选中的仆从才在听/说,非被选中的仆从会"自动静音"(不参与 SPI 通信,但可能还在运行其他任务)
📎 物理连接总结:
- ✅ MOSI/SCLK/MISO 是一根线拉出多分叉:物理上可焊/排线处理,一根导线分出多个分叉连接到各个从设备
- ❌ 不是每个设备都插拔那三根线:而是永远插着,通过独立的 SS 线(CS 线)控制谁能说
- ✅ 并不需要"分线器"这种额外芯片:线路本身的连接 + 主控逻辑 + 从设备的高阻管理就能搞定
- ✅ 如果设备多,SS 线会很多:这是 SPI 拓展能力的硬伤(和 I²C 多设备共享一个地址相比)
高阻管理(High-Z)的解释:
- SS 是一种控制信号:SS 信号告诉从设备"是否轮到你参与合作"
- MOSI 和 SCLK 一直连着,实时监听:所有从设备的 MOSI 和 SCLK 都一直连接着,这样它们可以实时监听主控发送的信号,看下一波是不是要轮到自己了
- 自动静音机制:如果 SS 信号表示"没轮到这个设备参与",设备会自动把 MISO 引脚的输出改变为高阻状态(High Impedance),实现"静音"
- 高阻状态:当从设备没被选中时,它的 MISO 引脚会进入"高阻状态",就像这个引脚"断开"了一样,不会影响总线上的信号
- 为什么需要高阻管理:所有从设备的 MISO 都连接在同一根总线上,如果没被选中的设备也在总线上"说话",就会互相干扰。高阻状态让没被选中的设备"自动断开",不会影响总线上的信号
- 类比:就像没被选中的城市虽然连接着共享总线,但它的"发言口"(MISO)自动关闭了,不会干扰其他城市的通信。但它的"耳朵"(MOSI、SCLK)还在听着,随时准备参与合作
- 关键机制:SS 信号 → 从设备判断 → 自动切换 MISO 为高阻状态 → 实现静音。这是为什么多个设备可以并联在同一根总线上,而不会互相干扰的核心机制
📎 SPI 总结:串行外设接口的城市管理体系
"串行外设接口"这个名字很合理,就像真实人类世界的城市管理:
- 一个主城市,下面有很多下级城市:主控城市(主设备)管理多个卫星城市(从设备)
- 多个输送资源的项目沟通管道,但不是总开启的:MOSI、MISO、SCLK 是项目沟通管道,所有下级城市都连接着这些管道,但管道不是总开启的
- 需要接收来自上峰的每次来电和会议:所有下级城市都需要实时监听主城市的信号(通过 MOSI 和 SCLK),随时准备参与合作
- 只有被主城市选择的城市,才会开启管道,进行项目管道,互相传送脉冲:只有被 SS 信号选中的下级城市,才会开启 MISO 管道,与主城市进行双向通信,互相传送脉冲资源
这就是 SPI 的本质:一个主城市通过项目管道系统,有序地管理多个下级城市的资源输送和通信。
3. I²C:共享广播频道
基本概念:
- I²C = Inter-Integrated Circuit(内部集成电路)
- 两根管线:
- SCL = Serial Clock:时钟,主城市控制(统一节拍器)
- SDA = Serial Data:数据,双向,所有城市共用(所有数据都从这条线上走)
- 所有城市共享同一对管线(总线)
- 每个城市有地址,主城市通过地址点名
- 像"小区广播 + 举手说话":主城市控制总线,只有两根线,每个城市有地址
Arduino UNO 的 I²C 接口:
- 模拟引脚 A4 (SDA):数据线,双向
- 模拟引脚 A5 (SCL):时钟线,主设备控制
工作原理:
- 两根线,比较拥挤:主控只有两根线(SCL 和 SDA),所有下级城市都连接在这两根线上
- 所有下级城市都开会,但每个都有发言的机会:所有从设备都挂在同一"广播频道"上,这是一个大项目,每个下级城市都有机会做一点
- 由主控城市决定这次轮到谁来参与和发言:主设备通过地址点名,决定这次轮到哪个城市参与和发言
- 所有信息都集中在一个通道(SDA):SDA 是双向的,一根线既收又发(不同设备交替使用),所有数据都从这条线上走
- 由 SCL 不同的工期和时间点,来决定是哪个城市来做:SCL 是主设备控制的拍子棒(统一节拍器),每一位数据都踩这个节奏过线,通过不同的时间点来决定是哪个城市来做
- 主设备用代码控制通信流程:先写地址、再读/写数据
- 有协议控制:谁在说,谁闭嘴,谁等拍子,避免冲突
关键理解:
- SCL 是主设备控制的拍子棒,每一位数据都踩这个节奏过线
- SDA 是大家排队用的麦克风,所有数据都从这条线上走(问与答都用它)
- 主设备是司仪,控制节奏、控麦权限、话题安排
- 从设备都很克制,等主人喊了地址,才准许说一句
📎 I²C vs SPI 的区别:
- SPI:主控城市跟单个下级城市的独立项目,每个项目有独立的管道(SS 线),可以同时进行多个独立项目
- I²C:主城市和下级城市的共同项目,所有城市共享同一个通道(SDA),通过地址和时间点来决定轮到哪个城市参与,比较拥挤但更节省资源
通信的本质
虽然都是光明粒子和黑暗粒子:
- 但"语法不同、节奏不同、讲究也不同"
- 就像不同城市有不同的语言,虽然都是粒子,但得按各自方式说对,才能通
🏠 外部世界的能量系统
220V 市电:外部世界的统一能量
核心理解:
- 外部涌入的能量大小是一样的:外部世界(现实世界)有统一的 220V 交流电,所有城市接收到的外部能量大小是一样的
- 直接流入下级城市会造成大量浪费:如果外部能量直接流入下级城市,每个城市都会按照自己的需求消耗能量,但很多能量会被浪费(比如不需要那么亮的时候也消耗那么多能量)
- 从主控城市进行分配,能够让资源得到合理利用:主控城市接收外部能量后,通过 PWM 等方式进行分配,根据实际需求控制能量输出,让资源得到合理利用
不同城市的调光方式:
- 传统白炽灯城市:
- 串接调压器或可控硅削波器
- 让 220V 的能量打折进入城市
- 现代 LED 城市:
- 内部有电源转换模块
- 用 PWM 调光(和 Arduino 一样!)
- 城市的脉冲控制城市的亮度
- 节能灯城市:
- 电子镇流器控制
- 部分支持电流限流
类比:
- 220V 是外部世界的统一能量标准,所有城市接收到的外部能量大小是一样的
- 但直接流入下级城市会造成大量浪费,因为每个城市都会按照自己的需求消耗能量
- 从主控城市进行分配,能够让资源得到合理利用:主控城市通过 PWM 等方式,根据实际需求控制能量输出,让资源得到合理利用
- PWM 就是主控城市控制"分配多少"的方式
💡 关键理解总结
PWM 的本质
城市的脉冲能量输送:
- Arduino 城市有供能,有光明粒子和黑暗粒子进入供能
- 城市的最大作用是将粒子再分配
- 通过控制脉冲,完成不同任务(比如灯光的明暗)
- 由整个城市的居民共同维持
- 城市规划者可以调节脉冲的强度和频率
- 占空比 = 光明粒子在周期内的时间比例
- 频率 = 每秒有多少个周期(脉冲多少次)
能量输出:
- 不是你来了几次(频率),而是你在这段时间里陪我多久(占空比)
- 真正感受到"强"的,是光明粒子在管线里待了多长时间
- 通过脉冲控制,将粒子再分配给其他部件,完成不同任务
城市规划的规则
必须遵循造物主的规则:
- 造物主留下了世界的规则和秩序
- 城市规划者必须严格遵守,否则会导致:
- 居民和能量被消耗
- 能量被浪费
- 城市被废弃
主控模块的作用:
- 是城市规划者在城市内部的执行机构
- 它统管模块作为或分配粒子资源
- 控制整个城市的脉冲节奏和能量输送
🔄 用"位元灵力世界"世界观理解 PWM 的本质
📚 系列:位元灵力 · 模块觉醒手册 - Day 1 PWM
⏮️ 上一篇:Arduino 系统结构:主控城市与卫星模块的粒子链接
💬 你最常用哪种通信协议? UART 的简洁,SPI 的指令感,还是 I²C 的广播式协作? 又或者你有踩过哪些通信的坑?欢迎在评论区留言分享!