简介《A992D产品数据手册》是一份面向数控系统I/O通讯协议芯片研发、选型与硬件设计人员的PDF技术资料重点服务需要为三菱、发那科数控系统快速适配基本或远程I/O地址控制的技术团队也适合具备一定研发能力、希望缩短产品评估周期的工程师查阅。资源包共1个PDF文件约845KB内容围绕A992D、F992D、M990D等适用产品展开兼具规格查阅与方案评估价值。目前已有263人浏览学习。文档涵盖产品概述、参数列表、电气特性、静态电流、I/O工作电压、封装信息、结构介绍、订货信息及引脚功能等模块并涉及16×16、32×32、64×64、96×64、96×96等地址资源配置以及最多3个通道选择、SPI用户接口、QFN小体积封装、二次开发和个性化加密等特性。读者可据此梳理芯片规格边界、核对硬件设计条件并参考其接口与封装信息完成协议芯片选型和研发方案初步判断。1. 一台老加工中心要扩 96 点 I/O为什么先翻这份芯片手册车间里一台三菱系统的加工中心要加 96 点 I/O现成远程 I/O 单元的报价和交期都不太理想翻资料时翻到了这份芯片手册。它讲的是一颗面向三菱数控系统和发那科数控系统的 I/O 通讯协议芯片把 I/O Link 和远程 I/O 那套协议栈封进 6mm×6mm 的 QFN48 里链路层、地址分配、端口扫描都由芯片负责用户侧只留一个 SPI 从站接口。做数控配套的团队拿它当核心自己写上层逻辑就能做出远程 I/O 模块、手轮接口板、带个性化加密的二次开发产品。它适合有硬件和固件能力的产品研发团队不适合只想改两个参数就上机的现场调试员。2. 型号、地址资源和电气边界动手画板前先定三件事2.1 96 入 96 出是怎么落到 12 个字节寄存器上的手册 5.4 节的地址表是整份文档里最该先吃透的部分。读操作地址 0x01 到 0x0C对应寄存器 0 到 11标号 Y0 到 Y11写操作地址 0x81 到 0x8C对应寄存器 X0 到 XB。各 12 个寄存器每个 8 位12×8 正好 96这就是“96 路输入、96 路输出”的物理来源。这里有个方向问题第一次看很容易绕进去。站在从站芯片的角度Y 是主站数控系统下发给你的输出状态X 是你采集现场信号后上报给主站的输入状态。所以用户侧的 MCU 通过 SPI “读 Y”拿到的是数控系统想让现场负载动作的状态“写 X”是把现场按钮、限位、接近开关的状态交上去。方向和很多人第一反应的相反画板前先在纸上把这条数据流画一遍后面写驱动能省不少时间。地址资源决定了你能挂几个单元。手册写明三菱侧最多支持 8 个单元模块分配串行连接占用的站点通道数要小于 8。这意味着你做多点位系统时不能只算单板的 96 点得把整条链路上的站点预算一起算。举个具体场景一条线上要 4 块 96/96 的板子那就是 4 个站点还没到 8 的上限但如果每块板子内部又拆成多个逻辑单元站点数会往上叠。我一般会在方案阶段就画一张站点分配表标清每块板的卡号、起始地址段、占用的站点数评审时对着表核一遍比调试时抓瞎强。2.2 型号矩阵手轮通道是分水岭手册 2.2 节给了三款典型型号的参数这张表值得单独拎出来看。型号适宜系统内核电压I/O 电压X 地址Y 地址手轮通道应用层协议A992A三菱 发那科1.2V3.3V96962标准 TTL 协议F992A发那科1.2V3.3V96962标准 TTL 协议M990A三菱1.2V3.3V9696无标准 TTL 协议三款的地址资源一样差别全在系统和手轮上。手轮通道只有发那科侧有效手册 6.7 节标题后面直接标了【FANUC 系统有效】三菱侧那颗 M990A 干脆没有手轮通道。所以选型第一步不是数点数是先确认主机系统只做三菱配套就选 M990A只做发那科就选 F992A两边都要通吃才上 A992A。多花的成本买的是兼容性不是性能。第二步才是点数。手册摘要里提到产品线覆盖 16/16、32/32、64/64、96/64、96/96 几种规格实际选型时按现场点位数向上取整再留 15% 到 20% 的余量。96 点的板子做 80 点的活最舒服硬顶到 96 点后面想加两个气缸都没地方。第三步看封装兼容。手册 2.6 节写明了管脚完全兼容型号 F992D、M990D第 1.2 节的适用产品清单里还列了 A992D、F992D、M990D、F992A、M990A、A992A、A110A。后缀 D 和 A 是两代产品管脚兼容意味着换型号不用重画 PCB这对已经开过一版板子的团队是实打实的省事。我做二次改版时习惯把兼容型号列在原理图首页的注释框里免得隔半年自己都忘了这板子还能贴哪几颗。2.3 电气边界与电源预算手册 2.3 节的工作条件表得逐条对着看超范围的数据手册明说了“仅供参考不保证所有器件都能正常工作”。参数符号最小最大备注内核电压VCC1.14V1.26V典型 1.2VI/O 电压VCCX2.375V3.46V典型 3.3V工作温度TA-40℃85℃—储存温度Tstg-65℃125℃—结温TJ-40℃100℃—ESDHBM—1000V人体模型静态电流这块手册给了 ICC 在 VCCX3.3V 下典型 2.8mAICCX 加载时典型 2.45mA、最大 2.74mA。芯片本身是毫安级的耗电户做电源预算时真正的开销在别处48MHz 有源晶振、422/485 差分驱动、两颗状态 LED、再加上你外挂的隔离器件。我一般按整板 50mA 到 80mA 估LDO 选 200mA 以上留余量别让 LDO 贴着额定电流跑温升和纹波都会难看。还有一处容易误读手册 2.1 节写 I/O 电平标准支持 LVCMOS、LVTTL、LVDS、SSTL、HSTL 等多种标准这是芯片 I/O 单元的能力描述不代表随便哪个脚都能配成 LVDS。实际能用哪种电平要结合 2.5 节的 I/O 工作电压表和具体脚定义来定LVDS 这类差分标准对引脚配对有要求别看到列表里有就直接往上接。封装是 QFN486mm×6mm无铅制程符合 RoHS物质成分信息符合 IPC-1752。QFN 的散热焊盘一定要按手册推荐的钢网开孔做我见过为了省事把散热焊盘开成整片大铜的回流后芯片底下全是空洞低温测试直接翻车。3. 原理图落地电源、晶振、使能、差分驱动四段3.1 1.2V 内核与 3.3V I/O 的双路设计手册 6.1 节把电源要求写得很直白I/O 用 3.3V内核 1.2V电源纹波控制在 30mV 以下建议采用高纹波抑制、低纹波输出、电压精度稳定的线性精密 LDO 降压输出侧按手册或高于手册要求追加较大容量滤波电容芯片电源供电加入磁珠进入芯片前设计旁路滤波电容。照着这段话落地我一般走这么几步前级如果有 24V 或 12V 转 5V 的开关电源那是系统级的事别让它直接灌到芯片上。3.3V 单独用一颗 LDO从 5V 降下来输出端放 10µF 钽电容 0.1µF 陶瓷电容。1.2V 再用一颗 LDO 从 3.3V 降不要用开关电源直出也不要用电阻分压凑。每路电源进芯片前串一颗磁珠磁珠后面紧跟 0.1µF 旁路电容电容尽量靠近引脚放。上电后用示波器交流耦合量纹波探头接地弹簧要用上别拿长地线夹子量量出来的全是自己引入的噪声。磁珠的选型不是随便抓一颗。我一般选 100MHz 下阻抗 600Ω 左右、额定电流 200mA 以上的型号直流电阻要小否则 1.2V 那一路压降会吃掉余量。旁路电容的容值组合也有讲究0.1µF 管高频再并一颗 1µF 或 4.7µF 管中频单放一颗 0.1µF 在大电流瞬变时会显得不够。提示纹波要在满负载、最高工作温度下测。空载测出来的 10mV 说明不了问题芯片内部逻辑翻转最凶的时候才是纹波最难看的时刻。3.2 48MHz 有源晶振不是随便贴一颗手册 5.3 节的要求很明确外部有源晶振频率 48MHz宽温、低失真、低温漂。6.2 节补了一句要求采用有源晶体电源接入前设计磁珠及旁路滤波电容。结构介绍那一节还专门解释了为什么用外置晶振——确保低温漂移提高信号通讯稳定性。注意“有源”这两个字。无源晶振需要芯片内部起振电路配合而这份手册要的是自带起振的有源晶振输出直接进第 11 脚 48M_CLK。贴错料是新手最容易犯的错无源晶振贴上去示波器一量时钟脚是死的还以为是芯片坏了。落地步骤选 48MHz 有源晶振工作温度覆盖 -40℃ 到 85℃频率稳定度按你的通讯误码率要求往上选。晶振供电用 3.3V进电源脚前串磁珠紧挨着放 0.1µF 旁路电容。输出走线尽量短不要跨电源分割不要在时钟线上挂长测试飞线。晶振底下铺地但别把输出脚正下方的地铺得太满分布电容会拖慢边沿。上电先量时钟再看通讯顺序反了会浪费很多时间。我踩过一次坑为了省 BOM选了一颗常温有源晶振实验室 25℃ 一切正常拉到 -20℃ 环境箱里通信开始间歇性丢包。换了宽温型号之后问题消失。手册说的“低温漂”不是客套话是给户外和冷库场景准备的。3.3 IC_EN 与两颗状态灯第 3 脚 IC_EN 是芯片选通手册 6.3 节写得很重“在不选通的前提下芯片无法正常工作”。这句话看着像废话实际调试时一半以上的“芯片没反应”都是这个脚没处理好。设计上要注意两点。一是别让 IC_EN 悬空悬空的 CMOS 输入会乱跳芯片处于半开半关的状态功耗和通信都不可预期。二是上电时序我一般让 IC_EN 受一个 RC 延时网络或专用复位芯片控制保证 1.2V 和 3.3V 都稳定之后再释放释放时间按手册的复位要求留够余量。第 48 脚 IC_/RST 是复位脚低有效同样需要保证上电时有一个足够宽的低电平窗口。状态灯是排查时最省事的东西。第 9 脚 LED1 是 Link error第 10 脚 LED2 是 Link ok。手册 6.3 节特别提了一句“原理图中请给予设计”这话是有分量的我见过为了省两个电阻把 LED 砍掉的版本出了问题只能拿示波器一根一根量效率差一个数量级。LED 串联电阻按 3.3V、2mA 算1kΩ 到 1.5kΩ 之间别用 330Ω 那种大电流配置QFN 封装的散热余量不宽裕。3.4 422/485 差分驱动、阻抗匹配与 TVS手册 6.5 节按系统分了两种通信驱动方案。发那科侧走 JD1A_1 到 JD1A_4、JD1B_1 到 JD1B_4 这几组信号三菱侧走 RA、RB 信号两边都建议选工业级 422/485 通讯驱动器件工作电压 3.3V。系统端口信号芯片引脚范围保护要求发那科JD1A_RO/DI、JD1B_RO/DI38 到 41阻抗匹配 TVS三菱RIO_DI/DE/RO42 到 44RA、RB 阻抗匹配 TVS落地时我会把这几件事做实。终端电阻按 120Ω 配位置放在链路末端而不是每块板都放中间节点挂终端电阻会把信号幅度打下来。TVS 选低结电容的型号结电容大了会拖慢边沿本来能过的高速信号被保护器件拖成方波变圆波反而增加误码。AB 线走差分对等长、紧耦合不要为了走线方便拆开走。手册 5 节还提到端口支持混插会自动扫描识别 JD1A、JD1B 通讯端口。这个特性对现场维护很友好接线时不用死记哪个口插哪个芯片自己认。但自动识别不等于随便插做产品的时候还是建议在丝印上把 A 口 B 口标清楚现场人员看到标识心里才有底。4. SPI 从站时序把 8051 例程拆成可移植的驱动4.1 寄存器地址表读 0x01 到 0x0C写 0x81 到 0x8C手册 5.4 节给的地址表整理成下面这样更清楚。操作地址范围对应寄存器实际含义读0x01 到 0x0C寄存器 0 到 11标号 Y0 到 Y11主站下发的输出状态写0x81 到 0x8C寄存器 0 到 11标号 X0 到 XB上报给主站的输入状态写0x91三菱 IO 第一卡地址默认 0起始地址段选择写0x92三菱 IO 第二卡地址默认 1起始地址段选择写0x93三菱 IO 第三卡地址默认 2起始地址段选择地址的最高位就是读写标志0 为读1 为写。所以读 0x01 和写 0x81 指向的是同一组寄存器编号的不同方向低 7 位才是真正的寄存器索引。这个设计在 SPI 器件里很常见理解之后看地址表就顺了。三菱侧那三个 0x91、0x92、0x93 是给多单元级联用的手册明确标了【三菱系统有效】、【FANUC 不使用】。这句话要划重点发那科系统的地址分配走的是另一套逻辑见 6.8 节。4.2 写时序先降时钟再放数据手册给的 8051 例程我按自己的注释习惯重写了一遍逻辑完全一致。#include stc8051.H #include intrins.h sbit SPI_CS P1^1; // 片选低电平有效 sbit SPI_CLK P1^0; // 时钟上升沿采样 sbit SPI_DI P1^2; // 主出从入 sbit SPI_DO P1^3; // 主入从出 /* 写一字节先发地址最高位置 1再发数据 */ void W_SPI(unsigned char ad, unsigned char da) { unsigned char i; SPI_CS 0; // 拉低片选开启一次事务 for (i 8; i ! 0; i--) { // 地址字节MSB 先行 SPI_CLK 0; // 时钟先降让数据稳定 SPI_DI (ad 0x80) ? 1 : 0; // 取最高位送出 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; } _nop_(); // 收尾留一点保持时间 SPI_CLK 0; SPI_DI 0; SPI_CS 1; // 抬片选事务结束 }这段代码的核心是节拍先把时钟拉低再把数据放到 DI 上然后拉高时钟从机在上升沿采样。整个字节 8 个节拍MSB 先行。片选拉低到拉高之间必须是一次连续的事务中间不能松 CS松了从机会把这次操作当废帧丢掉。_nop_()那一下是给保持时间留的余量虽然 8051 的指令周期本身就慢但移植到更快的 MCU 上时这个余量就不能省。参数上时钟频率先在 100kHz 跑通确认数据对了再往上提手册说理论上支持 20M 带宽实际建议 5M。这句话我理解成两个意思一是芯片内部逻辑在 5M 以下最稳二是用户侧主控能不能稳定跑 5M 是另一回事8051 的位操作跑不到这个数换成带硬件 SPI 的 MCU 或 CPLD 才有意义。4.3 读时序那个“空闲一个时钟”的作用/* 读一字节发地址空一个时钟再收数据 */ unsigned char R_SPI(unsigned char ad) { unsigned char i; unsigned char ar; 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; // 空一个时钟给从机翻转时间 ar 0; SPI_DO 1; // 8051 准双向口读之前先写 1 for (i 8; i ! 0; i--) { // 收数据字节 SPI_CLK 1; ar 1; if (SPI_DO) ar | 0x01; // 高电平期间读回一位 SPI_CLK 0; } SPI_CS 1; return ar; }读时序比写时序多两个细节都是容易翻车的地方。第一个是地址字节和数据字节之间那个“空闲时钟”。注释写的是“给对方多一些时间”本质是给从站留一个周期的总线翻转窗口让 DO 从高阻切到驱动状态。移植的时候这个周期不能省省了可能出现首位数据读错。第二个是SPI_DO 1这一句。8051 的 P1 口是准双向结构做输入之前必须先写 1 把内部下拉管关掉否则读回来恒为 0。这个坑在 8051 上踩过的人都懂换到 STM32 的推挽/开漏配置上就不存在但如果你照着这份例程往别的 8 位机上搬一定要先确认端口的输入配置。4.4 移植到带硬件 SPI 的 MCU 或 CPLD8051 的位操作版本适合验证逻辑不适合做产品。真要上量换成带硬件 SPI 的 MCU 或 CPLD代码量会小很多。/* STM32 侧封装SPI 模式 08 位MSB 先行软件片选 */ static inline void a992d_cs_low(void) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); } static inline void a992d_cs_high(void) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); } /* 读地址最高位保持 0 */ uint8_t a992d_read_reg(SPI_HandleTypeDef *hspi, uint8_t addr) { uint8_t tx addr 0x7F; uint8_t rx 0; a992d_cs_low(); HAL_SPI_TransmitReceive(hspi, tx, rx, 1, 10); a992d_cs_high(); return rx; } /* 写地址最高位置 1地址和数据分两段发 */ void a992d_write_reg(SPI_HandleTypeDef *hspi, uint8_t addr, uint8_t val) { uint8_t tx addr | 0x80; a992d_cs_low(); HAL_SPI_Transmit(hspi, tx, 1, 10); HAL_SPI_Transmit(hspi, val, 1, 10); a992d_cs_high(); }配置上盯住四个参数SPI 模式 0CPOL0、CPHA0、数据宽度 8 位、MSB 先行、时钟不超过 5MHz。片选必须用软件控制不能用硬件 NSS因为一次事务的边界是 CS 的下降沿到上升沿用硬件 NSS 容易出现帧边界错位。超时给 10ms 足够真超时了说明硬件有问题靠重试救不回来。CPLD 侧的实现思路类似用状态机把地址字节、空周期、数据字节三段串起来时钟分频到 1MHz 到 5MHz 之间先跑通再提速。我一般会留一个可调的时钟分频寄存器调试阶段降频看波形量产再锁死。5. 避坑排查五个把板子救回来的现场记录5.1 现象SPI 时序全对读回来恒为 0xFF现象示波器上 CS、CLK、DI 三根线的波形都漂亮模式也对读任何寄存器都返回 0xFF。原因按出现概率排第一是 IC_EN 没释放或者极性搞反芯片根本没被选通第二是 1.2V 内核没起来只有 3.3V 在第三是 48MHz 有源晶振没起振或者贴成了无源晶振。解决按电压、使能、时钟的顺序查不要一上来就怀疑代码。先量第 12 脚 1.2V再量第 3 脚 IC_EN 电平最后量第 11 脚的 48MHz 波形再看 LED2 是否点亮。这个顺序是我固定下来的检查清单比对着代码改十遍快。5.2 现象手轮摇起来丢步偶尔方向还反现象发那科系统上接手轮慢摇正常快摇丢计数个别时候方向反一下。原因手轮脉冲没有经过整形缓冲就直接进了第 4 到 7 脚长线本文还有配套的精品资源点击获取