做IPC方案这几年,SigmaStar的板子我经手过不少。从开发调试到量产拉通,最容易被低估的一环就是SPI NAND Flash空片烧录。很多人觉得烧录嘛,把镜像写进去就完了,实际上这里面涉及的工具选型、参数配置、颗粒兼容性、产线良率,任何一个环节踩坑都可能让批量生产翻车。这篇文章就把我在SSC335系列上做SPI NAND空片烧录的整套流程和经验完整梳理一遍,从工具准备讲到避坑排查,适合正在做SSC335方案开发转量产的朋友,也适合刚接触SPI NAND离线烧录的嵌入式工程师。
1. 认识SPI NAND和空片烧录这个事
1.1 SSC335为什么偏爱SPI NAND
SSC335这颗主控在入门级IPC市场的定位很明确:成本敏感、功能齐全、功耗控制好。这类产品的主控方案几乎都会面临一个选择题:系统固件装在哪种存储介质上?常见答案无非三种:SPI NOR Flash、SPI NAND Flash、eMMC。
eMMC性能最好、管理最省心,但成本摆在那里,一颗常规容量的eMMC芯片价格就能吃掉不少整机BOM预算,再加上eMMC芯片封装规格更高、贴片要求也相对苛刻,入门级产品基本不会选它。
SPI NOR Flash呢,优点是支持XIP直接执行、读取简单、启动快,但容量天花板太低。市面上常见的SPI NOR一般是8Mbit到128Mbit,也就是1MB到16MB。SSC335的固件动辄十几MB起步,如果用NOR,要么牺牲功能裁剪镜像,要么选超大容量NOR,一颗16MB的NOR价格比同容量的NAND贵出好几倍,完全不划算。
SPI NAND就正好卡在中间:容量从1Gbit到4Gbit甚至8Gbit,价格比NOR低一大截,读写速度也够用。虽然NAND有坏块管理、ECC校验这些额外负担,但这些问题在U-Boot和文件系统层面早就解决好了。SSC335自带的SDK对SPI NAND的支持非常成熟,U-Boot里直接就有现成的NAND驱动,文件系统用UBIFS或者SquashFS都行。
从实际项目来看,SSC335方案里SPI NAND已经成为绝对主流,1Gbit(128MB)的颗粒是最常见的选择,既能装下完整固件,还能给录像存储留一点缓存空间。
1.2 空片烧录和在线升级的分工
搞清楚“空片烧录”这个概念,得先明白它和“在线升级/烧录”的本质区别。
在线烧录指的是主控已经焊接在电路板上,通过SD卡、USB、UART或者网络把固件写入Flash。这种方式适合开发调试、小批量试产、以及售后返修。它的前提是板子上已经有了一个能跑起来的最基本环境,比如U-Boot能启动,或者芯片ROM里有一段能引导USB/SD的代码。
空片烧录则是Flash里什么都没写,或者芯片还在料带/托盘里没贴到板上时,用烧录器直接对Flash芯片操作,把固件镜像写入。这个过程发生在SMT贴片之前,或者在贴片完成后用烧录治具夹住Flash引脚操作。本质上是“先写后贴”或者“离线操作”。
为什么要做空片烧录?答案就两个字:效率和成本。产线上如果每块板子都用SD卡在线升级,一是要人工插卡、拔卡,效率极低;二是SD卡座、卡本身都会有成本;三是升级速度受限于文件系统读写和主控处理,整体节拍根本跟不上量产需求。离线烧录器的写入速度通常比在线升级快,而且可以多通道并行烧录,一台机器同时烧好几颗芯片,节拍可控、操作简单,产线工人培训成本也低。
另外一个容易被忽略的点:如果芯片贴到板上才发现固件版本写错了,返工成本极高。空片烧录在贴片前就把固件版本锁死,源头上杜绝了错料问题。
2. 动手前的工具和原料准备
2.1 烧录器和烧录座怎么选
空片烧录的核心设备是离线烧录器。市面上选择不少,从进口的DediProg到国产的中庆、周立功,还有一堆主打性价比的国产新品牌。选烧录器我总结出三个核心关注点。
第一,算法库覆盖度。SPI NAND颗粒型号五花八门,Winbond的W25N01GV、GigaDevice的GD5F1GQ、Micron的MT29F系列、国产的DS35Q1GA、XM25QH系列等等。烧录器的算法库必须能识别你打算用的颗粒。很多烧录器软件都在持续更新算法库,采购之前最好先拿实际颗粒样品去测一下,确认能自动识别ID、能正确读写。
第二,通道数和操作效率。小批量试产用单通道的烧录器就够了,但量产产线强烈建议选4通道、8通道甚至更高通道数的设备。通道数决定了单次烧录数量,直接决定产能天花板。此外还要看烧录速度,同样是写入1Gbit的NAND,不同烧录器的实际时间可能差出好几倍。算法优化的好的烧录器,全片写入加校验可以控制在1分钟以内,慢的可能要3分钟以上。
第三,上位机软件的易用程度。量产场景里操作烧录器的往往不是写代码的工程师,而是产线工人。软件如果配置复杂、按钮逻辑混乱,工人极易出错。选择那种“配置好模板后一键烧录”的设备,能极大降低产线操作出错的概率。
烧录座同样重要。SPI NAND常见的封装是WSON8和SOP8,其中WSON8在IPC方案中出现频率最高。烧录座是耗材,针脚会磨损,弹簧会老化。买烧录座的时候注意一下适配颗粒封装尺寸——WSON8看似统一,实际上不同厂商颗粒的尺寸会有细微差异,焊盘位置略有不同,买之前一定拿实物颗粒去比划一下。
2.2 镜像文件准备和版本确认
空片烧录前必须确认手里拿到的镜像文件是完整且正确的。这里的坑我在项目中见的太多了。
SigmaStar SSC335平台的固件镜像一般是从SDK编译出来的,整套固件包含U-Boot、Kernel、RootFS以及环境变量区等几个部分。市面上常见的做法有两种:一种是直接把整个Flash区域的数据打包成一个整片镜像(full image),烧录器从0x000000地址开始整片写入,这种最简单;另一种是分区镜像,每个分区单独一个文件,需要按分区表里的偏移地址分别烧录。
在项目开发阶段,建议让BSP工程师打包出第一种整片镜像。离线烧录的时候,只需要在烧录器软件里加载一个文件,填入起始地址0x000000就行,简单直接,不容易错。如果用分区镜像,需要在软件里逐个加载、填偏移地址,任何一个分区的偏移填错了,板子都起不来,而且排查起来非常痛苦。
镜像文件准备还有一个容易被忽略的问题:版本管理。我实际遇到过好几个项目,研发辛辛苦苦改好一个bug,编译出新的固件,结果产线那边还在烧录三天前的旧版本。产品到了终端客户手里出问题,一查发现是最早那版固件的已知bug。所以建议烧录前在镜像文件名里加上版本号和编译日期,产线每次烧录必须核对镜像版本。有条件的话,在烧录工位贴一张当前版本号的醒目提示,工人换料的时候自然就会核查。
2.3 认识你手里的Flash颗粒
拿到一批Flash颗粒,不能直接就扔到烧录器里开烧。你得先搞清楚手里的是哪家型号、什么规格参数。
SPI NAND有几个关键参数:容量、页大小、块大小、是否内置ECC、工作电压。以最常见的Winbond W25N01GV为例,容量是1Gbit,页大小2048字节加64字节备用区,块大小是64页也就是128K字节,内置4位ECC校验,工作电压3.3V。GigaDevice的GD5F1GQ也是1Gbit,页结构和块结构类似,但具体命令集和寄存器细节跟Winbond不完全一样。
这些参数大部分会被烧录器自动识别。你把颗粒装进烧录座,软件会自动发出读ID的命令(9Fh),返回厂商ID和设备ID,然后自动匹配算法库里的型号。如果匹配不上,就说明这台烧录器的算法库里没有这颗料,需要手动选择近似的型号,或者联系烧录器厂商更新算法库。
我还想特别提醒一下电压和ID的问题。SPI NAND有3.3V和1.8V两种工作电压的版本,封装长得一模一样,光靠外观根本分不出来。如果烧录座接的是3.3V供电,你塞进去一颗1.8V的颗粒,轻则烧录失败,重则可能损坏芯片。所以上线之前先查清楚颗粒规格书,确认电压域。还有部分厂商的同一型号会有不同等级的颗粒,比如工业级和商业级,用的是同样的ID,烧录器没法区分,但烧录参数是通用的,不影响写入。
3. 完整烧录实操:从参数设置到上电验证
3.1 第一步:把烧录器参数调对
烧录器参数配置是整个流程中最关键的环节。参数配好了,后面一路顺畅;参数配错了,烧录器报错或者烧出来的板子不能启动是家常便饭。
我用DediProg的软件作为例子来说,其他烧录器的逻辑也大同小异。先把烧录器用USB线连接到电脑,打开上位机软件。把装好颗粒的烧录座插到烧录器的ZIF插座上,或者把烧录座通过排线连到烧录器主机上。
打开软件后第一步是设置芯片型号。一般会自动检测,如果没有自动检测,就手动选择你手里颗粒的具体型号,比如W25N01GV(注意区分后缀是S或Z或A,不同后缀的规格有差异)。如果你手里的颗粒在算法库里找不到完全一样的型号,可以找同厂商同规格的近似型号,但强烈不建议跨厂商替代,因为命令集差异可能导致写入结果不稳定。
接下来需要确认的参数有这么几项:SPI时钟频率、SPI模式、烧录地址范围、操作选项(擦除、写入、校验是否全部勾选)、坏块处理策略。
SPI时钟频率不是越高越好。烧录座夹具的接触阻抗、杜邦线的长度,都会影响高频信号的质量。我在调试产线的时候遇到过,把SPI时钟从100MHz调到50MHz之后烧录良率立刻提升了。如果烧录器支持调节,建议用中等频率,稳定第一。
SPI模式一般来说NAND颗粒都支持Mode 0和Mode 3,烧录器软件会自动适配,不用手动干预。但有的老式烧录器需要手动选,选错的话读ID都不正常。
操作选项里面,擦除、写入、校验这三个一定要全部勾选。擦除是把Flash里面的内容全部清成0xFF,写入是把镜像数据写进去,校验是把写入的数据读出来和原始镜像比对。校验环节不能省,等到产品到了用户手里才发现数据不对,损失就不是一颗烧录器能比的了。量产追求节拍可以理解,但校验这个环节是底线。
烧录地址范围,整片镜像就从0x000000开始,长度选整片容量。如果只烧分区镜像,按实际分区地址填。有一点特别提醒:很多烧录器软件允许设置“跳过空白区域”或者“只烧有效数据”,这类优化选项在量产时看着诱人,但风险在于如果文件系统校验逻辑对空白区域的期望是0xFF,跳过写入倒是没关系;可如果误判导致某些区域没写进去,又无法通过校验被发现,那问题就大了。我习惯的做法是,首批试产全部区域完整写入,摸透之后再考虑优化。
3.2 第二步:装料、接线、开烧
参数配置完成后,进入实际操作阶段。
先把烧录座从防静电盒里取出来,检查弹针是否有异物、弹簧是否正常回弹。装颗粒的时候注意方向,WSON8封装表面有一个小圆点或者切角标记,对应烧录座上的1脚方向。装反了轻则烧录失败,重则电流反向把颗粒打穿。装好之后压下ZIF插座的压杆,压紧。
接着在烧录器软件里执行“空片检测”,让软件自动识别颗粒型号和容量。识别正常后,再检查一次软件界面显示的型号跟颗粒丝印是否一致。这里我要多说一句:很多烧录器对同一厂商的不同后缀型号,识别出来的颗粒名可能落后一版,跟丝印不一致但实际兼容。如果确认参数一致能用,问题不大;但如果ID识别出来是另一家厂商的料,那就是颗粒本身有猫腻,要警惕翻新料和改标料。
点击“烧录”按钮后,烧录器开始自动执行:先全片擦除,再逐页写入,最后读回校验。整个过程在烧录器软件里会显示进度条和状态信息。一颗1Gbit颗粒在50MHz左右SPI时钟下,完整走完擦除、写入、校验大概需要1分半到2分钟。如果超过3分钟还没完成,说明算法有问题或者接触不良,应当停止排查。
烧录完成的颗粒从烧录座上取下来时,同样注意方向,不要用力过猛。烧录好的颗粒建议按托盘分区域摆放,烧完一个托盘换下一个托盘,避免已经烧过和未烧的颗粒混在一起。混料是产线大忌,后面每颗都要重新检测分辨,纯属浪费时间。
在产线实操中我特别推荐一个习惯:给烧录工位配置一台放大镜,或者直接用带显微功能的台式放大镜。WSON8封装的引脚在底面,肉眼很难判断是否对准了烧录座针脚。经验不足的工人装料后可能没压实,导致部分引脚悬空,烧录时接触不良。有了放大镜检查压合状态,这类问题能降低八成。
3.3 第三步:上板验证最容易被忽略
烧录完成的颗粒贴上板子之后,很多人觉得万事大吉,直接组装出货。我劝你别这样干,至少前几批每台都要上电验证。
上电验证的目的是确认烧录出来的颗粒能正常启动系统。具体操作很简单:把贴好Flash的板卡接入电源,连接串口终端,打开串口日志观察输出。如果系统正常启动,U-Boot的打印信息会依次出现,内核开始解压,文件系统挂载成功,最终进入正常运行状态。
我第一次做SSC335量产的时候,烧录器显示100%成功,结果贴片回来一批板子,上电之后U-Boot起不来,串口打印全是乱码。后来定位到原因,是烧录器软件里SPI时钟频率配太高,写入过程中部分数据位翻转,但烧录器自身校验算法把这个问题忽略了。从那以后,我在首件验证环节特意要求产线技术员逐台启动到系统控制台,输出一段运行日志才放行。
量产阶段的上电验证可以做成抽检制:首件全检,后续按数量比例抽检。抽检比例一般建议5%到10%,每批次至少抽5台。如果发现异常,整批隔离复检。上了自动测试治具的产线,甚至可以做100%通电测试,效果更好。
4. 量产避坑指南与问题排查
4.1 三类高频故障实录
我整理一下在SSC335系列空片烧录过程中最常遇到的问题,每一条都是亲身踩过的坑。
第一类:颗粒识别不到或识别错误。插上烧录座后,烧录器显示“No Device”或者ID跟丝印对不上。这种问题九成是接触不良。WSON8封装对烧录座的赌注很高,弹针如果磨损、表面氧化、或者颗粒本体尺寸偏薄,都会导致个别针脚没接触上。排查方法是重新装一次料,或者换一个烧录座测试。如果换了烧录座还是老样子,再考虑是不是颗粒本身有问题。还有种情况是烧录器算法库版本太旧,对新型号颗粒的ID定义缺失,升级软件版本即可解决。
第二类:烧录过程中报错,擦除失败或者写入校验不一致。这类问题除了接触不良之外,另一个高频原因是烧录座供电不稳。烧录器通过USB供电时,如果USB口供电能力不足,或者使用的USB延长线质量差,烧录大容量NAND时电流需求波动会导致电压跌落,写入自然出错。解决方法是把烧录器插到主机背板的原生USB口上,尽量别用前置USB口和劣质Hub。产线上还可以给烧录器配置带电源适配器的独立供电版本。
第三类:烧录器显示成功,板子却起不来。这是最让人头疼的一类问题,因为烧录环节看起来一切正常,问题往往出在你看不见的地方。我遇过的原因有:镜像文件本身损坏;镜像版本跟板卡硬件配置不匹配;烧录器里设置的烧录地址偏移错误(比如该从0地址写却从0x100000写了);BOOT选择引脚焊接错误导致主控没有从SPI NAND启动。排查方法是先用确认没问题的烧录器、确认能启动的镜像,重新烧一颗颗粒,拿到板子上测试,如果新烧的能启动,问题就锁定在原先那批颗粒或那次烧录设置上。
4.2 量产效率优化的几个建议
空片烧录从单颗操作到批量产线,效率优化空间其实很大。我根据自己的生产经验,分享几个投入产出比相当高的优化方向。
第一,优先使用多通道烧录器。8通道设备配合对应数量的烧录座,一个工人可以同时操作多颗芯片的烧录,人力成本不变,产能翻好几倍。如果公司产量还没大到需要购置多通道设备的程度,也可以考虑一次采购两台甚至四台单通道设备,布置在同一个工位上,同样能实现并行烧录,成本更低。
第二,把烧录参数固化成模板。在烧录器软件里把当前项目的颗粒型号、镜像文件、烧录选项全部保存成模板。产线工人只需要双击模板、一键烧录,不需要进入高级设置页面。这样做既提高了操作效率,也杜绝了工人误改参数导致批量烧录事故的可能。
第三,下载程序和烧录过程分离。很多烧录器支持先把镜像下载到烧录器的内部存储或SD卡里,之后拔掉电脑独立烧录。产线工位上少一根USB线,操作更灵活,也避免了电脑USB口供电不稳的问题。这种模式下,镜像版本在下载的时候就已经锁定,工人不需要碰电脑文件,版本出错概率大幅下降。
第四,关于烧录节拍,不要在擦除、写入、校验三个环节上动小心思。省掉校验环节也许能缩短30%时间,但一旦出现批量性数据错误,返工时间和成本足以抵消所有节约的时间。效率优化的正确方向是算法库升级、硬件通道数提升和操作流程简化,而不是牺牲质量步骤。
4.3 故障排查速查表
根据我长时间做烧录的经验,整理了一份快速排查表。产线技术员和研发工程师都可以打印一份贴在工位上,遇到问题先照表排查。
| 故障现象 | 可能原因 | 排查方向 |
|---|---|---|
| 识别不到颗粒 | 接触不良、烧录座磨损、算法库过旧 | 重新装料、更换烧录座、升级烧录器软件 |
| ID与丝印不一致 | 翻新料、改标料、选错型号 | 核对丝印和ID,联系供应商确认物料来源 |
| 擦除失败 | 供电不稳、颗粒异常、引脚氧化 | 更换USB口、独立供电、换一颗颗粒对比 |
| 写入校验不一致 | SPI时钟过高、接触不良、镜像损坏 | 降低SPI频率、重新装料、重新导出镜像 |
| 烧录成功但上电无输出 | BOOT配置错误、镜像版本不匹配、地址偏移错误 | 核对BOOT引脚、检查镜像版本、确认烧录地址 |
| 上电后U-Boot正常但Kernel起不来 | 分区表不一致、镜像中Kernel分区损坏 | 核对分区表偏移、烧录前完整校验镜像 |
| 文件系统挂载失败 | 文件系统镜像损坏、ECC设置错误 | 重新烧录RootFS分区、核对ECC配置 |
| 偶尔出现烧录失败 | 烧录座老化、环境静电、USB供电波动 | 定期更换烧录座、检查防静电措施、独立供电 |
排查逻辑记住一条:先换最可能出问题的变量。比如先重新装料,再换烧录座,再换电脑接口,最后考虑镜像问题。不要一上来就怀疑镜像损坏,把简单问题复杂化。
颗粒静电防护也要划个重点。SPI NAND属于半导体存储器件,对静电敏感度高。产线上如果不做防静电处理,冬天尤其容易出问题。烧录工位必须配置防静电手环、防静电桌面垫,烧录器外壳也要有接地措施。操作人员拿颗粒的时候尽量接触芯片本体而不是引脚,避免人体静电通过引脚进入芯片内部造成隐性损伤。这种损伤在烧录环节不一定能立刻发现,可能过几天或者一段时间后才暴露,极难排查,只能从源头预防。
最后再分享一个我自己的习惯:每次批量烧录之前,先拿一颗料完整走一遍“烧录—上板—上电—起系统”的流程,确认整套镜像和参数都没问题,再大批量生产。这个习惯帮我挡掉过好几批烧错版本固件的麻烦事。量产这种事情,慢就是快,前端多花五六分钟检查,后面能省下几小时的返工时间,算下来绝对划算。