首页/新闻资讯/正文详情

I2C多主机仲裁与时钟延展:从原理到工程实践

发布时间:2026/11/6 1:06:12 来源:云帆数科 栏目:资讯中心
I2C多主机仲裁与时钟延展:从原理到工程实践
第一次用两个MCU往同一条 I2C 总线上发数据时我以为只要各自错开时间就不会出问题。直到一次产品联调两块板子几乎同时去读同一颗传感器整条总线直接卡死从机返回的数据全是乱码我才回头把 I2C 规范里关于多主机仲裁和时钟延展的章节仔仔细细读了一遍。读完之后只有一个感受这两个机制才是 I2C 最精妙的设计。这篇我打算把这两个机制彻底讲透——仲裁为什么能成立、逐位仲裁到底怎么运作、时钟延展是怎么让从机反客为主的以及多主机叠加时钟延展时工程上容易踩哪些坑。内容不会停留在概念解释层面我会把时序推演、测试细节和软硬件设计建议都放进来适合正在做多主机 I2C 系统的嵌入式工程师也适合刚把 I2C 时序摸熟、想往深处走一层的硬件开发者。1. 为什么说多主机仲裁是I2C的物理层魔法很多人学 I2C 先学了读写时序、ACK 应答觉得这协议不复杂。等到真正上手做多主机才意识到问题比自己想的多得多。多主机仲裁能够在没有中央调度器的情况下让两个甚至更多主机在同一根总线上同时发数据而不至于把总线彻底搞坏这背后靠的其实不是一个复杂的算法而是一个极其朴素的物理特性。1.1 开漏结构与线与逻辑仲裁能成立的前提几乎所有 I2C 教材都会提一句I2C 总线是开漏输出但很少有人停下来想开漏为什么是仲裁的前提开漏输出的意思是设备只能主动把引脚拉低到地不能主动输出高电平。想产生高电平必须靠外部上拉电阻把 SDA 和 SCL 拉高。这带来一个关键特性如果两个设备同时操作总线一个想输出高、一个想输出低结果会是——输出低的那一方赢了总线最终保持低电平。这个行为在数字电路里叫线与。更直白地说I2C 总线上谁先送出低电平谁就控制了总线想送高电平的一方实际上只是放弃驱动靠上拉电阻维持电平而已。这就是仲裁的物理基础。两个主机同时驱动 SDA如果其中一个送 0另一个送 1送 1 的那个在逻辑上失败了但他不会造成任何物理冲突——电路上根本没有两个反相驱动器对拼的短路风险。换一种总线比如 SPI如果两个主机同时驱动 MOSI一个送高一个送低那就是实打实的电流冲突轻则数据错误重则烧引脚。我当年第一次理解到这一层的时候挺震撼的。I2C 的设计者没有单独做一根仲裁线也没有仲裁器芯片纯粹靠开漏 上拉就把冲突消解在了物理层。知道这一点之后你再去看仲裁的时序细节就会觉得一切都顺理成章。1.2 一次真实的总线冲突先看灾难现场在拆解仲裁过程之前先描述一下没有仲裁机制时总线冲突是什么场景。我当时用的是一块 STM32 做主控 A一块 ESP32 做主控 B共同挂在一根 I2C 总线上外设是一颗温湿度传感器和一颗 OLED。主控 A 周期性读温湿度主控 B 负责刷新 OLED 显示。两边的任务没有同步机制有一天调试时发现 OLED 偶尔整屏花掉传感器读出来的是 0xFF 或者随机跳变。用逻辑分析仪抓了十几分钟终于抓到一次完整的冲突现场主控 A 发出 START随后往 SDA 上写设备地址 0x70含写位而主控 B 这时也在发 START它要访问的地址是 0x3C。两条 SDA 波形在地址阶段相互覆盖从机看到的地址既不是 A 想要的也不是 B 想要的于是没有设备应答两个主机都收不到 ACK一个重试、一个报错总线被反复拉扯最终 OLED 的初始化序列被打断整个显示内容全部错乱。这个现象背后就是缺少多主机仲裁处理。I2C 规范里这套仲裁机制本质上就是解决两个主机同时访问总线这类问题的。有了仲裁总线不会炸但输掉仲裁的一方需要知道自己输了然后安静退让。2. 逐位仲裁的完整过程从START到最后一个数据位多主机仲裁的第一步是理解仲裁发生的时机。很多人以为仲裁是发完整个字节之后比较一下结果实际完全不是。I2C 仲裁是逐位进行的一个 bit 一个 bit 地比谁在某一位输了谁就在这一位结束之后立刻退出。2.1 相位与采样仲裁发生在SCL高电平的SDA采样点I2C 的数据传输规则是SDA 上的数据只有在 SCL 为高电平期间才是有效的SCL 为低电平期间 SDA 可以变化。这个规则不仅适用于数据位也是仲裁的采样依据。仲裁的采样点就在 SCL 高电平、主机采样 SDA 的那个瞬间。两个主机都在 SCL 高电平期间输出自己的位因为开漏结构的线与特性总线上实际的 SDA 电平是所有正在驱动的主机输出结果的与运算。每个主机在这个采样点读回 SDA拿它和自己刚才发送的值比较。一致就继续不一致就说明自己输了。关键点是一个主机发送 1其实就是释放 SDA让它被上拉电阻拉高。如果另一个主机正在发送 0拉低了 SDA那第一个主机在采样点读回低电平发现自己想发高却读到低立刻就能判断仲裁失败。2.2 地址仲裁实战推演两个主机同时访问0x50用具体例子推演一下。假设主机 A 要访问地址 0x50二进制 0101 0000主机 B 要访问地址 0x3C二进制 0011 1100。两个主机几乎同时发出 START。先说 START 条件本身。START 的定义是 SCL 为高时SDA 由高到低跳变。如果两个主机同时拉低 SDA总线自然是低两边都认为自己发出了 START仲裁在 START 阶段不会触发。接下来是第一个字节。按位发送地址第 7 位A 发 0B 发 0。SDA 为低两边都读到低一致继续。地址第 6 位A 发 1释放总线B 发 0拉低。SDA 被 B 拉低A 在这个采样点读到低电平和自己的期望值 1 不一致A 仲裁失败。此刻A 必须立刻停止驱动 SDA并且不再继续发送后面任何位。它甚至可以继续产生 SCL 时钟但 SDA 上必须保持高阻状态。B 感知不到自己赢了——它只会按部就班地继续发完剩余地址位和读写位然后等待从机应答。注意一个细节A 仲裁失败的时刻可能是在一个字节的中间而不是字节边界。这意味着 A 必须支持字节中途退出的逻辑硬件状态机或者软件模拟都要处理这种情况不能死等一个完整的字节发完再判断。2.3 数据阶段仲裁比地址阶段更隐蔽的冲突地址阶段仲裁比较明显因为两个主机访问不同从机时地址位大概率不同输赢很容易判断。真正隐蔽的是数据阶段的仲裁。多主机系统中两个主机可能在地址阶段一直发送完全相同的内容一路通过仲裁直到数据阶段才出现分歧。比如两个主机同时向同一颗EEPROM写数据前面地址字节、内部寄存器地址都相同到了数据字节处A 发 0xAAB 发 0x55。两个字节的每一位都可能逐位仲裁直到某一位两个值不同输的一方退出。这里最需要警惕的是数据阶段仲裁失败的语义很难被上层感知。地址仲裁失败时主机可以通过从机是否应答来推断自己可能输了但数据阶段仲裁失败时赢家继续写数据输家退出了输家并不知道赢家写了什么——这会让应用层的数据副本出现不一致。我曾经在双主控备份系统的调试中就遇到这种情况两块板子同时往一个寄存器写自己的状态字结果写进去的值时而来自 A时而来自 B完全看谁的某一位更低。如果业务逻辑要求AB 都写入且最终值必须是其中明确的一方那这样的仲裁结果就存在语义不确定性。工程上要在软件层面额外做确认机制不能指望总线仲裁替你解决一切。2.4 失去仲裁之后主机必须立刻闭嘴仲裁失败的主机退出时最需要注意的一点是它不能发送 STOP。原因不难理解。STOP 条件也是 SCL 高电平时 SDA 由低到高的跳变而仲裁失败方此刻已经不驱动 SDA 了如果它强行发出 STOP会干扰赢家正在进行的完整事务。赢家可能正在传输数据中途被一个假的 STOP 截断从机状态机会完全错乱。规范中的正确行为是输了仲裁的主机在发现失败的那一位结束之后立即释放 SDA 和 SCL保持高阻态不再参与任何总线活动直到当前事务结束。至于当前事务什么时候结束输家只能推测——它甚至不能确定赢家最终会正常完成还是中途放弃。所以输家最稳妥的等待方式是持续检测总线空闲SDA 和 SCL 同时为高再重试自己的事务。我在软件模拟 I2C 的实现里专门加了一个仲裁失败的中断标志位然后让主状态机跳到等待总线空闲的阻塞分支。实测下来这种方式比估算一个固定时间再重试可靠得多。3. 仲裁的规则边界与常见误区把仲裁的底层过程讲清楚之后再来说说规则边界。这个部分基本都是实战后才会意识到的细节文档上往往一两句话带过但真调起 bug 来全是坑。3.1 仲裁期间为什么绝对不能发STOP前面提了一句不能发 STOP这里展开讲讲后果。我见过一个不成熟的软件模拟实现在检测到仲裁失败后直接调用发送 STOP 的函数去清场。表面上看这似乎能主动结束混乱局面实际会让赢家的传输直接毁掉。再仔细想一层如果一个从机正在响应赢家的读请求向总线上发送数据此时输家补了一个 STOP从机收到一个意外的结束条件它可能会认为当前事务被强制终止内部状态机被重置。赢家还在等数据结果等来的要么是总线突然释放要么是被打断的错误时序两边都陷入不可恢复的等待。正确的做法是仲裁失败方把 SDA 和 SCL 都释放掉让赢家独占总线。输家此时连时钟都不应该继续产生因为 SCL 本身也是线与结构输家继续拉低 SCL 会阻碍赢家传输数据。3.2 重试策略不要让输掉的主机马上冲击总线仲裁失败之后的另一个常见错误是立即重试。如果两个主机因为周期性任务同时访问总线它们大概率会再次同时发起 START然后再次仲裁形成一种抖动状态尤其在时序高度同步的系统中这种抖动可能持续很长时间。工程上常用的做法是引入随机退避。失败方等待总线空闲之后再额外等待一个随机延时——比如基于定时器计数或者伪随机数把每次重试的起点稍微错开。两个主机同时重试的概率就被显著降低了。这个思路和以太网的碰撞退避有点像。I2C 多主机仲裁虽然保证了物理层面不冲突但逻辑层面的重试风暴还得靠软件策略来收敛。3.3 一个很容易被误解的点仲裁不等于总线占用检测有些工程师会把仲裁失败当作总线上有其他主机在活动的检测手段甚至用仲裁结果来做总线占用判断。实际上仲裁只在两个主机同时开始传输时才生效。如果总线已经被主机 A 占用中正和从机通信主机 B 此时想发起 START它并不会进入仲裁流程——它只会看到总线忙要么等待要么收到自己的硬件仲裁丢失错误。所以仲裁针对的是同时竞争而不是事后检测。在一个真正的多主机系统里总线占用检测靠的是 SCL 和 SDA 的高电平状态判断仲裁只是竞争发生时的裁决手段。这两个概念别混。另外一个隐藏细节START 之后紧跟着的第一个字节是地址但 I2C 规范里也定义了起始条件后跟随 10 位地址的扩展模式。10 位地址模式下仲裁依然逐位进行规则一致只是地址字节的位置变成了两字节仲裁窗口更长输赢判定位置更靠后。设计状态机的时候要把 7 位和 10 位两种情况都覆盖到不然换了颗 10 位地址的器件就要翻车。4. 时钟延展从机反客为主的流量控制如果说多主机仲裁是 I2C 物理层的魔法那时钟延展就是从机端最温柔的流量控制。这个机制解决的是主从速度不匹配的问题——尤其是主机时钟快、从机处理慢的场景。4.1 延展的物理实现从机为什么能拉低SCL时钟延展的实现依旧靠的是开漏结构SCL 同样不是主机专属任何设备包括从机都可以拉低 SCL。正常情况下主机作为时钟的发起方产生 SCL 的方波。但如果一个从机正在忙——比如正在处理上一次命令、EEPROM 内部正在写数据、ADC 正在转换——它可以在主机释放 SCL 高电平期间主动把 SCL 拉低。主机在下一次传输前需要检查 SCL 是否已经变高如果发现 SCL 一直处于低电平就知道从机在请求暂停于是自动进入等待状态。这个过程可以无限延长从机什么时候处理完就什么时候释放 SCL主机继续之后的时序。对从机来说这相当于在自己忙不过来的时候直接对主机说等一下马上好。之所以能做到这一点还是因为开漏。SCL 是一个所有设备都能驱动的公共线主机释放高电平后从机拉低它是完全合法的物理行为。这个机制简洁到让我觉得它和仲裁根本是同一种思路在不同方向上的应用。4.2 哪些场景必须依赖时钟延展我实际使用中最典型的时钟延展场景有三个。一是 EEPROM 内部写周期。比如 AT24C 系列写入一页数据之后芯片内部需要一个几十毫秒的整理时间。如果主机把一个字节的地址和数据都发送完毕后紧接着发出读操作从机如果支持时钟延展就会在这段时间内拉低 SCL直到内部写完才释放。不支持延展的老型号或者便宜的片子就得靠主机傻等固定延时前者的效率高出不止一个数量级。二是 ADC 或者传感器在转换期间。某些 I2C 接口的 ADC比如 ADS1115在触发转换后需要一段时间它会在主机读数据时通过时钟延展拉住总线。我之前用软件模拟 I2C 时因为没写 SCL 等待逻辑读 ADS1115 经常读到半空的数据后来加上了 SCL 电平检测一切恢复正常。三是显示驱动芯片初始化。像 SSD1306 这类 OLED 驱动上电或者执行诸如全屏填充这种命令时内部要花不少时间。如果驱动它在初始化序列后紧接着要连续写显存就得处理好延展不然前几帧数据写进去就被丢弃。4.3 时钟同步与时钟延展的关系有朋友一定会问时钟延展和规范里提到的时钟同步Clock Synchronization是不是一回事它们有相同的物理基础但场景不同。时钟同步主要出现在多主机竞争期间两个主机各自产生 SCL其中一方先拉低 SCL另一方在自己的 SCL 低电平期间检测到总线上 SCL 已经被拉低于是也进入低电平状态双方的时钟周期被对齐了。这种同步让两个主机的时钟能够保持步调一致仲裁才能逐位进行。时钟延展则是单主机场景下从机主动拉低 SCL 来暂停主机。本质上两者都是SCL 线与带来的自然结果并没有新机制被发明出来。规范的巧妙之处就在这里——设计者没有为多主机额外定义仲裁总线也没有为从机流量控制单独定义握手信号一切都在原有的开漏结构上自然实现了。5. 时钟延展对主机侧的考验软件模拟与硬件外设的应对时钟延展机制本身很优雅但它对主机的实现却是一个考验。很多时候从机是支持延展的主机却不知道或者知道了没有处理。这一章专门说主机侧的应对策略。5.1 软件模拟I2C的等待逻辑软件模拟 I2CGPIO 翻转实现时钟延展的等待逻辑其实很简单就是每次把 SCL 拉高之后在采样 SDA 之前额外检查 SCL 是否真的变高。核心问题在于你没法只靠延时——因为从机可能拉低 SCL 任意长时间延时过了它可能还没释放。正确的轮询逻辑如下主机把 SCL 设为高阻输入即释放 SCL。读取 SCL 引脚电平如果为低说明从机正在延展继续等待。一旦读到 SCL 为高说明从机释放主机继续后续操作。实践上还需要加一个超时保护。如果从机出了问题永远不释放 SCL主机就会死锁。我一般会在等待循环里放一个毫秒级的计数器超过 100ms 直接报 I2C 超时错误并复位总线状态机。别小看这个超时它帮我挡住过一颗损坏的传感器——那颗传感器一旦进入内部异常状态就会一直拉低 SCL没有超时逻辑的情况下整块板子都跟着卡死。5.2 硬件I2C外设的超时配置硬件 I2C 外设对时钟延展的支持程度因芯片而异。以 STM32 为例它的 I2C 外设本身是支持时钟延展的——主机作为控制器在等待 SCL 被释放期间会自动暂停时钟。但前提是你要启动 SCL 等待检测并正确配置超时寄存器。不同芯片的寄存器名不一样但思路类似。重点参数是超时时间要设到比从机最长延展时间更大。比如一颗 EEPROM 最大写周期 20ms超时设置建议 50ms 起步留出余量。设置太小的话从机还在正常延展主机就直接超时错误误报频发设置太大则在从机卡死时系统响应时间变得不可接受。我调试 ESP32 时还碰到过一个典型问题ESP32 的硬件 I2C 驱动默认对时钟延展的支持是有限的它内部有超时计数器如果从机延展时间过长驱动直接报错。ESP32 休眠后 I2C 外设复位不完全也容易导致总线恢复异常。这类问题通常的表现是第一次读取正常第二次开始超时复位又恢复实际原因就是 SCL 被从机拉住后主机侧的驱动没有正确等待释放而是直接放弃。对这些场景我个人的建议是硬件 I2C 外设虽然方便但在多主机和存在时钟延展从机的系统里软件模拟 I2C 反而更可控——因为你明确知道等待逻辑、超时逻辑在哪一行触发出问题时可以精确剪裁。5.3 实测中容易被忽视的延展边界时钟延展有一个边界问题它能在哪些阶段发生不少人以为延展只会发生在数据传输的字节之间其实从机可以在几乎任何时刻拉低 SCL。比如在主机发送 START 之后、地址字节之前从机就可以开始延展在 ACK 阶段也可以甚至在主机发送 STOP 之前从机都可能延展。设计主机逻辑的时候不能只在发送完一个字节后等待而要时刻检查 SCL 是否被拉低。另外主机侧在等待延展期间也不能直接进行 SDA 操作。如果从机正在延展主机必须保持 SDA 状态不变否则会向总线上发送无意义的电平变化干扰从机的内部状态。我之前软件模拟时在等待循环里不小心继续执行了设置 SDA 的代码导致从机的内部数据被篡改这个 bug 查了将近两天。6. 多主机加时钟延展组合场景下的工程建议单主机加时钟延展是一回事多主机加时钟延展则是另一回事。当两个机制同时出现在一条总线上时很多孤立看来合理的假设会互相打架。6.1 组合场景的完整时序推演设想一个场景总线上一共有两个主机 A 和 B一个从机从机 S。A 和 B 同时发起对 S 的访问但 S 正处于内部忙状态拉低了 SCL 进行时钟延展。此时 A 和 B 都检测到 SCL 为低各自进入等待状态。等 S 释放 SCL 后A 和 B 同时恢复双方继续驱动想发送的数据。如果 A 和 B 的目标都是 S 且地址相同它们会一路仲裁到数据阶段如果目标地址不同地址阶段就会分出胜负。问题是在 S 延展之前A 和 B 可能已经开始发送各自的地址字节。仲裁发生在 SCL 高电平时的 SDA 采样点但如果 SCL 一直被 S 拉低A 和 B 就都停在等待状态SDA 上保留的是它们各自最后驱动的电平。此时如果 A 之前驱动了低、B 之前驱动了高SDA 就会被 A 拉住S 释放 SCL 后总线时序恢复A 和 B 继续仲裁输赢取决于第一个不被 SCL 延展打断的电平竞争位置。这个过程的复杂性在于从机的延展会改变仲裁的时间窗口但不会改变仲裁的规则。你的主机逻辑只要做好了等待 SCL 释放和逐位仲裁检测两个机制组合场景就能正确应对。坏就坏在有些实现里仲裁检测和 SCL 等待是分开写的等待期间把仲裁逻辑暂停了导致释放后没有立即恢复仲裁判断。6.2 多主机I2C总线的设计清单基于我做过的几个多主机 I2C 项目整理一份可以直接参照的设计清单。物理层所有主机和从机必须是开漏输出或配置为开漏模式上拉电阻阻值要综合考虑总线电容和主机数量。主机越多总线上拉电阻需要越强阻值越小但太小会让低电平下拉电流过大一般先从 4.7k 起步根据示波器波形调整。总线空闲检测所有主机发起事务前必须确认 SDA 和 SCL 均为高电平。这个检测不能省它决定了主机是否插队进入一个已经进行中的事务。仲裁失败处理检测到仲裁失败后进入高阻等待状态禁止发送 STOP 和任何 SDA 数据等待总线空闲后加入随机延时再重试。时钟延展等待主机每个 SCL 高电平阶段都要检查 SCL 是否被拉低等待期间保持 SDA 不变并设置超时阈值。互斥与确认对数据阶段仲裁可能导致的副本不一致在应用层增加回读确认或令牌机制比如约定某个寄存器由主机 A 独占主机 B 只能读不能写。6.3 从踩坑到稳定我的三点经验最后说几句真切的体会。第一条如果你只是在单主机系统里用 I2C多主机仲裁这个机制你可能永远感知不到。但一旦要接两个主机别急着开工先在纸上把仲裁失败后的状态流转画清楚然后写一个最小测试——两个主机同时发数据逻辑分析仪盯住 SDA 的波形确认失败方确实在正确的位置退出了。这个测试花半天能省之后调 bug 的半个月。第二条时钟延展看起来是从机的事但其实主机组的责任更大。从机拉低 SCL 是它的权利等待 SCL 变高是主机的义务。你的主机只要不等待任何支持延展的从机都会随机出现通信错误。这是排查 I2C 偶发故障时首先要怀疑的方向。第三条如果系统既有多个主机又有支持延展的从机我会倾向于把主干部分用硬件 I2C 外设但给每一段传输预留一个超时中断而像 EEPROM 写入这类延展时间特别长的操作直接切换成软件模拟 I2C专门给它写一个稳健的等待循环。混用不可耻能解决实际问题就是好的设计。我现在手上的双主控项目已经稳定运行大半年了回看当初那个卡死的总线其实问题链条非常清晰两个主机同时访问、没有仲裁退出逻辑、从机延展期间主机还在乱动 SDA。这三个问题单独拎出来都好解决但它们叠加在一起时整条总线就像被按了暂停键再精妙的协议设计也救不回来一个不会等待的主机。

