A992D双体系I/O协议芯片:协议适配、SPI从站与调试实战
简介《A992D产品数据手册》面向数控系统I/O及I/OLink通讯协议芯片的选型、硬件研发与二次开发人员聚焦三菱、发那科系统基本或远程I/O地址自动适配需求帮助具备研发能力的技术团队缩短方案评估与产品化周期。资源包共1个PDF文件约845KB以数据手册为主体集中说明协议芯片的地址资源、通道配置、SPI用户接口、QFN封装、体积小及个性化加密等特性。手册涵盖产品概述、参数列表、电气特性、静态电流、I/O工作电压、封装信息、结构介绍、订货信息与应用技术并列出A992D、F992D、M990D等适用型号便于核对16×16、32×32、64×64、96×64、96×96等输入输出配置、最多3通道选择及引脚功能。手册还给出技术支持与反馈、文档声明及引脚功能说明方便研发人员从选型、原理图到PCB设计阶段对照查阅。已有258人学习可作为协议芯片选型、电路设计与快速产品化的工程参考资料。1. 双体系兼容的真相A992D 产品数据手册里最反直觉的一条拆开这份 A992D 产品数据手册最反直觉的一条是这颗数控系统 I/O 协议芯片要同时对接两套完全不同的通讯体系其中一套走 I/O Link 串行总线另一套走远程 I/O 单元串行连接而它靠的不是在固件里跑两套协议栈再让上位机选是把兼容性直接焊死在引脚和链路状态机里——同一组物理引脚加电后自己判断对面插的是哪个体系的端口然后走不同的握手流程。上位机单片机或 CPLD这侧看到的永远是一张 96 入、96 出的平坦寄存器表读写全靠一根 SPI。协议适配这块黑匣子被整块吞进芯片内部用户代码里看不到任何条件分支。这件事值得掰开讲因为它恰好是协议适配层这个抽象最实在的一个样本什么时候该软实现什么时候必须硬化成硅片边界在哪里。踩过坑的人都懂边界画错一次量产就是血泪经验。2. 双体系共存JD1A/JD1B 与 RIO 凭什么共用一套引脚从站芯片在两种体系里的角色完全一样——被动应答但链路层的帧结构、寻址层级、扫描周期都不是一回事。手册 5.2 节的引脚表把这两套东西并排放着38 到 41 脚是 JD1B_RO / JD1B_DI 这一组差分对42 到 44 脚是 RIO_DI / RIO_DE / RIO_RO。物理上它们占不同的引脚逻辑上却共享同一份 X/Y 影子寄存器。这个物理分离、逻辑归一的结构是整颗芯片设计的骨架。2.1 从站定位两套体系里谁在扫描谁I/O Link 那套体系是主站轮询制。数控系统侧的控制单元周期性发起帧从站在自己的时隙里把输入状态塞进响应帧把输出命令从帧里取出来。这意味着从站不能主动说话只能等延迟上限由主站扫描周期决定不由芯片决定。远程 I/O 那套体系是串行菊花链。控制单元的 RIO 端口串起若干单元每个单元在链路上占一个站号数据顺着链路一站一站往下传。这里的关键约束是站号必须在链路上唯一且总站数有上限。手册 6.6 节写得很直白串行连接占用站点数小于 8这个范围内可以用多个远程 I/O 单元。两套体系对从站的共同要求只有一条本地必须有一份稳定的、随时可被读走的 I/O 镜像。所以芯片内部的架构是——两套链路层状态机各自独立跑出口都指向同一块影子寄存器阵列SPI 从站接口再挂在这块阵列的另一侧。三个方向同时访问一块存储仲裁逻辑是这颗芯片真正的技术含量所在。2.2 端口混插与自动识别链路层怎么判断对面是谁手册 5 节里有一句话很容易被略过支持端口混插自动扫描、识别 JD1A、JD1B 通讯端口。这句话背后是一段上电时序。常见的实现思路是芯片复位释放后并不立刻进入正常工作态先在两个端口上轮流发探测帧看哪个端口有合法的链路活动——差分对上有没有符合电平标准的跳变、有没有符合帧格式的响应。一旦识别成功芯片把内部状态机切到对应体系另一套逻辑保持静默但不上锁这样现场换线、换主板不用重新烧固件。这个设计的动机很实际数控机床的电气柜里同一块 I/O 板可能配不同品牌的系统产线不愿意为两种系统备两种板子。把它做成自动识别等于把库存压力从整机厂转移到了芯片的探测逻辑上。代价是上电到可用的时间被拉长了。探测窗口通常要覆盖几个毫秒到几十毫秒这个时间必须小于主站的上电自检超时。手册没有给出具体数值但从启动快被列进产品特性来看这个窗口是被刻意压过的。调试时如果遇到上电后头几秒通信异常、之后自己好了八成就是探测窗口和主站自检抢时间。2.3 R 体系的站号编址为什么起始地址是软件写的SPI 地址表里有三个特殊地址0x91、0x92、0x93分别对应 R 体系的第一卡、第二卡、第三卡起始地址默认值 0、1、2。这三个寄存器不在 X/Y 映射区里是配置寄存器。把站号做成软件可写省掉的是拨码开关或者跳线帽。硬件上一块板子可以通吃所有站号产线烧录时写一个字节就行装配工不用对着一排 DIP 开关数 0/1。这个改动听着小但在批量生产里能砍掉一整类人为错误——拨码开关拨错一位现象是地址整体偏移排查起来能耗掉一个工程师一整天。上限 8 个单元这件事是地址空间算出来的。每个单元 96 入 96 出链路上总共能分配的地址段有限8 个之后就没有余量了。手册 6.6 节把小于 8写进约束而不是建议是因为超了之后不是性能下降是直接地址冲突。做产品定义的时候这类硬约束要写死在文档第一屏不能藏在第 13 页。3. SPI 从站接口地址最高位为什么被拿来当读写标志用户侧只有一条 SPI这是整颗芯片对外的唯一数字接口。手册 5.4 节给了完整的寄存器地址表和一段 8051 的位操作驱动代码。这段代码不长但它把设计者的取舍暴露得很清楚。3.1 寄存器映射8 位地址怎么装下 192 个点X 和 Y 各 96 点也就是各 12 个字节。地址表是这么排的操作地址范围含义点数读0x01 – 0x0CY0 – Y11共 12 字节输出状态96 出写0x81 – 0x8CX0 – X11共 12 字节输入状态96 入写0x91 – 0x93R 体系第一/二/三卡起始地址配置最高位当读写标志用0 是读1 是写。这一手很省——SPI 标准四线里本来就没有独立的 R/W 线要么在命令字里留一位要么多一根 GPIO。留一位的代价是可用地址空间从 256 砍到 128对于只需要 12 12 3 个地址的场景这个代价几乎为零。取舍就在这里地址空间是稀缺资源还是过剩资源决定了你会不会用最高位当标志位。做 MCU 片上外设的时候没人敢这么干做专用协议芯片的时候这就是最划算的方案。看别人的寄存器映射能反推出对方对资源稀缺程度的判断。3.2 速率20M 是理论值5M 是工程值手册写理论上数据传输支持 20M 带宽我们建议 5M 为宜。这两句话之间的距离就是实验室和电气柜之间的距离。20M 大概是芯片内部同步器能稳定采样的上限SPI 从站不需要恢复时钟只要 SCK 的建立保持时间满足就能工作。但实际链路上有四个东西在吃余量一是上位机如果用 GPIO 位操作模拟 SPI一个时钟周期里要算分支、要写端口8051 上跑 5M 已经很勉强二是排线长度和没有端接带来的振铃边沿越陡振铃越凶三是 SCK 和 MOSI 之间的走线偏差长线并行传输时这个偏差会直接吃掉建立时间四是从站内部同步器本身有两级触发器的亚稳态窗口采样点落在窗口边缘时误码率会上升。压到 5M等于把大部分余量留给前三个变量。这是个典型的保守取值不是芯片做不到是不知道用户会把它焊在什么样的板子上。我在类似场景下一般也会这么写建议值——文档里的建议往往是在替用户的未知布线下限兜底。3.3 驱动代码逐段拆位操作模拟 SPI 的三个坑手册给的驱动是 8051 的位操作版本改写成标准 C 之后逻辑是这样/* 位操作模拟 SPI 从机主机侧时序4 线模式 0 */ sbit SPI_CS P1^1; /* 片选低有效 */ sbit SPI_CLK P1^0; /* 时钟上升沿采样 */ sbit SPI_DI P1^2; /* 主出从入 MOSI */ sbit SPI_DO P1^3; /* 主入从出 MISO */ /* 写一个字节先发 8 位地址再发 8 位数据 */ void W_SPI(unsigned char ad, unsigned char da) { unsigned char i; SPI_CS 0; /* 拉低片选帧开始 */ for (i 8; i ! 0; i--) { /* 地址阶段 */ SPI_CLK 0; SPI_DI (ad 0x80) ? 1 : 0; /* 先发高位 MSB first */ ad 1; SPI_CLK 1; /* 上升沿从机采样 */ } for (i 8; i ! 0; i--) { /* 数据阶段 */ SPI_CLK 0; SPI_DI (da 0x80) ? 1 : 0; da 1; SPI_CLK 1; } SPI_CLK 0; SPI_DI 0; /* 释放数据线 */ SPI_CS 1; /* 拉高片选帧结束 */ } /* 读一个字节地址阶段同写数据阶段改为采样 MISO */ unsigned char R_SPI(unsigned char ad) { unsigned char i, ar 0; SPI_CS 0; for (i 8; i ! 0; i--) { /* 地址阶段最高位 0 表示读 */ SPI_CLK 0; SPI_DI (ad 0x80) ? 1 : 0; ad 1; SPI_CLK 1; } SPI_CLK 0; /* 空一个时钟给从机准备时间 */ SPI_DO 1; /* 准双向口读之前必须先写 1 */ for (i 8; i ! 0; i--) { /* 数据阶段 */ SPI_CLK 1; ar 1; if (SPI_DO) ar | 0x01; /* 上升沿后采样 MISO */ SPI_CLK 0; } SPI_CLK 0; SPI_CS 1; return ar; }W_SPI的地址和数据两个循环结构完全一样区别只在写入的字节来源这种写法在 51 上很省 code size。R_SPI多了一个空时钟周期位置在地址发完、数据读之前——从站收到地址后需要一拍时间把对应寄存器挂到 MISO 上这一拍不给读回来就是上一个字节的尾巴。第一个坑是SPI_DO 1这一句。8051 的 P1 是准双向口读引脚之前必须先写 1 把内部上拉打开否则读到的是自己锁存器的旧值。换到 STM32 这类真正双向的 GPIO 上这一步要改成切换引脚方向从输出模式切到输入模式而且切换本身有延迟5M 时钟下这个延迟可能正好吃掉半个位周期。移植这类代码最容易翻车的地方就在这。第二个坑是时序靠_nop_()和对齐。原文代码里的延时只有一两条空指令5M 下 8051 一个机器周期 1us 级别时钟高低电平各占多久完全由指令执行时间决定没有余量。稍微加点别的中断进来时钟就被拉长或者压缩从站那边看到的是畸形的 SCK。稳妥做法是用硬件 SPI 外设实在要用位操作就把延时做成宏编译后逐条核对汇编。第三个坑是原文里adc 1这一行——变量名写错了ad被写成了adc在某些编译器上直接报未定义在某些宽松环境里会把一个随机内存位置左移。手册给的示例代码是参考实现不是可以直接编译通过的工程代码拿来抄之前最好逐个变量对一遍。这种细节在数据手册里很常见文档的定位是讲清机制不是交付一个可运行库。4. 电源与时钟48MHz 有源晶振和 30mV 纹波在保什么手册 6.1 和 6.2 两节加起来不到十行但这两节是整份文档里最不能跳的部分。96 入 96 出的数据在 SPI 和串行链路之间来回搬任何一次采样错误都会被放大成一个 IO 点误动作。4.1 双电源域1.2V 内核和 3.3V I/O 的边界手册 2.3 节给的推荐工作条件是内核 VCC 1.14V 到 1.265VI/O VCCX 2.37V 到 3.46V结温 -40℃ 到 100℃。注意 VCCX 的下限是 2.37V 而不是 3.0V这对应 2.5V 那一档 I/O 标准手册 2.5 节的 I/O 工作电压表里 LVCMOS25 写的典型值就是 2.5V。双电源域意味着上电顺序有讲究。一般原则是先 I/O 后内核或者两路同时到原因是 I/O 域先建立可以让引脚处于确定的电平避免内核还没起来时 I/O 悬空导致外部电路误触发。手册没有明写顺序要求但 6.1 节强调电源纹波 30mV 以下和建议采用高纹波抑制低纹波输出的线性精密 LDO实际是在说同一件事——这两路电源的质量直接决定采样窗口的稳定性。30mV 这个数字看着严放到 1.2V 的域上就是 2.5% 的纹波。内核在 48MHz 时钟下跑状态机供电噪声会直接调制到内部延时链上表现出来就是偶发的链路误码。2.4 节给的静态电流典型值 2.8mA、加载时 2.74mA这个量级很小意味着 LDO 选型不能只看额定电流要看轻载下的噪声和负载瞬态响应。用一颗 1A 的开关电源芯片供电静态电流只有几毫安芯片工作在跳周期模式纹波反而更大。这类翻车在低功耗设计里太常见了。4.2 外部有源晶振低温漂为什么必须外置3 节结构介绍里写得很清楚采用外置晶体时钟确保低温漂移提高信号通讯稳定性。5.3 节补了要求48MHz 有源晶振宽温、低失真、低温漂。为什么不用无源晶振加内部振荡器成本更低、少一个电源引脚。但无源晶振的起振依赖内部反相放大器的跨导和外部负载电容的匹配这两样都随温度漂。低温下负载电容的容值会掉等效串联电阻会升起振时间变长甚至不起振。整机在 -40℃ 冷库或者北方冬天室外启动第一帧数据发不出去主站超时报警现场只能重启。有源晶振自带起振电路输出的是已经整形好的方波芯片这边只需要一个输入缓冲。代价是多一路电源、多一颗磁珠和旁路电容、BOM 成本上升。对于工业级产品这个代价换的是冷启动一次成功很值。手册把宽温、低失真、低温漂三个词并列写出来说明选型时这三个指标是 AND 关系不是 OR。4.3 手轮脉冲为什么要过一级 74LV146.7 节是版本 B0.3 专门加进去的写的是手持单元脉冲设计要求必须选择工业级 74 系列 LV14 低工作电压高速驱动芯片理由是否则手轮脉冲信号可能会错乱或相对比较容易损坏到 A992D 芯片。这句话信息量很大。手轮输出的是方波机械式手轮通过光电或者磁编码器产生 A/B 两相正交脉冲。这类信号经过几米长的拖链线缆之后边沿会变缓、会带振铃、可能还有负向过冲。直接进芯片有两个后果一是缓变的边沿落在施密特触发器的阈值附近噪声会让它来回穿越芯片内部计数器把一个脉冲数成两个甚至三个二是负向过冲超过衬底二极管的正向压降电流灌进 I/O长期下来损伤 ESD 结构。74LV14 是六路反相施密特触发器迟滞窗口把慢边沿整形成陡边沿同时把过冲削掉一部分。这一级缓冲器的位置必须在靠近芯片的板内不能放在手轮那一端——放远端的话整形完的信号还要再走一遍长线等于白做。手册 5 节还写了一句提供 2 个高速手轮脉冲通道仅 L 体系支持。手轮信号没有走 SPI 寄存器而是直接进硬件引脚由内部逻辑映射进 L 体系的扫描数据区。原因是手轮脉冲频率远高于主站扫描周期走 SPI 轮询一定会丢步。这条设计取舍很清楚——高频信号走硬件通路低频状态走寄存器。5. 排查实战五个从站不工作、地址错位、手轮丢脉冲的现场记录调试这类芯片现象往往只有一句不通信能拿到的信息就是 SPI 读回来几个字节。下面这几条是这类从站芯片上重复率最高的。5.1 现象SPI 有时钟但读回恒为 0x00 或 0xFF原因通常不在 SPI 本身。第一个要查的是 IC_EN——手册 5.2 节第 3 脚定义为芯片选通6.3 节明确写了在不选通的前提下芯片无法正常工作。这个引脚如果悬空靠内部上下拉可能凑巧能工作一上批量就一半不启动。第二个要查的是片选极性代码里SPI_CS 0是低有效接反了整帧都不会被识别。解决方式很朴素上电后先用万用表点 IC_EN 的电平确认是有效态再用示波器看 CS 拉低到第一个 SCK 上升沿之间的间隔这个间隔太短从站来不及进帧同步。手册的时序图里没标这个最小值实践中给到几百纳秒以上比较稳。5.2 现象R 体系侧 IO 点整体偏移 16 或 32 个点单个单元调试时 X0 对 X0 完全正常挂上第二个单元后所有点位整体平移。原因是起始地址寄存器 0x91 / 0x92 / 0x93 没跟着配。手册 6.6 节写的是I/O 接口起始地址通过 SPI 接口软件指定也就是说站号不由硬件决定完全靠软件写入。正确的做法是先只挂一个单元确认基础地址再逐个增加单元并同步改寄存器每加一个验证一次。一次性把 8 个单元全挂上再调出问题时无法判断是哪个单元的地址写错了。5.3 现象手轮转一格计数跳 2 到 3前面 4.3 节讲过机理这里给判据示波器抓手轮信号进芯片那一端的波形看边沿上升时间。如果超过几十纳秒且带明显振铃基本可以确定是整形缺失。加 74LV14 之后波形会变成干净的方波。还有一种情况是差分走线没做阻抗匹配。手册 6.5 节建议对通讯信号做阻抗匹配和 TVS 保护这条同样适用于手轮通道的长线。匹配电阻放在接收端TVS 放在连接器附近两个器件的位置搞反了效果会打对折。5.4 现象常温一切正常低温下偶发丢帧先怀疑时钟再怀疑电容。如果用的是无源晶振方案-20℃ 以下起振时间会明显变长主站上电自检窗口内可能还没稳定。换成有源晶振能直接消除这个变量。旁路电容的介质类型也值得查一遍。Y5V 或者 Z5U 这类高介电常数陶瓷电容低温下容量能掉 70% 以上标称 100nF 实际只剩 30nF去耦效果大打折扣。换成 X7R 或者 X5R容量温度特性平得多。这类问题在常温实验室里永远复现不出来只有到了现场才暴露。5.5 现象照手册引脚表接线JD1A 那一路不通这份手册的版本更新记录里有一行值得注意B0.2 版本纠正通信定义脚功能名称。翻 5.2 节的引脚表第 39 脚和第 41 脚都标成了 JD1B_DI第 38 脚和第 40 脚都标成了 JD1B_RO但 6.5 节的电路设计里明明提到了 JD1A 和 JD1B 两组信号。这是典型的文档笔误第 40、41 脚按成对规律应该是 JD1A 那一组。遇到文档和实物对不上正确的顺序是先查版本更新记录看有没有相关修订再用万用表量引脚和连接器的通断反推映射关系最后才动手改板。照着一份有笔误的引脚表画 PCB改板成本比查文档高两个数量级。6. 把协议固化进硅片这笔交易的边界在哪绕了一圈回到最开始那个问题为什么不用 MCU 或者 FPGA 软实现非要专门做一颗协议芯片先看软实现要付出什么。I/O Link 那套体系要求从站在主站分配的时隙内响应时隙宽度是微秒级MCU 上跑裸机都得小心翼翼地关中断跑 RTOS 基本没戏。远程 I/O 那套要求链路转发延迟稳定菊花链上每一站的转发延迟会累加站数一多抖动就被放大。这两件事对确定性的要求都超过了通用处理器的舒适区。固化进硅片的收益是确定的延迟是固定的门延迟不随中断和调度波动功耗是 2.8mA 量级不需要考虑动态调频封装是 QFN48 6mm×6mm能塞进很小的板子。代价同样是确定的地址空间固定死了 96 入 96 出改不了两套体系的兼容靠上电探测探测窗口是硬件定死的调不了出了问题没有日志、没有断点只能靠示波器和引脚电平反推是真的黑匣子。维度专用协议芯片MCU 软实现FPGA 软核链路延迟确定性门延迟固定受中断/调度影响确定取决于综合结果修改协议细节不可改改代码即可改 RTL 重综合单板功耗2.8mA 量级数十 mA 起数百 mW 起开发周期直接画板需实现协议栈需实现协议栈 时序收敛故障可观测性仅引脚和指示灯可打日志可挂逻辑分析仪看懂这张表就能明白这类芯片真正的用户是谁不是没有研发能力的团队是有研发能力但没有协议栈积累的团队。把最难啃的链路层交给硅片把产品差异化的部分留给自己的 MCU这是分工不是偷懒。手册 6.3 节要求把 LED1Link error和 LED2Link ok画进原理图这一条值得单独拎出来说。在一个没有日志的黑匣子系统里两颗 LED 就是全部的运行时可观测性。Link ok 亮说明链路握手成功Link error 亮说明探测失败或者帧错误累计超阈值。现场排故时先看这两颗灯能把问题范围砍掉一半——灯不亮就往物理层查灯亮但数据不对就往 SPI 侧查。从那以后我每次上电前都强制走一遍同样的流程先用万用表点 IC_EN 和 VCCX 的实际电平再确认 48MHz 晶振起振最后才接上位机读寄存器。这个习惯是被一个灯亮着但读回全零的现场教出来的——那次是 IC_EN 通过一个 10k 电阻上拉焊接时虚焊万用表量电压正常示波器看波形才发现上电瞬间被拉低了几十毫秒刚好错过主站自检窗口。这类问题不建立固定流程每次都只能靠运气。希望帮到你。本文还有配套的精品资源点击获取