ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

基于51单片机的IC卡读写控制器设计与时序可靠性实践

基于51单片机的IC卡读写控制器设计与时序可靠性实践 做 IC 卡读写控制器这个选题放在今天的硬件圈里听起来有点复古但它一直在真实产线上活着。现场一批老终端用了十几年主板烧了买不到备件原厂早就停止维护能做的只有照原逻辑重画一块板、重写一份固件然后塞进原来的机柜里接口、时序、卡型一样不能变。这类活儿的技术难度不在算法而在于IC 卡读写控制器要在 51 单片机这种资源紧到抠门的平台上把供电、时序、协议、掉电保护、插拔耐受全部做稳一块板子装上去得扛住三年不断电、卡座插拔十万次不虚接。这篇就按我实际交付过的思路从前期的架构选型、硬件原理图与 PCB 的关键网络、软件分层怎么切、时序参数怎么算一直讲到联调时示波器该看哪几根线、量产前必须补的校验和与老化测试。适合手上正接这类改造项目、或者刚接触 IC 卡底层通信的同行参考读完之后你至少能画出一版能过 EMC 预测试的板子同时写出一份半年后自己还看得懂的固件。1. IC卡读写控制器的整体设计与选型拆解1.1 为什么这个场景下还在用51内核先把为什么不用 ARM这个问题正面回答掉因为每次评审都会被问。答案是三件事BOM 成本、存量生态、供货确定性。一块控制器的核心成本里MCU 只占很小一部分但如果你换成 32 位平台随之而来的稳压要求、PCB 层数、固件工具链、烧录工装、产线检测治具全部要重做一次改造摊到几百台设备上单价立刻失控。51 内核的 8 位机在 5V 供电下 IO 直接兼容绝大多数 IC 卡接口芯片和逻辑器件省掉一堆电平转换这在老机柜里是巨大优势。第二个理由是代码规模和实时性需求匹配。一个 IC 卡读写控制器要做的事情其实很少上电自检、轮询卡座、识别卡型、读写指定扇区或地址、串口上报、异常记录。这些逻辑加起来也就几 KB 代码中断响应要求是毫秒级不是微秒级。用 51 内核跑起来主循环加一个定时器节拍足够干净。反而是上 32 位平台之后很多人会不自觉地引入 RTOS、文件系统、动态内存最后把一件简单的事做复杂稳定性还不如原来。第三个理由最实在旧固件的时序特征是和旧硬件绑定的。上位机软件里可能硬编码了命令响应时间、超时重试次数、上电延时你换了主频和控制周期上位机会偶发判超时。沿用同主频的 51 内核平台比如经典的 89C52 系列配 11.0592MHz 晶振串口波特率误差、定时器节拍、延时循环都能对上原来的量级改造风险最低。我一般会明确告诉对方这次改造的目标是无缝替换不是技术升级两条路线不要混着走。提示如果项目是从零开始的新设计没有存量上位机约束那选择面可以放宽。但只要涉及替换旧板主频、晶振、串口参数这三项尽量与旧方案保持一致能省掉大量的联调扯皮。1.2 控制器要解决的四类核心问题把需求拆开看一个 IC 卡读写控制器本质上要同时解决四类问题任何一类没处理好现场都会表现为偶发读不出卡。类别具体内容典型失效表现供电与保护卡座供电、限流、热插拔浪涌、反接保护插卡瞬间复位、芯片发热时序与协议时钟、数据建立保持时间、应答超时偶发 NAK、读到全 FF 或全 00数据可靠性校验、写周期等待、掉电保护写一半断电后数据块损坏人机与上报指示灯、蜂鸣、串口协议、日志现场无法判断故障归因这张表是我做方案评审时必摆的一页。很多人一上来就盯着协议层抠时序结果板子插拔几十次之后接触电阻变化波形已经歪了还在怀疑代码。供电和接插件永远应该排在第一优先级因为它们决定了后面所有软件努力能不能生效。1.3 软硬件一体的分层模型我把整个控制器切成四层这个分层从画原理图那一天就开始生效而不是等写代码时才想起来。最底层是硬件抽象层只做一件事把引脚操作封装成函数比如bus_start()、bus_write_byte()、card_power_on()、card_power_off()。这一层不允许出现任何协议语义只允许出现电平。往上是器件驱动层负责具体卡型的时序比如存储卡的页写、逻辑加密卡的密码校验、非接触卡的寻卡与防冲突。这一层只知道怎么和这颗芯片说话不知道业务要存什么。再往上是业务逻辑层负责卡型识别、权限判断、余额或工号的读出写入、异常计数。这一层是纯逻辑理论上可以脱离硬件在 PC 上跑单元测试。最顶上是通信与运维层负责串口或总线上报、命令解析、日志落盘。这样切的好处很直接换卡座供应商只改第一层换卡型只改第二层上位机改协议只改第四层。我见过太多把四个层揉成一个main.c的项目改一个引脚定义要翻八百行最后没人敢动只能推倒重写。2. 硬件设计从电源到卡座的每一个坑2.1 电源架构与去耦的实操取舍IC 卡控制器一般是 5V 系统卡座供电也吃 5V但卡座是热插拔部件插拔瞬间的浪涌和静电是最大的敌人。我的常规做法是主板输入 5V 先过一颗自恢复保险丝再进 LC 滤波然后分两路——一路直供 MCU一路经限流电阻供卡座卡座这路再并一颗 TVS 管到地。限流电阻的取值要算不能拍脑袋。假设卡型工作电流最大 10mA卡座接触瞬间可能短路你希望短路电流不超过 100mA那么 R 5V/100mA 50Ω。但电阻串在供电回路里会产生压降10mA 时压降 0.5V卡端只剩 4.5V多数卡还能工作但已经在边缘。所以更稳的做法是用 22Ω 到 33Ω 之间配合自恢复保险丝让保险丝承担长时间短路的保护电阻只负责削掉瞬态尖峰。去耦这块我固定放三颗MCU 电源脚旁边 0.1uF 瓷片卡座电源脚旁边 0.1uF 加 10uF 钽电容另外整板入口放一颗 100uF 电解。这里有个常被忽略的细节——卡座的 10uF 电容一定要靠近卡座焊盘不要放在板子另一头。我遇到过一次插卡复位查了两天最后发现是 10uF 电容离卡座 4 厘米插卡瞬间的电流突变在走线电感上产生的压降直接把 MCU 拉进欠压复位。挪到卡座旁边 5 毫米问题消失。注意TVS 管的选型要看结电容高速数据线上串的 TVS 结电容过大会把上升沿拖慢导致时序不满足。电源线用大结电容的没关系数据线一定要选低结电容型号或者干脆只在电源侧做保护。2.2 卡座选型与接触可靠性设计卡座是这类项目里故障率最高的机械件没有之一。选型时我会重点关注四项触点镀层、插拔寿命标称值、防插反结构、检测开关。触点镀层优先选镀金厚度至少要 0.3 微米以上镀锡的便宜但氧化快南方潮湿环境下半年就开始出问题。插拔寿命标称值一般写 10 万次实际现场能撑到 5 万次就算不错所以软件上必须做读到异常就重试的兜底硬件上则要在结构上给它留出更换空间——别把卡座焊死在板子正中间四周留出镊子能伸进去的间隙维修时能单独换。防插反这件事光靠卡座自带的塑料限位不够。我的做法是在 PCB 上把卡座的插入方向做成非对称布局卡座一侧紧贴板边另一侧留出元件区用户反插时物理上插不到底。这个细节在打样阶段用 3D 打印一个假卡套试一下就能验证成本几乎为零但能省掉大量现场投诉。带检测开关的卡座贵一点点但非常值。检测开关接一个 IO 并在外部加 10k 上拉插卡时产生电平跳变MCU 用中断或轮询捕捉。这样控制器平时可以不给卡座供电插卡才上电既省电又减少触点氧化。没有检测开关的方案只能靠一直上电一直轮询触点长期带电氧化速度明显更快。2.3 电平匹配、上拉与热插拔保护51 内核单片机的 IO 是准双向口输出高电平时实际上是靠内部弱上拉灌电流能力很弱。这意味着凡是需要输出高电平驱动的地方都不能直接接。驱动指示灯、蜂鸣器、卡座电源开关一律用三极管或者专用的驱动芯片IO 只负责给控制信号。I2C 这类开漏总线上拉电阻必须外部加不能指望内部弱上拉。上拉电阻的取值要算我在第 4 章会给出完整计算过程这里先说结论5V 系统、总线电容 200pF 以内、速率 100kHz 的条件下4.7k 是最稳妥的通用值2.2k 更快但功耗高10k 在长走线时上升沿会明显变缓。热插拔保护除了前面说的 TVS 和限流还有一个细节所有接到卡座的信号线串一颗 100Ω 到 220Ω 的电阻。这颗电阻的作用不是限流而是隔离防止卡座上积累的静电通过信号线打进 MCU 内部保护二极管。串了这颗电阻之后上升沿会变缓所以要重新核算时序余量通常 100kHz 的 I2C 完全没问题400kHz 就要谨慎。2.4 时钟、复位与看门狗的配置取舍晶振选 11.0592MHz 还是 12MHz这是老话题但仍然值得说清楚。11.0592MHz 的优点是串口波特率可以做到零误差——11059200 除以 12 得 921600再除以 16 和 6 正好是 9600。12MHz 在 9600 波特率下误差约 8.5%短帧还能忍长帧连续通信就容易出问题。所以只要涉及串口我一律选 11.0592MHz。代价是定时器节拍不是整数。12MHz 时机器周期正好 1 微秒算延时非常舒服11.0592MHz 时机器周期是 1.085 微秒做 1 毫秒定时器要装 922 而不是 1000。这个换算必须提前算好写进注释否则后人接手会以为初值算错了。复位电路我用经典的阻容复位加一颗专用复位芯片的组合。纯阻容复位在电源缓慢上升时可能不可靠加一颗带延时的复位监控芯片成本几毛钱能保证上电时 MCU 一定在稳定电压之后才开始跑。看门狗必须开而且要养成主循环里定时喂狗、任何可能阻塞的地方都要评估喂狗时机的习惯。我踩过一次坑某个等待卡应答的循环里用了长延时结果看门狗把板子复位了现场表现为插卡就重启查了很久才发现是喂狗点设计不合理。2.5 非接触方案的线圈与铺地注意事项如果卡型是非接触的硬件部分还要多考虑一层读卡芯片的天线匹配和铺地。常见做法是天线和芯片之间串匹配电容和阻尼电阻具体参数必须按芯片手册给的参考值来不要自己算因为天线电感跟 PCB 走线形状强相关算出来往往对不上。铺地上有一条硬规矩天线投影区域内层和底层不允许铺铜也不允许走任何信号线。铺了铜相当于给天线并联了一个短路线圈读卡距离会断崖式下降。我见过一块板子读卡距离只有 1 厘米翻来覆去改代码最后发现是底层铺了一整片地。把天线区域的地挖空距离立刻回到 5 厘米。另外读卡芯片和 MCU 之间的 SPI 线要尽量短超过 10 厘米就要考虑串电阻做阻抗匹配。51 内核跑 SPI 速率不高一般 1MHz 以内这个速率下短走线问题不大但走线长了之后时钟和数据之间的偏移会引起偶发读错寄存器表现是读出来的版本号偶尔不对。3. 软件分层从能跑到能维护3.1 四个层次的职责边界与目录结构软件分层最怕的是名义上分了实际上还在互相调。我的做法是用目录结构强制约束每个目录只允许向上依赖不允许横向乱调。/project /bsp 硬件抽象引脚、延时、电源控制 /driver 器件驱动各类卡的时序实现 /app 业务逻辑卡型识别、数据读写、权限 /comm 通信协议串口帧解析、上报 /cfg 配置与常量时序参数、地址映射 main.c 只做初始化和调度/bsp里只有寄存器和引脚操作绝不允许出现if (card_type xxx)这种判断。/driver里可以有卡型相关的时序差异但不能出现余额不足这种业务词汇。/app里全部是纯逻辑理论上可以编译到 PC 上跑测试。这套约束听起来很教条实际收益很大。有一次客户临时要求把接触式卡换成另一种逻辑加密卡我只改了/driver下一个文件、/cfg里几个参数/app一行没动半天就交付了。3.2 时间基准用一个节拍器替掉所有长延时新手写 51 程序最容易犯的错是到处delay_ms(5)。这在 demo 里没问题在真实控制器里是灾难按键响应变慢、串口丢字节、看门狗被饿死。正确做法是建立一个 1 毫秒的定时器节拍所有跟时间相关的逻辑都挂在节拍上。定时器初值的算法要写清楚/* 11.0592MHz 晶振定时器0 方式11ms 节拍 机器周期 12 / 11.0592MHz ≈ 1.085us 1ms 需要计数 1000 / 1.085 ≈ 922 初值 65536 - 922 64614 0xFC66 */ TH0 0xFC; TL0 0x66;节拍中断里只做一件事给若干个软件计数器加一。主循环里判断计数器到没到到了就执行任务没到就去干别的。这样整个系统没有阻塞点插卡响应、串口收发、指示灯闪烁全部并行推进。对于确实需要等待的场合比如等卡内部写周期完成不要用死等而是设一个超时计数器每毫秒减一减到零就判失败。这个模式统一之后代码里几乎看不到while(!flag);这种死循环稳定性立刻上一个台阶。3.3 命令-响应模型与超时重试策略卡和 MCU 之间的交互本质上是发命令、等响应。这中间有三个参数必须明确命令发出后的等待上限、单次响应失败后的重试次数、整体失败的判定条件。等待上限我是这么定的查器件手册给出的最大响应时间乘以 2 作为软件超时。比如某类卡写的最大内部写周期是 5 毫秒那软件超时设 10 毫秒。乘 2 是留余量因为实际器件的响应时间会随温度、电压、批次波动。重试次数不要多3 次足够。重试太多会掩盖真实故障让偶发问题变成看起来能用。3 次全败就上报错误码让上位机或者运维去处理。这里有个反直觉的经验重试次数多的系统现场故障率反而高因为它把早期征兆全部吞掉了等到彻底坏的时候已经积累了一堆劣化数据。重试之间要有间隔一般 2 到 5 毫秒让总线电容放电、让卡内部状态机复位。间隔太短等于连续发同样的命令卡还没准备好必然继续失败。3.4 掉电保护与关键数据的写入策略这类控制器经常要存一些关键数据卡的黑名单、设备参数、累计交易笔数。一旦写到一半断电数据块就可能损坏。51 内核没有硬件 ECC必须靠软件策略。我的策略是双备份 序号 校验和。同一份数据在存储区里占两个槽位每个槽位包含数据本体、一个递增的写入序号、一个 CRC8 校验和。启动时读两个槽位校验通过的才算有效两个都有效就取序号大的那个一个有效就用那个都无效就加载默认值并置故障标志。写入顺序也要讲究先写备用槽写完校验通过再把主槽标记为旧。任何一个时刻断电至少有一个槽是完整的。这套机制占用的空间不多但能救命。我之前有个项目现场经常直接拉闸断电用单槽方案时一个月坏了三次数据换成双槽之后半年零故障。另外累加类数据比如总计数不要每次都写存储。改成在 RAM 里累加每满 10 次或者每 10 秒落盘一次能把写入次数降低一个数量级。存储器的擦写寿命是有限的典型存储芯片标称 100 万次但那是理想条件实际算上温度和电压偏差留 10 倍余量比较稳妥。4. 关键时序与协议实现细节4.1 I2C总线上拉电阻的完整计算过程很多资料直接给用 4.7k但不给理由导致换了个板子就不灵。这里把计算过程写全。上拉电阻有上限和下限两个约束。上限由上升沿时间决定。I2C 标准模式规定上升沿最长时间 1000 纳秒上升时间近似为tr ≈ 0.8473 × R × Cb其中 Cb 是总线总电容包括走线电容、器件引脚电容、卡座电容。一块小板子上Cb 一般在 100 到 300pF取 200pF 计算R ≤ tr / (0.8473 × Cb) ≤ 1000ns / (0.8473 × 200pF) ≈ 5900 Ω所以上拉不能大于约 5.9k4.7k 刚好在这个范围内。下限由灌电流能力决定。I2C 规范要求低电平时器件能拉低到 0.4V 以下标准模式灌电流按 3mA 算R ≥ (Vcc - Vol) / Iol ≥ (5 - 0.4) / 0.003 ≈ 1533 Ω所以 1.5k 到 5.9k 都合规取中间值 4.7k 兼顾功耗和速度。如果要跑 400kHz 快速模式上升沿要求收紧到 300 纳秒上限变成约 1.8k这时候就得用 2.2k 甚至 1.5k同时要严格控制总线电容。注意很多人只加一组上拉结果总线上挂了多个器件后等效上拉变小。器件内部如果自带弱上拉外部再并 4.7k实际等效可能只有 2k 出头功耗上去了但没人注意。做低功耗产品时要逐个确认。4.2 存储类卡的页写与写周期等待存储卡比如常见的串行 EEPROM 类有两个关键参数必须搞准页大小和内部写周期。页大小决定了单次连续写不能跨页。以页大小 8 字节的型号为例如果你从地址 0x06 开始连写 4 个字节写到 0x08 时会回卷到页首 0x00把原本的数据覆盖掉。这个坑极其隐蔽因为读回来的前两个字节是对的你以为写成功了。稳妥写法是先算页内剩余空间/* 从 addr 开始写 len 字节自动处理页边界 */ while (len 0) { uint8_t page_left PAGE_SIZE - (addr % PAGE_SIZE); uint8_t chunk (len page_left) ? len : page_left; bus_start(); bus_write_byte(DEV_ADDR_W); bus_write_byte(addr 8); bus_write_byte(addr 0xFF); for (i 0; i chunk; i) { bus_write_byte(buf[i]); } bus_stop(); wait_write_done(10); /* 超时 10ms手册典型 5ms */ addr chunk; buf chunk; len - chunk; }写周期等待有两种做法固定延时和应答轮询。固定延时简单但要按最坏情况取值浪费时间应答轮询更快但实现稍复杂。控制器的场景下一次操作省几毫秒没有意义我一般直接用固定延时代码简单不容易出错只在批量写的场合才用轮询。4.3 逻辑加密卡的密码校验与错误计数处理逻辑加密卡这类器件有一个非常危险的特性密码连续错误若干次后会永久锁死锁死之后卡就废了不可恢复。这个特性必须写进软件设计的第一条注释。防护措施有三层。第一层密码在本地先做格式校验长度、字符集不对直接拒绝不发到卡上。第二层每次校验前先读卡内的剩余尝试次数多数型号支持这个读取剩余次数低于 2 就拒绝操作并上报需管理员介入。第三层错误次数在本地做一份影子记录存到掉电保存区这样即使换一台设备也能知道这张卡已经错过几次。现场最常见的误操作是运维人员反复试密码。所以人机界面上必须有明确提示不能只亮个红灯。我的做法是错误一次就蜂鸣长响、指示灯快闪两次之后直接锁定界面要求走管理流程。4.4 非接触卡的寻卡流程与防冲突实现非接触方案里MCU 和读卡芯片之间是对接读卡芯片和卡之间是射频。MCU 侧的关键是寄存器读写时序和命令流控制。寻卡的典型流程是软复位、配置定时器和调制参数、发送寻卡命令、判断是否有卡、有多张卡则进入防冲突读序列号、选卡、认证、读写。防冲突这一步经常被简化掉因为现场通常一次只放一张卡。但只要有两张卡同时进入场区没有防冲突逻辑的固件就会读到混乱的序列号表现为读到一张不存在的卡。稳妥做法是保留完整的防冲突流程即使最终只取第一张卡。还有一个细节寻卡命令的间隔。如果主循环里每圈都发一次寻卡命令读卡芯片会一直处于发射状态功耗高、发热大长期运行还可能影响芯片寿命。正确做法是每 100 到 200 毫秒发一次中间留出空闲。5. 联调实录示波器上该看什么5.1 三个必须上示波器的测量点软件写完烧进去能跑不代表跑得稳。我联调时必看三个点每次都能提前发现隐患。第一个点是卡座供电脚的上电波形。看两件事上升沿有没有台阶有台阶说明限流电阻和电容形成了 RC 拐点可能让卡上电时序不满足、插卡瞬间有没有跌落超过 0.3V跌太多会导致卡内部复位。这个波形只有在实际插拔时才能抓到用单次触发模式触发条件设成下降沿。第二个点是时钟线的上升沿。把时间基准放到 200 纳秒一格看上升时间。如果超过 1 微秒说明上拉偏大或者总线电容偏大长线场合必然出问题。第三个点是应答等待时间。触发设在命令发出的最后一个时钟下降沿看响应回来的延迟。这个延迟如果在临界值附近晃说明软件超时设置得太紧换个批次或者温度变了就会失败。5.2 通信失败的排查路径表现场出问题的时候最忌讳上来就改代码。我一般按这张表往下走八成的问题在前三步就能定位。现象首要怀疑快速验证方法完全无响应供电、卡座接触、复位万用表量卡座电压插拔看是否跳变有时能读有时不能卡座氧化、限流电阻偏大换一张新卡对比看是否与卡有关读到全 FF数据线未接、上拉缺失示波器看数据线是否有拉低动作读到全 00数据线被拉死、器件未上电断电测数据线对地阻抗写入后读回错乱页边界跨界、写周期等待不足单字节写测试逐字节验证长线通信偶发错上升沿过缓、串阻过大缩短走线或减小串阻后复测插卡就复位电源跌落、地弹示波器看 MCU 电源脚瞬态这张表我一般打印出来贴在工位上新来的同事按着走能省掉大量瞎猜的时间。要强调的是先物理后逻辑确认供电、接触、地线没问题再去怀疑协议和代码。我见过太多人抱着逻辑分析仪抠时序最后发现是卡座弹片变形。5.3 一次典型的偶发读卡失败定位过程讲一个实际案例过程比结论有价值。某批控制器在现场出现偶发读卡失败比例大概 5%重启就好过几天又犯。第一步先确认是不是卡的问题。拿十张同型号卡在新板子上跑全部正常说明卡没问题。第二步把故障板拿回来在实验室里连续插拔 500 次复现了两次失败。第三步示波器挂在数据线上做长时间录制抓到失败瞬间的波形——数据线的低电平只到 1.2V没到 0.4V 以下。低电平下不去无非三个原因上拉太强、灌电流能力不足、地线阻抗大。量了一下上拉是 4.7k正常。查器件手册低电平灌电流能力 3mA符合。最后量地线发现卡座的地是通过一段细走线连到主地的这段走线电阻有 0.4Ω加上插拔后接触电阻上升到 2Ω 左右形成分压把低电平抬起来了。处理方式很简单卡座地改成大面积铺铜直连主地另外在卡座地脚旁边加一个过孔到地平面。改完之后连续插拔 2000 次零失败。这个案例的教训是低速总线上的问题八成不是时序算错而是回流路径不通。6. 常见问题速查与工程避坑清单6.1 硬件类高频问题问题一插卡时指示灯闪一下就灭。大概率是电源跌落导致 MCU 复位。检查卡座电容位置、限流电阻是否过大、地线是否够宽。可以先临时把限流电阻短接验证如果现象消失就是供电能力问题。问题二同一张卡在 A 板能用 B 板不能用。先对比两块板的上拉电阻和串阻再对比卡座型号。不同批次卡座的弹片压力和镀层不一样接触电阻能差好几倍。问题三板子放一段时间就坏。潮湿环境下的电化学迁移。检查是否有长期带电的密集走线、是否有未做阻焊开窗的裸铜。三防漆能解决大部分问题但要避开卡座触点区域。问题四读卡距离忽远忽近。非接触方案专属。检查天线附近有没有金属件、电池、螺丝。人体靠近也会影响测试时要模拟实际安装状态。6.2 软件类高频问题问题一串口偶尔收到乱码。先算波特率误差。11.0592MHz 配 9600 是零误差如果用的是 12MHz误差 8.5%连续收长帧必错。另外检查晶振负载电容是否匹配负载电容不对会导致实际频率偏移。问题二写入成功但读回是旧数据。缓存没刷新。很多驱动里读操作会走缓存写完必须主动清缓存或者延时后重读。我一般写完立刻读回校验校验不过就重写一次。问题三长时间运行后死机。看门狗配置问题或者栈溢出。51 内核的栈空间很小中断嵌套加上局部数组很容易溢出。检查原则中断服务函数里不放数组、不调用多层函数。问题四换一批芯片就不工作。时序余量不足。不同批次的器件响应速度有差异如果你的超时是卡着手册最小值设的换批次必然出问题。所有时序参数至少留 2 倍余量。6.3 量产前必须补的三件事第一件每块板做一次全流程自检。上电后自动跑读卡座空载检测、写一个测试字节到保留区、读回校验、清测试标志。这个自检可以在产线治具上触发也可以在每次上电时跑成本很低但能拦住大部分焊接不良。第二件固件里加版本号和构建时间。通过一条专用命令读出来。现场排查时第一句问的就是这块板子跑的哪个版本没有版本号根本没法定位。第三件做高低温循环和反复插拔老化。抽 5% 的板子在 0 度和 60 度之间循环 10 次每次循环后跑一遍自检插拔测试做 5000 次。这一步能提前暴露九成的接触和温漂问题。我吃过一次亏一批板子在常温下全部合格到了北方冬天现场低温下晶振起振慢上电复位失败几百台返修。从那之后老化测试变成了必做项。6.4 关于代码可维护性的一点私货最后说点不那么技术但很重要的。这类改造项目的生命周期往往比预期长交付三年后可能还有人来找你改一个功能。所以代码里一定要留够信息函数命名要能自解释card_power_on()比pwr(1)强一百倍。所有魔数时序参数、地址、密码位置必须定义成宏并写明来源手册第几页、实测值。每个驱动文件头部写清楚适用的器件型号范围和已知限制。关键分支加注释说明为什么这么写而不是写了什么。我接手过一个前人留下的项目里面有一行delay_us(37);没有任何注释。查了三天最后通过对比手册才知道那是某个器件的等待时间而且 37 这个值是因为当时用的晶振是 12MHz 算出来的后来晶振换成了 11.0592MHz这个延时其实已经不准了只是恰好还在容差范围内。这种坑全靠注释才能避免重演。我个人在这些项目里最深的体会是IC 卡读写控制器这类东西技术难度从来不是门槛把每一个偶发当成必然会发生去设计才是门槛。现场插拔十万次5% 的失效概率就是五千次投诉温度跨 60 度任何卡着临界值的参数都会翻车。所以每次做方案我都会问自己一句这个余量如果是最差批次、最差温度、最脏的卡座还够不够。答案不够就再加一倍。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表