☰
A992D双体系I/O协议芯片:协议适配、SPI从站与调试实战
2026/10/29 13:27:03 网站建设 项目流程

简介:《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.265V,I/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 手轮脉冲为什么要过一级 74LV14

6.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 节要求把 LED1(Link error)和 LED2(Link ok)画进原理图,这一条值得单独拎出来说。在一个没有日志的黑匣子系统里,两颗 LED 就是全部的运行时可观测性。Link ok 亮说明链路握手成功,Link error 亮说明探测失败或者帧错误累计超阈值。现场排故时,先看这两颗灯,能把问题范围砍掉一半——灯不亮就往物理层查,灯亮但数据不对就往 SPI 侧查。

从那以后我每次上电前都强制走一遍同样的流程:先用万用表点 IC_EN 和 VCCX 的实际电平,再确认 48MHz 晶振起振,最后才接上位机读寄存器。这个习惯是被一个"灯亮着但读回全零"的现场教出来的——那次是 IC_EN 通过一个 10k 电阻上拉,焊接时虚焊,万用表量电压正常,示波器看波形才发现上电瞬间被拉低了几十毫秒,刚好错过主站自检窗口。这类问题不建立固定流程,每次都只能靠运气。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询