相关推荐

OpenHarmony I2C实战:从物理连接到HDI驱动全链路排障
OpenHarmony I2C实战:从物理连接到HDI驱动全链路排障

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:06:12

ESP32多应用NVS隔离:Flash命名空间与分区方案实战
ESP32多应用NVS隔离:Flash命名空间与分区方案实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:06:12

SiP偏振补偿器:面向CPO光互连的低损高稳偏振调控方案
SiP偏振补偿器:面向CPO光互连的低损高稳偏振调控方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:06:12

800VDC固态直流断路器两级选择性保护:125A与1250A配合实战
800VDC固态直流断路器两级选择性保护:125A与1250A配合实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:10:14

智能车竞赛电路设计:稳定电源与电机驱动的关键实现
智能车竞赛电路设计:稳定电源与电机驱动的关键实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:10:14

视频接口(2)—— MIPI Solution
视频接口(2)—— MIPI Solution

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:10:14

JNDI详解
JNDI详解

JNDI 详解 这是我以前在 OneNote上写的,现在搬家ing 在CSDN上…绝对是自己写的原创! 如果嫌字小,图看不清 可以私聊发全图 或者 pdf文档; 告辞~ · 2026/11/6 1:10:14

千仓一本账:Tair分布式存储的对照表路由、迁移一致性与热点治理全解析
千仓一本账:Tair分布式存储的对照表路由、迁移一致性与热点治理全解析

目录 一、先认识这位"大管家":Tair 是什么,又不是什么 (一)一句话定位与三个基本概念 1、从淘宝内部缓存到云上产品的演进 2、存储引擎:一套集群框架,三种仓内陈设 3、namespace、version、expire:三把钥匙 (二)使用场景:哪里该用,哪里慎用 1、适合… · 2026/11/6 1:10:14

IT6152双端口MIPI转DP 1.4桥接芯片设计与调试指南
IT6152双端口MIPI转DP 1.4桥接芯片设计与调试指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:09:14

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07

三菱PLC数据采集到数据库的时序设计:Python+MC协议实战
三菱PLC数据采集到数据库的时序设计:Python+MC协议实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:02:11

ASIC主模式RTL设计:状态机与三态驱动的流片级实现
ASIC主模式RTL设计:状态机与三态驱动的流片级实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:02:11

STM32嵌入式C++开发:GDB调试与Renode仿真实战指南
STM32嵌入式C++开发:GDB调试与Renode仿真实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:02:11

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码