资讯详情

资讯详情

96入96出数控I/O扩展卡:QFN48从站协议芯片与SPI驱动落地

简介A992D产品数据手册面向从事三菱、发那科数控系统I/O通讯开发的硬件工程师与产品研发团队聚焦能自动适配基本及远程I/O地址控制的核心协议芯片方案。文档围绕协议芯片的地址适配能力展开说明从16路输入16路输出到96路输入96路输出等多种地址资源配置、最多三通道选择以及用户层SPI接口、QFN小体积封装、支持客户二次开发与个性化加密等设计特点并列出A992D、F992D、M990D、F992A、M990A、A992A、A110A等适用型号。目录涵盖产品概述、参数列表、电气特性、静态电流、I/O工作电压、封装信息、结构介绍、订货信息与应用技术等模块可据此核对选型参数、评估电路设计与接口方案。资源包共1个PDF文件约845KB已有258人学习。适合需要快速展开产品研发、缩短上市周期的技术团队作为选型与设计参考。1. 从一块 QFN48 的从站芯片说起数控系统 I/O 扩展卡真正的难点在哪做数控系统 I/O 扩展板的人最容易出错的地方往往在选型阶段而不在 SPI 怎么写协议这一层到底由谁承担。一块 6mm×6mm 的 QFN48 从站协议芯片把 I/O Link 与远程 I/O 两种从站逻辑固化进硅片主控侧只剩 SPI 搬运和业务逻辑这个边界一旦确定后面画原理图、布板、写驱动、验收的每一步都会跟着变。下面这套方案围绕 96 路输入加 96 路输出的 I/O 协议芯片展开讲三件事需求怎么划边界、硬件和驱动怎么落地、最后怎么证明它真能跑起来。适合正在做数控系统 I/O 扩展卡、远程 I/O 单元、手轮接口板的学生和工程师按这套结构走一遍方案基本能成型。2. 需求边界与技术选型96 入 96 出、双系统兼容怎么取舍数控 I/O 扩展板最容易失控的地方是需求越写越多既要兼容两种日系主流数控系统又要塞手轮通道还想一根排线通吃四五个型号。需求不先收敛原理图改到第五版都定不下来。我的习惯是先把它拆成四张清单逐条落数字再谈选型。2.1 四张清单点数、系统、接口、环境点数清单最直接X 侧 96 点、Y 侧 96 点按字节组织就是 12 字节输入加 12 字节输出寄存器模型天然对齐 8 位 SPI 传输。同族产品还有 16×16、32×32、64×64、96×64 等地址规格课程设计里如果只做一块 32 点的小板没必要上 96×96成本和布线压力都白搭。系统清单要分清两类一类是远程 I/O 总线型芯片挂在控制单元的 RIO1/RIO2 端口上串行连接占用的站点通道数不超过 8也就是最多带 8 个单元模块另一类走 I/O Link端口支持 JD1A、JD1B 混插芯片自己扫描识别。两种系统在一台设备上共存时板上一定要留配置位——跳线、拨码或者 EEPROM别指望固件自动判断。接口清单分两层对上是数控系统侧的总线端口对下是客户主控的应用层 SPI 从站口理论带宽 20M手册建议按 5M 设计。手轮通道只有 2 路且仅在 I/O Link 一类系统上有效做远程 I/O 那类系统时这两路要悬空处理。环境清单是很多人忽略的一栏工作温度 -40℃ 到 85℃储存 -65℃ 到 125℃结温上限 100℃ESD 的 HBM 指标大于 1000V封装是无铅的 QFN48 6mm×6mm符合 RoHS 与 IPC-1752 的物质成分申报要求。写方案时把这四条抄进需求表评审时没人能挑你漏项。2.2 型谱选择A、F、M 三种型号的差异与管脚兼容同一颗内核会派生几个型号差别只在适配系统和手轮通道选错型号的代价是整块板重画型谱适配系统内核 / I-O 电压X / Y 地址手轮通道应用层协议A 型双系统通吃1.2V / 3.3V96 / 962标准 TTL 串口或 SPIF 型I/O Link 一类1.2V / 3.3V96 / 962标准 TTL 串口或 SPIM 型远程 I/O 一类1.2V / 3.3V96 / 96无标准 TTL 串口或 SPI判断规则很干脆只做单一系统的量产板选 F 或 MBOM 省一点、固件分支少一半要做一板多用的平台板选 A靠配置位切系统。手册里明确标注 QFN48 管脚完全兼容同族另外两个型号这条对做产品线的人价值最大——同一块 PCB 出三个 SKU换料不改板库存和认证成本都能摊薄。2.3 外置 48MHz 有源晶振加 SPI 从站这套组合的理由有人会问主控 MCU 都在板上了为什么还要多花一颗芯片替它跑协议因为数控系统的从站时序不是普通串口能对付的。协议层要求 48MHz 时钟做位采样晶振要宽温、低失真、低温漂这些条件压在一颗通用 MCU 上选型立刻从几块钱跳到几十块钱而且协议栈还得自己维护客户现场换个系统版本就可能不认。把协议固化进从站芯片之后主控的活变成纯粹的寄存器搬运读 12 字节拿输出状态写 12 字节刷输入状态一颗 8051 级别的单片机就能跑起来。这就是这颗芯片存在的意义——它把最难验证、最容易在客户现场出问题的那一段变成黑匣子同时把灵活性留在 SPI 这一侧。代价是你要接受它的地址模型和时序约束不能想怎么改就怎么改。3. 总体架构设计三层结构与 9696 的地址映射架构图画出来只有三层但每一层的边界都得交代清楚否则布板时会出现“这根线到底归谁管”的争执。3.1 三层职责划分系统侧、协议芯片、客户主控最上面是数控系统侧提供远程 I/O 端口或者 I/O Link 端口负责站点分配、地址段下发和链路状态监测。中间是协议芯片承担从站状态机、端口自动扫描识别、地址译码和 I/O 缓存外置 48MHz 有源晶振是它的心跳。最下面是客户主控单片机或 CPLD 都行作为 SPI 主站发起读写把采集到的输入点打包、把系统下发的输出点驱动出去。这三层之间只有两组信号是跨层的关键一组是系统侧的差分通讯线要按工业现场标准做端接和保护另一组是 SPI 四线走板内短距离但要保证片选和时钟的时序余量。把这两组线在布局上彻底分开中间用地平面隔开后面调试能省掉大量玄学问题。3.2 48 脚的分区盘点与布板注意QFN48 的引脚不是按功能连续排列的布板前必须做一次分区统计电源类I/O 供电 3.3V 分布在 1、25、36 脚内核 1.2V 在 12 脚地在 2、26 脚控制类3 脚芯片选通 IC_EN48 脚复位 IC_/RST时钟类11 脚外接 48MHz 晶振信号SPI 类32 脚数据输出、33 脚数据输入、34 脚时钟、35 脚片选系统侧端口38 至 41 脚是 I/O Link 的 B 端口与 A 端口的输出与输入42 至 44 脚是远程 I/O 的输入、忙、输出手轮类4 至 7 脚两路通道各一对 A/B 信号指示类9 脚链路错误灯10 脚链路正常灯其余大量 NC 脚。注意NC 脚不要图省事直接连到地平面上也不要让走线从焊盘之间穿过。留独立的裸露焊盘、不铺铜、不走线是更稳妥的做法后续换料或改版时才不会因为短路返工。3.3 寄存器与地址映射一张表定生死芯片的寄存器模型很朴素8 位地址加 8 位数据地址字节的最高位是方向位0 为读1 为写。这块必须做成表贴在工位上写驱动时对着抄操作地址范围对应内容字节数说明读0x01 – 0x0CY0 – Y1112系统下发的 96 点输出状态写0x81 – 0x8CX0 – XB12上报给系统的 96 点输入状态写0x91 – 0x93远程 I/O 第一、二、三卡起始地址3默认 0/1/2仅远程 I/O 一类系统使用方向位和 X/Y 的对应关系是最容易搞反的一处读的是 Y输出写的是 X输入。刚上手的人往往直觉认为“我写进去的就是输出”结果一上电系统侧读到的全是错的。我在第一版驱动里就栽过这个跟头逻辑分析仪抓了半天波形才发现地址最高位没错是 X 和 Y 的对象搞反了。3.4 带宽与扫描周期估算手册写理论支持 20M 带宽建议 5M这个建议值不是保守是给时序余量留的。按 5MHz 算12 字节等于 96 个时钟单方向 19.2 微秒一轮完整读写读 12 字节输出加写 12 字节输入约 38.4 微秒加上片选建立保持、字节间隙和主控开销按三倍余量估到 120 微秒左右。这意味着一个 1 毫秒的扫描任务SPI 占用不到 15%剩下的时间够主控做滤波、做逻辑联锁、做通讯。如果硬顶着 20M 跑示波器上看时钟上升沿已经开始塌现场温度一高就出现偶发错点这种问题的排查成本远高于省下来的那几十微秒。4. 关键模块实现SPI 驱动、电源时钟与通讯输出设计思路讲完落到能烧进板子的东西。这一章按信号链顺序走先写驱动再稳电源和时钟最后处理对外的通讯口和手轮通道。4.1 SPI 从站驱动地址位、时序与实现芯片是 SPI 从站时钟极性为空闲低电平、上升沿采样片选低有效。下面这段是主站侧的底层实现把硬件相关的几根线抽成接口换平台时只改这几个函数/* a992d_spi.c —— 从站协议芯片的 SPI 读写基础函数主站侧 */ #include stdint.h /* 硬件抽象层换成你所用主站的 GPIO 或硬件 SPI 寄存器操作 */ extern void spi_cs(uint8_t level); /* 片选低电平有效 */ extern void spi_sclk(uint8_t level); /* 时钟上升沿采样 */ extern void spi_mosi(uint8_t level); /* 主出从入 */ extern uint8_t spi_miso(void); /* 主入从出 */ extern void delay_us(uint32_t us); #define REG_Y0 0x01u /* 读 Y00x01~0x0C 对应 Y0~Y11共 96 点输出 */ #define REG_X0 0x81u /* 写 X00x81~0x8C 对应 X0~XB共 96 点输入 */ #define REG_CARD0 0x91u /* 远程 I/O 起始卡号依次为 0x91/0x92/0x93 */ #define DIR_READ 0x00u /* 地址字节最高位0 读 */ #define DIR_WRITE 0x80u /* 地址字节最高位1 写 */ /* 写一个字节先发地址最高位置 1再发数据均为高位在前 */ void a992d_write(uint8_t reg, uint8_t val) { uint8_t i; spi_cs(0); /* 拉低片选开始一帧 */ for (i 0; i 8; i) { /* 地址字节 */ spi_sclk(0); spi_mosi((reg 0x80u) ? 1 : 0); reg 1; spi_sclk(1); /* 上升沿写入从站 */ } for (i 0; i 8; i) { /* 数据字节 */ spi_sclk(0); spi_mosi((val 0x80u) ? 1 : 0); val 1; spi_sclk(1); } delay_us(1); /* 给从站留一点收尾时间 */ spi_sclk(0); spi_cs(1); /* 拉高片选结束一帧 */ } /* 读一个字节地址字节最高位为 0随后收 8 位数据 */ uint8_t a992d_read(uint8_t reg) { uint8_t i, dat 0; spi_cs(0); for (i 0; i 8; i) { /* 地址字节方向位为 0 */ spi_sclk(0); spi_mosi((reg 0x80u) ? 1 : 0); reg 1; spi_sclk(1); } for (i 0; i 8; i) { /* 读数据字节高位在前 */ spi_sclk(1); /* 上升沿后从站输出有效 */ dat 1; if (spi_miso()) dat | 0x01; spi_sclk(0); } spi_cs(1); return dat; } /* 一次刷完 96 点输入 96 点输出适合放在 1ms 周期任务里 */ void a992d_refresh(const uint8_t *x_in, uint8_t *y_out) { uint8_t i; for (i 0; i 12; i) { a992d_write(REG_X0 i, x_in[i]); /* X 侧上报输入点 */ y_out[i] a992d_read(REG_Y0 i); /* Y 侧取回输出点 */ } }几个参数需要说清楚。方向位决定这一帧是读还是写读写不能在同一帧里混所以a992d_refresh是逐字节交替发帧而不是一次发 24 字节——芯片的寄存器模型就是一地址一数据别自己发明块传输协议。每次片选拉低到拉高是一帧帧间必须拉高片选否则从站状态机不会复位。上面给的 1 微秒收尾延时是按 5MHz 时钟留的如果你把时钟降到 1MHz这个延时要跟着放大到 5 微秒量级。如果主控用的是硬件 SPI 外设把两个循环换成一次 16 位传输即可但模式必须选对CPOL 为 0、CPHA 为 08 位字长高位在前。模式选错的表现是读回来的数据整体右移一位看着像“差一点就对”特别容易误判成硬件接触不良。4.2 电源与时钟30mV 纹波这条红线芯片要两路电源I/O 侧 3.3V允许范围 2.375V 到 3.46V内核 1.2V允许范围 1.14V 到 1.26V。手册对纹波的要求是 30mV 以内这个数字不是随便写的——协议芯片内部在做位采样电源上的毛刺会直接转化成时序抖动。我一般这么落地两路都用高电源抑制比、低输出纹波的线性精密稳压器降压不用开关电源直接供稳压器输出侧按手册要求或高于手册要求加大容量滤波电容进入芯片电源脚之前串一颗磁珠再并旁路电容磁珠和电容尽量贴近管脚。地平面完整铺一层两个电源的回流路径分开走最后单点汇合。静态功耗这一栏可以作为设计自检的参考3.3V 供电下电源电流典型值约 2.8mA加载时约 2.45mA 到 2.74mA。如果实测偏差很大多半是某个 NC 脚被误接了或者使能脚状态不对。提示晶振必须用有源晶振频率 48MHz宽温、低失真、低温漂。晶振的供电脚在接入之前同样要串磁珠、加旁路电容别直接挂在 3.3V 上。4.3 通讯输出电路差分驱动、阻抗匹配与 TVS对外这一侧是把芯片的端口信号送出去能不能在车间里扛住干扰全看这几十毫米的走线。远程 I/O 那一侧输出信号是 RA、RB 一组建议选工业级 422 或 485 通讯驱动器件工作电压 3.3V对 RA、RB 做阻抗匹配和 TVS 保护TVS 的钳位电压要压在驱动器耐受范围之内选高了等于没装选低了会漏电流影响总线。I/O Link 那一侧有四对信号 JD1A_1 到 JD1A_4、JD1B_1 到 JD1B_4同样要端接加 TVS并且 A、B 两个端口的走线长度尽量做成等长避免自动扫描时识别到一半掉链子。端口混插是这类芯片的卖点JD1A 和 JD1B 随便插芯片自己扫描识别。但混插的前提是两个端口的电气特性一致如果 B 端口少了端接电阻A 端口插着正常、B 端口插上就报链路错误你会以为是芯片坏了。4.4 手轮脉冲通道与起始地址设定两路手轮通道接收的是方波信号4 到 7 脚分别对应两路通道的 A、B 信号。这里有一条硬性要求前端必须用工业级 74 系列低工作电压高速驱动器件做整形缓冲实现宽电压波形整形也可以当信号整形缓冲驱动用。省掉这一级手轮脉冲在长线上反射、过冲轻则计数错乱重则把芯片的 I/O 打坏——这不是概率问题是时间问题。起始地址分两侧设。远程 I/O 那一侧I/O 接口的起始地址通过 SPI 接口软件指定也就是往 0x91、0x92、0x93 这三个地址写卡号默认 0、1、2写进去之后系统侧才能正确对应到 X/Y 地址段串接多个单元时站点总数要控制在 8 以内。I/O Link 那一侧不靠芯片设卡号靠系统侧的 PLC 参数分配地址段手册给出的分配方式是 X 侧 16 个字节、Y 侧 12 个字节。注意X 侧分配 16 个字节、Y 侧分配 12 个字节而芯片实际可用的是 96 入 96 出也就是 12 字节加 12 字节。多出来的那段 X 地址属于系统侧保留不要当成可用点数往接线端子上排否则现场会出现“接了没反应”的诡异现象。5. 避坑与常见问题排查从电源纹波到手轮脉冲错乱这一章是整份方案里最值钱的部分。下面五条都是会让人在实验室待一整晚的那类问题每条按现象、原因、解决三段写。5.1 上电不通信Link 灯完全不亮现象板子上电后 10 脚的链路正常灯始终不亮9 脚的链路错误灯也不亮主控 SPI 读回来的全是 0x00 或 0xFF。原因最常见的三种一是 3 脚的芯片选通 IC_EN 悬空或者被拉低芯片在不选通的前提下根本不工作二是 48 脚复位处理不当只加了下拉没有 RC 延时上电瞬间一直处于复位态三是 1.2V 内核轨没有起来或者两路电源的上电顺序导致内核抢在 I/O 之前建立。解决先把使能脚按确定电平处理不要悬空复位脚加 RC 网络保证上电后有一个明确的释放沿用示波器同时看 3.3V、1.2V 和 11 脚的 48MHz 波形三样都在才继续往下查。48MHz 不起振的时候先量晶振供电脚有没有电压再量磁珠是不是虚焊——这颗磁珠用 0402 封装手工焊最容易假焊。5.2 数据偶发错位、扫描几百次丢一次点现象逐点扫描时大部分点正常隔一段时间出现一次错点位置不固定把 SPI 时钟降下来之后出错频率明显下降。原因三种可能。一是时钟顶着 20M 上限跑手册建议的 5M 是有余量考虑的速度快了以后上升沿变形从站采样点漂移二是片选建立和保持时间不足帧与帧之间没有留空隙从站状态机还没复位就开始下一帧三是方向位写错读操作发成了 0x81 而不是 0x01读回来的自然是一堆无意义数据。解决把时钟固定到 5M先跑通再谈提速两帧之间强制拉高片选并留至少 1 微秒空隙用逻辑分析仪抓 CS、CLK、MOSI 三根线对着地址表核一遍方向位。千万别用万用表量 SPI 线判断通不通这类时序问题只有逻辑分析仪看得见。5.3 手轮计数错乱、芯片发烫甚至损坏现象接手轮之后计数跳变快摇的时候丢脉冲慢摇的时候多计数严重的情况下芯片温度明显升高甚至永久损坏。原因手轮信号没有经过整形缓冲就直接进芯片长线反射造成过冲和振铃超过 I/O 的耐受范围或者整形芯片选型不对用了普通低速器件边沿被拉缓从站在采样窗口内看到的是抖动信号。解决按手册要求换成工业级 74 系列低工作电压高速驱动器件做整形和缓冲手轮信号线用双绞屏蔽线屏蔽层单端接地芯片侧加小容值滤波电容但要控制容值容值大了会把边沿吃掉。这一级器件不要省省下来的是几毛钱赔进去的是一块板加一个客户。5.4 系统侧地址对不上接上就是不认现象链路灯正常SPI 侧读写也正常但系统侧读到的输入点全是 0或者输出点位置整体偏移一段。原因远程 I/O 那一侧起始卡号没有通过 0x91 到 0x93 写进去多个单元串接时卡号重复串接的单元数超过了 8 个站点的上限I/O Link 那一侧则是系统侧 PLC 参数里分配的 X/Y 字节数跟实际点数不匹配。解决先用单个单元调试把卡号写对、链路跑通再往上串第二个串接时按物理顺序依次写卡号写完读回来核对系统侧参数按 X 侧 16 字节、Y 侧 12 字节分配但实际接线只用到 96 点。地址偏移类问题建议做一张“系统地址、字节序号、端子号”的三列对照表逐点核对一遍比现场猜快得多。5.5 高低温下通信不稳常温好好的现象常温老化一整天没问题进高低温箱跑到 -40℃ 或者 85℃ 就开始偶发链路中断温度回到常温又恢复正常。原因晶振温漂超标用的是商业级有源晶振电源在低温下稳压器启动特性变差纹波超过 30mVTVS 和端接电阻的温度系数不匹配低温下阻抗偏离设计值。解决晶振换宽温型号这是最优先的一步两路电源的高低温纹波都要实测别只看常温端接电阻选低温漂的精密电阻。验收阶段就把高低温循环排进去各烤两个小时别等量产了才发现。6. 验收与答辩怎么证明这块 I/O 扩展板真能跑起来交付前我会把验收拆成三级一级不过不往下走这样出问题时定位范围永远可控。第一级是单元级两路电源的电压和纹波、48MHz 起振、使能脚电平、复位时序全部用示波器留截图。第二级是模块级96 点输入逐点注入、96 点输出逐点读取SPI 侧用一条循环命令跑完整轮记录错点率。第三级是系统级接上数控系统侧跑链路识别、端口混插、手轮计数、连续老化 8 小时。验收项的判定标准我一般列成这张表答辩时直接投屏验收项方法判定标准电源纹波示波器交流耦合20MHz 带宽限制3.3V 与 1.2V 均小于 30mV时钟起振探头接 11 脚看波形与频率48MHz±100ppm波形无明显过冲SPI 回环逐字节写读比对跑 10000 轮错点率为 0无帧丢失I/O 逐点96 入 96 出全扫描每点保持 50ms点位一一对应无错位无粘连手轮计数手轮摇 100 格正反各一遍计数误差为 0方向正确高低温-40℃ 与 85℃ 各保温 2 小时全程链路正常无通信中断模块级的冒烟脚本可以用一台 Linux 主站跑比在单片机上来回烧录快得多import spidev, time SPEED_HZ 5_000_000 # 手册建议 5MHz别顶着 20MHz 理论上限跑 REG_Y0, REG_X0 0x01, 0x81 # 读 Y0~Y11输出写 X0~XB输入 def open_spi(): spi spidev.SpiDev() spi.open(0, 0) spi.max_speed_hz SPEED_HZ spi.mode 0 # 空闲低电平上升沿采样 spi.bits_per_word 8 return spi def read_reg(spi, reg): return spi.xfer2([reg 0x7F, 0x00])[1] # 方向位 0读 def write_reg(spi, reg, val): spi.xfer2([reg | 0x80, val 0xFF]) # 方向位 1写 def scan_inputs(spi, dwell0.05): 96 点输入逐点注入一次置一位观察系统侧反应 for byte in range(12): for bit in range(8): write_reg(spi, REG_X0 byte, 1 bit) time.sleep(dwell) def dump_outputs(spi): 一次性读回 96 点输出状态返回 12 字节 return [read_reg(spi, REG_Y0 i) for i in range(12)] if __name__ __main__: bus open_spi() scan_inputs(bus) print([hex(b) for b in dump_outputs(bus)])跑之前把spi.mode和max_speed_hz核对一遍这两个参数是这类脚本里最容易抄错的地方dwell是每点保持时间调试时可以调到 0.5 秒方便肉眼观察指示灯做长时间老化时压到 0.01 秒提高循环次数。答辩环节的讲法我的建议是四页第一页讲边界把点数、适配系统、环境温度这三组数字放上去说明为什么这么划第二页放三层架构图和地址映射表讲清楚每层各管什么第三页现场演示96 点逐点扫描加手轮计数加链路指示灯实机跑比任何 PPT 都有说服力第四页专门讲你踩过的坑比如方向位搞反、手轮没加整形缓冲讲清楚怎么定位的——评委问的往往就是这些细节你先讲出来问询就变成了讨论。从那以后我每次投板前都强制走一遍电源纹波和 48MHz 起振的实测哪怕原理图一个字没改也照测不误。硬件这行的后悔药从来买不到能做的只有把验证前置。希望这套结构帮到你少走几个通宵。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →