ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

J-Link+J-Flash SPI:SPI Flash烧录从接线到批量生产实战指南

J-Link+J-Flash SPI:SPI Flash烧录从接线到批量生产实战指南 做嵌入式开发这些年我手里的J-Link绝大部分时间都被当成SWD调试器在用。直到有个朋友工厂要预烧录一批SPI Flash我第一反应是去买专用编程器他反手丢过来一个J-Link说“SEGGER那个J-Flash SPI就能干这活”。那周我一边翻手册一边调整接线终于把J-Link和J-Flash SPI的组合彻底玩顺了。现在不管是裸板预烧录、已贴板固件升级还是拆机备份我基本都是用这套方案速度快、成本低而且开发机上早就装了驱动不用额外折腾。这篇内容适合刚接触SPI Flash烧录的硬件工程师和嵌入式软件工程师也适合工厂里负责量产烧录的同事参考。我会把接线、软件操作、命令行批量烧录、经典故障排查这些内容一次讲透并且把我在实际项目里踩过的坑一并放出来。1. 什么时候需要动用到J-Link来烧SPI Flash1.1 三种典型场景预烧录、裸板升级、故障救援需要动用外部SPI Flash烧录的场景其实比想象中多。先说最常见的一类生产预烧录。很多SoC方案会从外部SPI NOR Flash启动比如ESP32系列、海思机顶盒方案、部分国产网络处理芯片它们的主芯片不内置足够大的Flash或者出于成本考虑外挂W25Q系列这类SPI Flash。PCB贴片完成之后、主芯片还没有程序时就需要先把固件烧进SPI Flash。这个工序如果放到整机组装后再做往往因为空间限制变得非常痛苦。第二类常见场景是裸板升级或者叫板级固件升级。设备已经做完了、外壳都装好了但发现SPI Flash里的引导程序版本太旧又不想把Flash拆下来重新烧。这时候如果PCB设计时预留了VCC、GND、CS、CLK、MOSI、MISO这六个测试点或排针用J-Link的SPI模式直接怼上去就能刷几分钟搞定远比拆Flash轻松。第三类是故障救援。设备启动不了怀疑SPI Flash里的固件损坏或者被写乱了需要把Flash内容完整读出来分析或者刷回之前备份的镜像。拆下来用编程器虽然也行但那样要动烙铁而且拆装过程中容易搞坏引脚。用J-Link把CS/CLK/MOSI/MISO四根线夹到Flash对应引脚上读出来一份完整bin文件整个过程无损。1.2 为什么不用SPI Flash专用编程器或ISP方式很多人会有疑问市面上几十块钱的SPI Flash编程器不是照样能用吗确实能用但要分情况。专用编程器通常需要把Flash放进烧录座或者用夹子夹在芯片两端。烧录座方案只适合Flash还没焊到板子上的场景一旦Flash在板上焊死用夹子的稳定性和接触可靠性就全靠手感稍微夹偏一点要么识别不出ID要么读到一半报错。产线上的工人可没心思再拿镊子去调整一个夹子的角度。另外专用编程器还要单独配软件驱动五花八门后期要写序列号或者MAC地址时很多廉价编程器的上位机并不支持灵活的脚本化操作。而J-Link本身是大多数嵌入式工程师手里的标配工具安装J-Link Software and Documentation Pack之后就会自带J-Flash SPI这个组件不需要额外购买硬件。也有人会想能不能直接通过单片机的ISP方式把SPI Flash内容更新进去。这个思路只在目标板上还有一块足够小的引导程序可用时才成立。如果外部SPI Flash里的启动代码本身就已经坏了或者主芯片根本没有预置ROM引导ISP这条路就走不通。用J-Link直接操作SPI Flash的好处在于它绕过了主芯片完全靠J-Link的IO口模拟SPI时序来访问Flash芯片本身是什么状态没关系只要Flash供电正常、引脚能连到即可。1.3 软硬件前提J-Link型号与软件包版本首先明确一下这里说的J-Link并不是特指某个具体型号。SEGGER的J-Link分成BASE、PLUS、ULTRA、ULTRA、PRO等好几档这些型号在SPI Flash烧录功能上基本没有差别。真正影响体验的是J-Link本体固件和J-Link Software and Documentation Pack的版本。我的使用经验是J-Link的固件在V9之后对SPI Flash算法库的支持已经比较完善V11甚至更新的版本体验更好。如果你的J-Link是早年买的V8老版本跑J-Flash SPI时会发现部分新出的Flash型号在列表里找不到这时优先考虑升级软件包而不是急着换硬件。软件方面请到SEGGER官网下载最新版本的J-Link Software and Documentation Pack。这个安装包不仅包含驱动、J-Link Commander、J-Flash也包含J-Flash SPI。安装时保持默认路径即可装完后在开始菜单里能看到J-Flash SPI的快捷方式。如果你发现安装完成后找不到这个工具大概率是安装时取消了某个组件重新运行安装程序把组件勾选完整就行。2. J-Link与SPI Flash的接线和电平匹配这一环错了什么都白搭2.1 SPI Flash常用引脚和J-Link 20pin对照市面上常见的SPI NOR Flash封装SOP8最典型引脚功能高度一致。以Winbond W25Q系列为例1脚是CS片选2脚是DO也就是MISO3脚是WP写保护4脚接地5脚是DI也就是MOSI6脚是CLK7脚是HOLD8脚接电源。其他厂商如MXIC、GD25、ISSI的引脚排列也基本沿袭这个规律所以按这套规则接线基本不会错。J-Link这边我们需要关注20pin JTAG/SWD连接器的部分引脚定义。J-Flash SPI烧录时实际是用J-Link的JTAG/SWD引脚当作普通GPIO来模拟SPI通信。默认的引脚映射关系我整理成了一个对照表方便实际操作时参考。SPI Flash信号J-Link 20pin引脚说明CS片选TDI3脚低有效软件配置成GPIO控制CLKTCK9脚SPI时钟MOSI/DIOTMS7脚主出从入MISO/DOTDO5脚主入从出VCCVTref1脚当作电压检测输入GNDGND2脚或任意GND共地这个映射是J-Flash SPI工程里的默认值你在软件里也可以改成其他引脚。但除非引脚有冲突我建议保持默认因为网络上很多现成工程文件都按这套接法来遇到问题也好对照。2.2 最容易忽略的WP和HOLD引脚处理相比CS、CLK、MOSI、MISO这四根线WP和HOLD这两个引脚才是新手最容易翻车的地方。WP低电平有效意思是当它为低电平时Flash的写保护状态寄存器会被锁定写入和擦除操作统统无效。HOLD同样是低电平有效拉低之后Flash会暂停和主控通信时钟和数据线上的变化全部被忽略。有些Flash片内默认上拉WP和HOLD悬空时看起来也能正常工作但并非所有型号都这么友好而且一旦遇到批次差异你就会看到“连接正常、擦除正常、一写就失败”的诡异现象。我的习惯是把这两个引脚直接接到Flash的VCC上缩小板空间不足时至少也要飞线焊个10k电阻上拉。批量生产的板子建议PCB设计时就固定接上拉到VCC别给产线留隐患。还有一个细节如果你的SPI Flash工作在四线QSPI模式WP和HOLD的引脚功能分别会变成IO2和IO3这意味着布线时不能把它们只当作保护引脚对待还要考虑作为数据线时的信号完整性。不过J-Flash SPI烧录基本上走标准SPI模式除非你手工切换到QPI读写指令否则这两个脚按上拉处理就好。2.3 供电与电平转换不只是一根3.3V线供电这块我要重点强调一个认知误区J-Link的VTref引脚是电压检测输入不是电源输出。很多第一次接触J-Link的人看到接线上写VTref以为插上USB之后这个脚会自动输出3.3V给目标板供电于是只接VTref和GND结果连接失败。VTref的作用是让J-Link感知目标板当前的逻辑电平。正确做法是给SPI Flash单独供电或者利用目标板上已有的3.3V电源。把Flash的VCC接到3.3V再把J-Link的VTref也接到这路3.3V上。接完之后J-Link内部检测到VTref有电压才会继续输出时钟和数据信号。如果VTref检测不到电压J-Link根本不会开始任何数据传输。电平匹配方面绝大多数SPI Flash的工作电压是3.3VJ-Link的IO电平也会跟随VTref自动调整所以3.3V系统直接互联没问题。如果你遇到的是5V供电的Flash或者MCU的IO经过了5V上拉就需要谨慎了。J-Link不是所有引脚都耐5V长期直连很可能烧坏J-Link的IO保护电路。这种场景先查J-Link手册确认对应引脚的耐压不确定的话老老实实加一个双向电平转换模块如果只是读取可以串联一个几百欧的电阻保护输入端。3. J-Flash SPI图形界面烧录全流程从建工程到校验通过3.1 新建工程、选择Flash型号和SPI参数打开J-Flash SPI之后第一步是新建工程。File菜单里选择New Project接下来会弹出目标器件选择和SPI参数配置界面。选择Flash型号时J-Flash SPI内置了非常全的SPI NOR Flash数据库华邦W25Q系列、旺宏MX25系列、兆易创新GD25系列基本都在列表里。大部分时候你只要输入Flash型号开头的关键词就能在下拉列表里直接选中。如果你的Flash型号确实找不到退而求其次的选择是Generic SPI NOR Flash模板。但要注意泛化模板不会自动帮你处理一些特殊指令比如某些Flash进入四字节地址模式需要单独发命令。操作前最好先看Flash数据手册里的指令集和模板支持的指令列表做个对照。更稳妥的做法是选择同厂商、同容量、同扇区大小的另一款Flash型号很多时候指令集完全兼容。SPI参数方面最核心的是时钟极性和相位也就是CPOL和CPHA。SPI NOR Flash普遍使用Mode 0或者Mode 3操作界面里一般都会给下拉选项。选择错误时最典型的现象是读ID能读到但是数据颠倒了或者压根读不到正确ID。我的习惯是先按Flash数据手册推荐值选连接成功后读ID验证不对再切换另一个模式。3.2 连接目标与读取ID工程配置完成后点击工具栏上的Connect按钮软件会开始和J-Link通信然后初始化配置好的SPI引脚并发送JEDEC ID读取指令。ID是在连接过程中自动读取的所以Connect成功与否本身就验证了接线和SPI参数是否正确。如果你能在界面上看到Flash的JEDEC ID比如W25Q128常见的那几个字节说明CS/CLK/MOSI/MISO这四根线、供电、上拉、SPI时序全都对得上。这个ID也是后续判断Flash型号是否选错、板子是否虚焊的重要依据。连接过程中偶尔会提示ID不匹配那就说明列表里选的型号和实际板上芯片不一致真按当前配置烧录可能会出大问题千万不要强行绕过。3.3 擦除、写入、校验与常用操作连接成功后的常规操作顺序是擦除、写入、校验。擦除操作分成整片擦除和扇区擦除。整片擦除适合整颗Flash都是新数据的情况速度快但耗时仍然不短像W25Q128这种16MB容量的片子整片擦除可能要几十秒。扇区擦除只清理指定区域适合只更新固件某个分区的场景。生产预烧录我基本都用整片擦除逻辑最简单老数据残留的问题也彻底避免。写入之前先通过File菜单加载固件支持Hex和Bin两种常见格式。加载Hex文件时要注意程序起始地址和Flash的映射地址是否匹配经常有人用Keil默认生成的Hex结果下载到SPI Flash里启动时发现跳转地址不对。Bin文件烧录时更是明确要填加载地址比如0x00000000就是Flash起始位置。写入完成后一定不要省掉校验这一步。J-Flash SPI的校验是全地址读出再对比速度比较快。校验通过说明数据确实落到了Flash里不是软件看起来成功了而已。只做Program不做Verify就像发货前不检查产品一样等于拿产线良率赌博。3.4 把工程保存下来批量生产才能找人接手图形界面调试完成之后第一件事就是把工程保存成.jflash文件。保存下来的工程文件包含选定的Flash型号、SPI参数、引脚映射等全部关键配置。后面再要烧录同款板子双击打开工程文件就能直接连上操作。我的习惯是文件名带上Flash型号和固件版本号比如w25q128_fw_v2.1.jflash避免多型号产品之间把工程文件搞混。生产线上如果由操作员来执行烧录一个保存好的工程文件能省掉大量技术指导成本他只需要会点Connect、Program、Verify这三个按钮就够了。4. 批量烧录的正确姿势命令行与脚本化4.1 J-Flash SPI命令行参数速查图形界面适合验证和单板操作但批量生产时还希望提高可靠性。SEGGER为J-Flash SPI提供了命令行接口程序名是JFlashSPI.exe安装在J-Link Software and Documentation Pack安装目录下。命令行参数数量不多但组合起来完全可以覆盖整个烧录流程。常用的参数包括参数含义-openprj打开指定工程文件(.jflash)-open打开固件文件(Hex/Bin)-connect连接目标Flash-erase执行擦除操作-program执行写入操作-verify执行校验操作-disconnect断开连接-exit退出J-Flash SPI进程4.2 一条命令完成连接-擦除-烧写-校验实际生产中我用的最多的命令格式如下。打开工程文件加载固件连接整片擦除写入校验全流程跑完自动退出。JFlashSPI.exe -openprj w25q128.jflash -open app.bin -connect -erase -program -verify -exit这里有个容易踩的坑-openprj指定的工程文件如果是相对路径命令行的工作目录必须对否则程序会报找不到工程文件。批量烧录时我建议把工程文件、固件、批处理脚本放在同一个目录里然后用绝对路径调用JFlashSPI.exe最大限度减少路径问题。另外注意-fopen和-openprj的顺序。先打开工程文件再打开数据文件否则加载固件时可能因为还没有Flash参数而出现地址解析异常。命令行执行过程中控制台会输出连接信息、Flash ID、擦除进度、写入进度和校验结果如果中途失败命令会返回非0错误码这在批处理里可以用来判断烧录是否成功。4.3 用批处理脚本管理不同固件版本单条命令是基础实际量产时固件版本可能一天变好几次这时候写一个批处理脚本能省很多事。脚本的核心逻辑很简单先检查文件是否存在再执行烧录命令最后判断错误码。echo off set FWapp_v2.3.bin if not exist %FW% ( echo Firmware not found: %FW% exit /b 1 ) JFlashSPI.exe -openprj w25q128.jflash -open %FW% -connect -erase -program -verify -exit if %errorlevel% neq 0 ( echo Burn failed with errorlevel %errorlevel% exit /b 1 ) echo Burn OK这个脚本可以继续扩展。比如把固件版本号作为命令行参数传进来或者烧录完成后自动生成带序列号的烧录日志。很多产线MES系统支持调用外部工具把JFlashSPI.exe的命令行命令嵌入到MES工位机里可以实现扫码、烧录、结果上传的闭环管理。4.4 序列号/MAC地址写入个性化数据怎么处理有些产品需要把MAC地址或者序列号烧进SPI Flash里。简单做法是先用脚本生成一个包含序列号的二进制文件再把这个文件烧录到指定偏移地址。我的思路是准备一个模板镜像序列号区域留空然后用Python脚本每次生成一个小的Bin文件把当前序列号替换进去再整体烧录。这里用Python示例说明import struct template bytearray(b\xff * 1024) serial 1001 struct.pack_into(I, template, 0x100, serial) with open(serial.bin, wb) as f: f.write(template)然后在命令行里先烧主固件再烧单独的序列号文件。要注意两次Program之间的地址不能重叠否则后一次会覆盖前一次的数据。序列号区域最好提前在固件里预留好固定偏移并且烧录时确认Flash是先擦除过的状态不然写不进全FF未编程区域以外的位置。5. 实测中反复出现的几个经典故障与定位思路5.1 “No J-Link found”USB驱动与端口占用这是所有J-Link相关操作中最常见的报错看起来是没识别到硬件但实际原因却五花八门。最常见的两个原因是驱动异常和USB端口被占用。J-Link连接到电脑后如果设备管理器里能看到正常识别的串口和通用串行总线控制器驱动基本没问题。但如果看到的是带感叹号的未知设备尝试重新安装J-Link Software and Documentation Pack安装时选择Repair修复。不要用第三方驱动管理软件乱更新驱动SEGGER自带的驱动和DLL绑得很紧。端口被占用的情况也很容易踩坑。如果你之前开着一个JLink Commander窗口没关再运行J-Flash SPI就会提示No J-Link found。原因是旧的J-Link进程独占了对USB设备的访问。处理办法是把所有JLink相关的命令行窗口和GUI程序全部退出再重新尝试。USB HUB供电不足也会造成类似现象尤其是那种不带外部供电的廉价HUB接多个外设时经常掉设备。5.2 连接不上目标或读不到ID先看供电再看时序Connect时报错或者一直卡在等待状态优先怀疑三个方向按顺序排查。第一查供电。用万用表量Flash VCC引脚是不是真的有3.3V再量J-Link的VTref引脚是不是也接到了同一路电源。VTref检测不到电压时J-Link基本上不会输出任何有效时序这个原因占了很大比例。第二查接线。CS、CLK、MOSI、MISO四根线有没有接反尤其是MOSI和MISO很多人在杜邦线混乱时容易对调。对调后最典型的反应就是读不到ID或者读到的数据全是0xFF。J-Link的SWD调试习惯和SPI接线是两个概念别用SWD的TMS/TDO概念强行套。第三查SPI参数。CPOL和CPHA组合不对也会导致读不到正确ID。这时把界面里的SPI Mode从Mode 0切到Mode 3再试一次多半就能解决问题。如果都不行就降低SPI时钟频率把频率压到1MHz附近再连接。有些劣质杜邦线在高速SPI下信号质量很差频率降低后一切恢复正常。5.3 Verify failed擦除、时序、坏片三个方向写入能成功但校验不过这种情况最容易让人抓狂。我的排查顺序是先确认烧录前有没有正确擦除。SPI NOR Flash只能在擦除后的全FF状态下将位从1写成0如果这个区块之前有数据而没有擦除Program时虽然不会报错但实际存进去的数据就是错的。所以遇到校验失败第一步回看擦除操作是否真的执行了。再检查SPI时钟频率。J-Link模拟SPI时跑的频率如果超过Flash支持的上限虽然是烧写成功但写入的时序边界可能刚好在临界区容易出现个别bit错误。这时把时钟频率从10MHz降回3MHz或1MHz重新烧录对比结果。产线用的廉价接线和插座对高频信号很不友好千万别图快一上来就拉最高频率。确认以上两项后仍然校验失败就需要考虑Flash本身是不是已经坏了。拆机片或者库存片经常存在坏块或者状态寄存器异常。用一个已知正常的样板验证J-Link接线和软件配置如果正常板子能顺利通过那就基本确定是当前这颗Flash的问题。5.4 Keil MDK里J-Link烧录失败与版本兼容性很多人在Keil MDK中烧录STM32时会遇到打开Flash Download时提示No J-Link found、RDDI-DAP Error或者某一步直接卡死。原因大多是Keil自带的J-Link DLL和当前安装的J-Link软件版本不匹配常见于老工程升级MDK版本之后。解决方法是确认Keil的调试器选择是J-Link并更新到最新版J-Link软件包。Keil的烧录对话框里有一个DLL版本号显示和J-Link安装目录里JLinkARM.dll的版本保持一致。若设置无误但RDDI-DAP Error反复出现检查目标板供电和SWD四线是否连接稳定再把Speed从默认的5MHz往下降到1MHz排除线束干扰。5.5 国产芯片识别不了设备数据库和更新策略不少国产Cortex-M内核芯片比如CW32L010、GD32系列在较老版本的J-Link软件包中找不到对应型号导致无法连接。最近热词里也看到CW32L010支持J-Link版本的问题说明很多人卡在这里。对于这类情况优先升级J-Link Software and Documentation Pack到最新版SEGGER每个月都会更新设备数据库新型号芯片基本都会被逐步加入。如果最新版本仍然没有目标芯片可以在J-Link的设备数据库里尝试添加一个同内核、同Flash布局的替代型号先连上但这种方法有风险如果芯片的Flash算法不通用下载过程会失败。更稳妥的做法是联络芯片原厂获取官方支持的算法文件再按照SEGGER的格式导入或者直接用SeEgger的脚本方式。实测下来国内主流厂商的CW32、GD32、MM32等都有官方J-Link补丁包去官网下载导入即可。6. 从“能烧”到“好烧”提升效率与可靠性的经验6.1 工装设计排针颜色、防呆与方法产线烧录的效率和稳定性很大程度上取决于工装而不是软件本身。我一个比较坚持的原则是所有SPI烧录排针的颜色固定下来。比如黑色是GND、红色是VCC、黄色是CLK、蓝色是MISO、绿色是MOSI、白色是CS整个公司统一不要让每个工程师按自己喜好随便选颜色。杜邦线颜色一旦统一新员工培训成本立刻下降。有条件的话做一个转接小板。板子上放一个6pin排针标注清楚信号名称另外一端做成小夹子或者探针固定好间距。这样产线工人只需要把转接头对准板上的测试点用夹具压紧不需要分辨每一根线的去处。烧录座这种治具同样建议用顶针压接的方式避免反复人工插拔导致歪针。6.2 擦除策略整片擦除还是扇区擦除擦除策略要在速度和可靠性之间做取舍。如果固件只有几百KB而Flash是16MB每次整片擦除都会浪费大量时间。一个合理的做法是只在首次预烧录做整片擦除之后的升级更新就按扇区擦除只擦固件实际占用的区域。但必须确认产品运行时的数据分区和固件分区不重叠如果擦除范围意外覆盖了参数区那损失就不只是烧录时间了。我一般在J-Flash SPI工程里预先设置好需要操作的扇区范围在命令行脚本里通过参数控制擦除方式。生产预烧录用Chip Erase返修或者升级时用Sector Erase。这样既保证首次烧录的干净也兼顾现场升级的速度。6.3 生产记录与质量闭环批量烧录最怕出现“烧了100片最后发现其中5片有问题但不记得是哪5片”。为避免这种情况我会在批处理脚本里要求每次烧录结束打印结果并把产品唯一编号和烧录时间写入到日志文件。实际操作中如果产线有扫码枪把产品序列号作为参数传给脚本脚本把序列号和烧录结果追加进CSV日志这样每片产品都能追溯到烧录状态。另一个容易被忽视的点是校验记录不能只依赖J-Flash SPI的Verify结果。如果要在量产前彻底验证板子功能烧录完成后可以写一个小程序上电后读取SPI Flash关键区域的CRC校验值并输出。这样不仅验证了Flash烧录内容也顺带验证了整个启动链路。6.4 备份母片J-Flash SPI的另一个用法J-Flash SPI不仅能写还能读。读取功能在做产线备份时很有价值比如你手头有一片固件版本神秘的Flash网上找不到对应文件那就直接把Flash内容读出来保存成bin文件。具体操作是在连接成功后选择Read命令指定保存路径J-Flash SPI会把整个Flash读到一个文件中。这个bin文件往后可以用来批量烧录同配置的产品。只不过读取出来的文件具体长度取决于Flash容量而不是固件实际大小在还原烧录时要注意对齐。备份出来的母片文件最好用hash工具算一个MD5值存起来后续再读取其他板子时对一下哈希能快速发现版本差异或者数据损坏。从我个人的使用体验来说J-Link和J-Flash SPI这套组合解决的不只是“能不能烧”的问题更重要的是把SPI Flash烧录从手工活变成可复制、可追溯、可脚本化的标准流程。希望这篇文章里的接线方式、参数配置和踩坑经验能帮你少走弯路一次就点亮板子。
返回列表