ARTICLE DETAIL

资讯详情

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

全贴片Kazzo烧录器改造:STM32+CPLD与PCB设计实战

全贴片Kazzo烧录器改造:STM32+CPLD与PCB设计实战 Kazzo这块板子在FC怀旧圈子里算得上是个“老熟人”了。凡是玩过FC卡带备份、自制合卡或者研究过Mapper映射原理的朋友大概率都看过这个开源烧录器的原理图。它的核心思路并不复杂用STM32做USB通信和控制用一颗CPLD去模拟FC卡带的总线时序再配合SRAM做数据缓冲从而实现对原装卡带、盗版卡带和自制卡带的读写。原版Kazzo大多用的是直插元件洞洞板加飞线焊起来费劲不说体积也大用久了还容易出现虚焊、信号串扰之类的毛糙问题。我这次改造的核心目标很明确保留Kazzo的全部功能和引脚定义把所有能贴片的元件全部改成贴片封装用立创EDA重新画一版紧凑的双层PCB焊接完成后实测读写原装卡带和自制Mapper游戏整个流程记录如下。这次改造的起点其实很朴素。手头那块洞洞板版Kazzo用了好几年每次插拔卡带都得小心翼翼生怕把哪根飞线扯断。后来帮圈里朋友做了几块发现手工焊接直插件加飞线的良品率确实不稳定尤其是74系列逻辑芯片和CPLD之间的连线稍微错一根就得拿万用表从头捋一遍。所以当立创EDA的工程库越来越全、嘉立创打样价格也下来之后我就动了全贴片重画的念头。贴片化带来的好处是实打实的板子面积能缩小一半以上信号路径大幅缩短电源完整性更好而且贴片封装配合钢网焊接一致性远超手工搭棚。如果你手头也有一块Kazzo或者正打算入门FC卡带读写这篇文章会从原理拆分、元件选型、PCB布线、焊接调试一直讲到踩坑实录全程基于这次实际改版经历希望能帮你少走点弯路。1. Kazzo烧录器的核心原理与改造目标1.1 Kazzo解决了FC玩家的什么痛点FC卡带本质上就是一个带有ROM有时还有RAM和Mapper芯片的印刷电路板。原装卡带里通常有PRG ROM程序数据和CHR ROM图形数据Mapper芯片负责地址译码和Bank切换让CPU和PPU能访问到正确的存储区域。玩家要做的事情无非三种把卡带里的ROM读出来备份、把网上下载的ROM写进空白卡带或可擦写卡带、以及制作包含多个游戏的合卡。Kazzo就是在电脑和FC卡带之间搭桥的那个角色。它的工作流程是电脑上的上位机软件通过USB把数据发给STM32STM32解析命令后通过并口总线把地址、数据和控制信号交给CPLDCPLD按照FC总线的时序把这些信号施加到卡带槽上。反过来从卡带读数据时CPLD负责在正确的时序窗口内锁存数据然后STM32再把数据打包通过USB上传给电脑。整个过程听起来简单但难点全在时序上FC的CPU主频是1.7897725MHz读写周期在微秒级别如果用STM32的GPIO直接模拟这些时序精度和稳定性都很难保证而CPLD作为纯硬件逻辑器件可以做到纳秒级响应这才是它存在的意义。1.2 为什么是STM32加CPLD的组合Kazzo选择STM32F103作为主控原因很务实首先是USB全速设备功能现成不需要外挂USB转串口芯片CubeMX初始化就能跑其次是F103系列价格便宜、供货稳定几十块钱就能买到带足够引脚的型号再次是固件开源社区里针对不同FC卡带Mapper的兼容性更新一直没停过用这颗芯片不用担心生态问题。CPLD则用的是Altera现在是Intel的MAX II系列最常见的是EPM240T100这颗器件当时被大量用在FPGA开发板的逻辑扩展上二手和拆机片都很便宜引脚多、功耗低、JTAG下载也方便。这套方案的巧妙之处在于任务分工。STM32只负责“USB协议解析”和“数据搬运”这种CPU擅长的事情而所有对时序敏感的总线读写操作都交给CPLD去处理。CPLD内部用硬件描述语言写了一大堆状态机针对不同Mapper实现了各自的地址译码和Bank切换逻辑。这样一来即便FC卡带的型号千奇百怪只要CPLD的逻辑代码适配得当Kazzo就可以通吃绝大多常见Mapper。1.3 这次全贴片改造的具体目标原版Kazzo的参考设计文档里几乎所有芯片都是DIP直插封装电容电阻也以插件为主。这导致成品板子面积相当可观而且DIP封装引脚天生比SMD长高频信号经过长引脚后反射会变大。这次改造我给自己定了几个硬性指标板子尺寸从原版的10厘米乘12厘米级别压缩到6厘米乘5厘米以内所有电阻、电容、二极管、三极管、逻辑芯片一律使用贴片封装IO能力足够的前提下优先0603和SOIC保留双排母插座卡带槽接口方便直接插FC卡带不改变原有机械结构保留SWD调试接口和CPLD的JTAG下载口方便在嘉立创直接下单打样最好能直接用立创EDA的SMT贴片服务把大部分器件贴好自己只需要焊卡带槽和接插件整体电气性能和原版持平甚至更好重点关注电源去耦和地平面连续性这里要特别说明一点全贴片并不意味着无脑把封装改小。比如STM32F103ZET6是LQFP144封装引脚数量多但体积不小如果只做烧录器用LQFP48封装的STM32F103C8T6完全够用引脚资源反而不那么浪费。CPLD的EPM240T100本身就是TQFP100封装比DIP版本好焊太多。真正需要动脑筋的是SRAM、电平转换芯片和74系列逻辑门的封装选择以及它们和卡带槽之间的布线。2. 全贴片改造的元件选型与封装决策2.1 主控芯片的取舍STM32F103C8T6还是ZET6原版Kazzo原理图上用的是STM32F103ZET6一百多个引脚其中相当一部分是留给CPLD的IO连接和卡带槽总线的。但仔细分析原理图就能发现真正用到的引脚其实没那么多——数据总线8位地址总线16位再加上读写控制信号总共大概40多个GPIO。STM32F103C8T6虽然只有48脚但GPIO数量也有37个如果合理复用比如把部分数据线和地址线接到同一个端口完全可以覆盖需求。我这次用的是STM32F103C8T6。有几个客观原因一是LQFP48封装比LQFP144小太多贴片焊接时对位容易二是C8T6的Flash是64KBKazzo固件才几十KB完全放得下三是C8T6淘宝采购价不到十块钱做坏了不心疼。需要注意的是C8T6的GPIO耐压值大多是5V容限但有一小部分引脚不是接卡带槽之前一定得核对数据手册避免高电平反灌损伤主控。我实际画板时把所有5V电平相关的信号都经过了电平转换芯片没有直连。2.2 CPLD与SRAM的贴片化选型CPLD我选了EPM240T100C8NTQFP100封装引脚间距0.5毫米手工焊接稍有难度但配合拖焊和助焊剂完全可控。这颗芯片的原版逻辑代码在Kazzo的开源仓库里能找到编译后用USB-Blaster下载到芯片里就能用。MAX II系列有个特性配置数据是存在芯片内部的Flash里的掉电不丢失不需要外挂配置芯片这对烧录器这种需要即插即用的场景很友好。SRAM的作用主要是给CPLD做数据缓冲和地址映射。原版Kazzo使用6225632K x 8bit之类的并行SRAM贴片化之后我用的是IS62WV51216BLL这是64K x 16bit的芯片TSSOP44封装。选这颗的原因有两层第一兼容性更好16位数据总线可以通过CPLD拆成两个8位周期使用第二TSSOP44引脚间距0.8毫米比0.65毫米的TSSOP48好焊不少。对于纯读卡带和写Mapper2/Mapper4这类需求32K的62256其实就够了但既然要改版预留更大的SRAM总没坏处。2.3 逻辑芯片与电平转换贴片封装的坑与对策Kazzo原版设计里用了不少74系列逻辑芯片比如74HC245总线收发器和74HC374八路D触发器用来做数据方向控制和信号锁存。这些芯片的直插版本都是DIP20或DIP16封装体积大、引脚寄生电感也大。贴片化之后改成SOIC20和SOIC16封装焊接难度直线下降性能反而更好。不过这里有个容易踩的坑74HC系列是5V供电的CMOS逻辑而STM32和CPLD的IO口是3.3V供电如果不做电平转换3.3V的高电平在74HC看来可能达不到输入高电平阈值导致逻辑混乱。解决办法是在关键信号线上串联双向电平转换芯片比如TXB01088位双向电平转换或者SN74LVC42458位双向收发器。我自己用的是SN74LVC4245它的A端口接3.3V系统B端口接5V总线方向由DIR引脚控制输出使能由OE引脚控制非常符合Kazzo的需求。封装选了TSSOP24焊接也不难。这里提醒一句TXB0108这类自动方向感应的芯片虽然用起来方便但在有双向总线的场合容易因为方向判断延迟而引入毛刺所以慎用。2.4 电源与被动元件的贴片化电源方案上原版Kazzo用的是AMS1117-3.3把USB的5V降到3.3V。AMS1117本身有SOT-223贴片封装可以无损替换。但AMS1117的压差比较大约1.1V输入5V输出3.3V没问题如果哪天想用4.2V锂电池供电输出就可能稳不住3.3V了。考虑到烧录器基本都是插着USB用的这个缺点可以忽略。晶振的选择也要注意。原版用的是49S封装直插晶振这次我换成了贴片无源晶振3215或HC-49S贴片型号均可负载电容选了22pF并联在晶振两脚之间。STM32F103的HSE电路里两个负载电容的容值不需要太精确20pF到30pF都能起振关键是走线要短。另外CPLD如果需要独立时钟有些逻辑版本要求还要加一颗有源贴片晶振或者用STM32的MCO引脚输出时钟——后者省一颗元件但MCO输出频率精度会受PLL配置影响我给CPLD单独加了一颗50MHz有源晶振逻辑时序更干净。3. 立创EDA工程重建与PCB设计要点3.1 为什么选择立创EDA而不是KiCad或AD选择立创EDA的原因很直接免费、在线、元件库全而且与嘉立创打样和SMT贴片服务无缝衔接。KiCad虽然开源且功能强大但导入非标准原理图需要自己做封装效率上不如直接搜索“EPM240T100”就能找到现成封装。Altium Designer虽然好用但个人授权价格不低并不适合多数怀旧DIY玩家。立创EDA专业版我在用的时候最大的感受是原理图符号库和PCB封装库足够丰富连SN74LVC4245这种冷门型号都能直接搜到省去了大量建库时间。另外如果你想把原版Kazzo的工程从其他格式转过来立创EDA也支持导入AD格式文件虽然偶尔有封装丢失的情况但大框架基本能保留。3.2 原理图移植过程中的几个关键点我这次没有直接导入原版文件而是按照原版逻辑重新画了一份原理图因为原版画的比较随意元件位号混乱直接改封装效率反而低。重画时我特别注意这几个地方首先是电源树。USB 5V进来之后先经过一个500mA自恢复保险丝再并联一颗10uF钽电容做输入滤波之后分成两路一路直接给卡带槽的5V引脚供电另一路进AMS1117-3.3输出3.3V给STM32、CPLD和SRAM供电。3.3V输出端放10uF加0.1uF电容组合每个IC的电源引脚旁边至少有一颗0.1uF去耦电容CPLD的电源引脚比较多我几乎每个VCCIO引脚旁边都放了一颗保证逻辑切换时电源纹波最小。其次是复位和启动配置。STM32的NRST引脚接10k上拉电阻到3.3V并联100nF电容到地。BOOT0直接通过10k电阻下拉到地确保从Flash启动。CPLD的nCONFIG引脚必须接10k上拉到3.3VnSTATUS和CONF_DONE也要正确接上拉否则下载配置时会报错。对于EPM240T100这种TQFP封装的芯片TDI、TDO、TMS、TCK这四个JTAG引脚最好加一个小型4pin排针方便接USB-Blaster。第三是卡带槽的引脚映射。FC卡带的引脚定义是有固定标准的比如PRG地址线A0-A15、PRG数据线D0-D7、CHR地址线A0-A12以及读写控制信号、卡带复位信号等。在原理图里这些引脚通过命名网络与CPLD相连CPLD内部再完成地址译码和Bank切换。重画时唯一需要注意的是原版Kazzo的卡带槽可能用的是60pin或72pin的母座引脚编号顺序不能搞错最好对照原版原理图一个个比对。3.3 PCB布线地平面、去耦和总线走线PCB布局布线是整个改版中最影响实际效果的部分。双层板虽然不如四层板那样有完整的地平面和电源平面但只要处理得当完全够用。先定板框。我这次做的是5厘米乘6厘米的双面板卡带槽放在长边一端USB座放在短边另一端STM32和SRAM放在中间CPLD紧贴卡带槽。这样排列的好处是CPLD离卡带槽最近总线走线最短STM32和USB座靠近USB差分线长度可控SRAM和STM32之间数据线不长不容易串扰。布线时有几条硬性规则电源线优先走粗线。USB 5V走1.2毫米3.3V走1毫米卡带槽5V走0.8毫米以上。实在走不开的时候至少保证电源输入端和去耦电容之间是粗线。底层大面积铺地顶层在空白处也尽量铺地并用过孔将上下地平面缝合。每颗IC周围至少打4个地过孔缩短回流路径。信号线宽度用0.2毫米约8mil过孔用0.3毫米外径0.6毫米完全满足嘉立创的工艺要求。数据总线D0-D7和地址总线A0-A15尽量保持平行不要交叉如果实在要换层保证换层处附近有地过孔做参考。USB的D和D-是差分线尽量等长、靠近走线正反面参考地都要连续避免阻抗突变。时钟晶振的走线要短负载电容尽量靠近晶振引脚晶振正下方不要走其他信号线。关于星型接地很多初学者会问是不是要把所有地线单独拉回主地焊盘才算星型。我的经验是低频模拟电路里星型接地有意义但对于这种数字逻辑为主的双层板最关键的是保证地平面连续、电流回流路径短而不是机械地追求星型。只要每个模块的地都通过最近过孔回到底层地平面再确保卡带槽、USB座、电源输入的地连接点足够粗就不会有地环路干扰问题。3.4 下单打样前的检查清单立创EDA画完PCB之后先跑一遍DRC设计规则检查确认没有未连接的引脚、没有间距违规、没有丝印压焊盘。然后生成Gerber文件在嘉立创下单页面选参数时注意板子尺寸尽量往常规档靠。5x6厘米正好在打样优惠范围内板厚选1.6毫米卡带槽插拔更稳表面工艺选喷锡有铅就可以了没必要上沉金铜厚默认1盎司足够不需要加厚如果打算让嘉立创SMT贴片下单时选“SMT贴片”并把BOM表和坐标文件一并上传拼板方式选“拼板不用V割”因为成品形状要整块卡带槽面板4. 焊接过程实录与固件烧录调试4.1 焊接顺序与温度控制拿到PCB之后第一步千万别急着焊大芯片先做裸板检查用万用表蜂鸣档测量5V和GND之间是否短路、3.3V和GND之间是否短路确认电源网络没有异常后再开始焊接。焊接顺序我建议从最小、最中心的芯片开始逐步向外扩展先焊STM32F103C8T6。在焊盘上均匀涂一层薄助焊剂芯片对准丝印框先固定对角两个引脚然后拖焊一整排引脚。LQFP48引脚间距0.5毫米烙铁温度设定在330到350摄氏度选用刀口烙铁头蘸适量锡后从排脚一端匀速拖到另一端借助助焊剂表面张力可以让锡自动分开。焊完后用放大镜或手机微距镜头检查有没有连锡、虚焊。如果发现连锡不要急着用吸锡带先加一点助焊剂重新拖一遍多数情况下锡会自然分开。第二步焊SRAM和CPLD。CPLD是TQFP100引脚数量多容易焊歪建议先在焊盘中心点一滴助焊剂把芯片放上去后从侧面确认所有引脚都对齐焊盘再固定四角。拖焊时锡量宁少勿多。第三批焊接元件是电阻、电容和磁珠。所有阻容我都用了0603封装焊接时一把镊子加一把烙铁先在一个焊盘上锡然后用镊子夹住元件放上去烙铁加热焊盘让锡融化固定一端再焊另一端。如果熟练了一小时能焊完一整板阻容。最后焊AMS1117、SN74LVC4245、晶振、USB座、排针和卡带槽。这些元件体积较大正常焊接即可注意AMS1117的散热焊盘要接地别让它悬空。4.2 最小系统先跑起来点灯测试与SWD调试全板焊接完成后不要急着接卡带先做最小系统调试。用ST-Link或者J-Link OB的SWD接口连接STM32的SWDIO、SWCLK、GND、3.3V四个引脚打开STM32CubeProgrammer尝试连接芯片。如果你用的是ST-Link这里最常遇到的报错就是“Unknown device id”。排障思路如下检查3.3V供电是否真的到芯片VDD引脚用万用表直接量检查SWDIO和SWCLK是否虚焊必要时用飞线直接从调试器飞到芯片引脚量通断确认BOOT0已经下拉到地否则芯片可能进入系统存储器模式而不是运行用户Flash确认NRST引脚的电平不是被地短路或者持续低电平成功识别芯片后随便下载一个GPIO翻转的测试程序点个LED验证时钟和复位正常。这一步如果没通过后面烧录器固件和CPLD逻辑就是空谈。4.3 烧录Kazzo固件与CPLD逻辑最小系统没问题之后就可以烧录Kazzo的上位机固件了。固件从Kazzo开源仓库的Firmware目录下载用STM32CubeProgrammer烧录到STM32的Flash。烧录完成后插上USB线电脑应该能识别出一个虚拟串口设备管理器里显示的端口名一般带有“Kazzo”字样。如果没有识别检查USB座子的D和D-是否接到了STM32的PA11和PA12这两根线容易在布局和焊接时搞混最好用万用表从USB座焊盘量到芯片引脚确认。CPLD的烧录需要USB-Blaster下载器软件用Quartus II13.0sp1版本对MAX II兼容性最好。在Quartus里打开Kazzo仓库的CPLD工程编译生成.pof文件然后在Programmer界面选择USB-BlasterAdd File加载.pof点击Start。如果这里报“不能识别的USB-Blaster”或者“Device chain broken”大概率是JTAG引脚虚焊或者nCONFIG没有被上拉排查顺序是先量TCK和TMS有没有电平再看TDI到TDO链路通不通。4.4 卡带读写实测与常见问题速查一切就绪后插上一张有代表性的卡带打开Kazzo配套的读卡软件先试读PRG ROM。如果读到全FF或者全00先别急着判定板子坏了按下面的表逐项排查现象大概率原因排查与解决软件识别不到端口STM32固件没跑起来或USB D/D-接反重新插拔USB检查PA11/PA12是否交叉检查晶振是否起振能识别端口但读卡全FF卡带槽触点接触不良或CPLD逻辑未烧录重新插拔卡带确认CPLD的.pof已烧录用示波器量卡带槽的CE信号有没有翻转读卡全00SRAM数据线或CPLD到SRAM走线错位用万用表量SRAM每个数据引脚到CPLD引脚的连通性核对PCB封装位序读取到一半失败电源纹波大或者SRAM时序余量不足3.3V加一颗100uF电解电容CPLD到SRAM走线缩短或者降频处理CPLD下载报错JTAG引脚被卡带槽信号占用或上拉不对先拔掉卡带单独给CPLD供电下载确认nCONFIG和nSTATUS电平正确写ROM后校验失败电平转换芯片方向控制错误检查SN74LVC4245的DIR引脚是否由STM32正确控制确认读写方向切换逻辑我在调试过程中遇到最隐蔽的一个问题是卡带读取时数据低4位偶尔出错表现为ROM数据每隔几个字节就有错。折腾了半天才发现是SRAM的VCC引脚没有就近放去耦电容导致高频率读写时电源纹波偏大CPLD采到的数据偶尔不满足建立保持时间。后来在SRAM的VCC和GND之间补了一颗0.1uF电容问题就消失了。所以前面说每个IC电源引脚旁都要放去耦电容这不是什么玄学是实打实的稳定性保障。4.5 外壳与机械细节全贴片改造完成后整块板子比原版小了一大圈裸板使用没问题但放在桌面上容易被金属工具短路。3D打印一个外壳是很好的收尾工作模型尺寸就按照5厘米乘6厘米来画卡带槽那一端留出矩形开口USB座那一端留出Type-C或Mini USB开口。如果你手头没有3D打印机淘宝上一些标准铝合金外壳也能凑合用只要内部高度超过15毫米就能容下板子和卡带槽的焊接高度。5. 这次改造的实测效果与扩展玩法5.1 与原版Kazzo的对比实测改版后的板子我连续用了两周读写了几十张卡带包括原装《魂斗罗》《超级马里奥3》以及几盘盗版合卡。结论是全贴片版在读写成功率上和原版持平在长时间连续拷ROM时反而更稳定。原版洞洞板偶尔会因为线束间电容耦合导致数据线毛刺贴片版由于走线短、地平面完整基本没再碰到过类似问题。读写速度上贴片版没有明显提升因为瓶颈在上位机软件和USB协议本身但这个不重要——FC游戏ROM最大也就1Mbit量级几秒钟就能读完体验已经很不错了。5.2 给烧录器增加LED指示功能原版Kazzo只有一盏电源灯工作状态全靠上位机界面判断。这次我加了三颗LED一颗红色电源指示一颗绿色忙状态指示一颗蓝色完成指示。STM32固件里预留了GPIO控制逻辑通过CPLD的状态反馈来切换灯色实用性一般但仪式感拉满。如果你也想加记得用限流电阻220欧姆到470欧姆都行别直接裸接GPIO。5.3 从Kazzo到理解FC总线协议如果你愿意深入研究Kazzo这套硬件是一个极好的FC总线学习平台。通过CPLD的逻辑代码你可以清晰地看到地址译码、Bank切换、PRG/CHR读写使能是怎么工作的。很多人就是看了Kazzo源码之后才理解了Mapper0到Mapper4的区别进而对那些“神作”合卡为什么能在FC上运行有了实际的认知。我自己就是从Kazzo入手后来还仿写了一版针对Mapper2的简化CPLD逻辑加深了理解。6. 踩坑总结与最后的经验技巧6.1 拆装焊接中最容易忽略的三件事第一件事是助焊剂一定要用好。便宜的松香助焊剂在拖焊TQFP封装的芯片时容易发黑结焦反而导致引脚粘连。换成质量好的液体助焊剂或者免洗助焊笔之后拖焊手感和成功率完全是两个级别。第二件事是板子焊完以后一定要用洗板水或酒精彻底清洗残留的助焊剂在潮湿环境下会引入漏电尤其是CPLD引脚这么密残留物很容易造成相邻引脚短路或者阻抗下降。第三件事是卡带槽的选型尽量买那种镀金触点、引脚加长的类型普通排母的弹片太薄反复插拔几次就容易松接触不良会让人误以为板子坏了。6.2 如果打算复刻或送给朋友的几个建议如果只是自己玩板子焊好能用就行没必要追求完美。但如果打算给圈里朋友做几块甚至小批量卖几块建议在PCB上把测试点留足SWD的四根线、3.3V、5V、GND最好都引出焊盘方便后期调试。丝印上把关键芯片的方向角标画清楚板号写上版本号和日期这样后续改版时对得上。还有一个建议是如果你没有把握手工焊接TQFP100可以考虑直接在嘉立创下单时勾选SMT贴片服务把STM32、CPLD、SRAM、逻辑芯片和阻容全让贴片机贴好自己回来只焊USB座、排针和卡带槽。这样成本会稍高一些但良品率几乎100%适合批量做。6.3 后续还可以做哪些升级方向这次全贴片改造给Kazzo的后续升级留足了空间。你可以把USB座升级成Type-C并加上CC电阻识别可以把卡带槽换成双排直插母座做成烧录座不一定要用长排针连接甚至可以在板上加一颗W25Q64 SPI Flash用来暂存ROM实现脱机备份多张卡带以后再通过USB导出。总之Kazzo的硬件底子很扎实加上立创EDA的快速改版能力想加什么功能都很方便。我在实际使用的过程中最深的体会是复古硬件的现代化改造关键不是把元件换小一点这么简单而是在换封装的同时把所有电气性能的下限兜住。电源干净、地平面连续、信号路径短这三点做到位了贴片化反而比直插更可靠。希望这篇过程记录能给想复刻Kazzo或者做类似改造的朋友一些参考。最后再分享一个小技巧焊接完所有贴片元件后第一件事不是上电而是用万用表把所有电源网络的对地电阻量一遍如果发现某个网络只有几欧姆先找短路再上电能帮你省下一整块板子和一堆头发。
返回列表