ARTICLE DETAIL

资讯详情

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

USBasp不识别、Atmega328P烧录失败?一文搞定驱动与bootloader

USBasp不识别、Atmega328P烧录失败?一文搞定驱动与bootloader 说实话每次看到有朋友拿着USBasp问我“为什么电脑不识别烧录Atmega328P老是失败”我基本都能猜到前面发生了什么买了个USBasp插上电脑Windows“叮咚”一声又“叮咚”一声设备管理器里出现一个黄色感叹号再点开Arduino IDE准备烧录结果跳出一串avrdude错误直接劝退。这类问题我在不同板子上踩过不下十次从驱动签名、接线顺序、供电冲突到熔丝位锁死几乎每个坑都填过。这篇就把“USBasp不识别、Atmega328P烧不进去、Arduino IDE不认烧录器”的完整排查路径写出来给还没解决的人一个可以直接抄的作业。先说清楚适用对象手里有一只USBasp目标是给Arduino Uno或者裸片Atmega328P烧录bootloader或者救一颗熔丝位设错的芯片。不管你是准备做智能小车、控制舵机还是玩数码管、点阵屏第一步基本都绕不开这关。1. 先搞清楚手里是什么再谈为什么能烧录1.1 USBasp还是usbisp先把名字叫对标题里的“usbisp”我猜是口误或者被商品页误导了这东西的真名是USBasp而不是USBISP。它的名号来自Thomas Fischl设计的一个开源AVR ISP下载器方案国内很多商家按这个开源方案做了一批廉价的下载器蓝色小板、黑色小板都有正面一个USB A口另一端是2x5的ICSP排针。为什么我强调要叫对名字因为整个Arduino IDE、avrdude命令行、驱动安装流程里所有选项都叫“USBasp”。你要是按照“usbisp”去搜问题基本搜不到有效结果。很多网店标题也故意写成“USBISP”纯粹是为了蹭搜索流量苦了不少新手。USBasp的本质是一个“USB转SPI协议”的桥接器。它板上有一颗AVR单片机常见的是ATmega8或ATmega48/88刷了USBasp固件。插上电脑后电脑通过USB和它通信它再通过SPI接口也就是ISP协议去读写目标芯片。所以它能干的活很明确读芯片签名、烧写Flash、读写EEPROM、读写熔丝位这正好是给Atmega328P烧bootloader需要的全部能力。1.2 什么时候必须用USBasp什么时候用不上很多初学者有个误区觉得所有“给Arduino下载程序”都应该用USBasp。实际上一块正常的Arduino Uno板子平时通过USB串口就能上传程序走的是板载bootloader根本不需要USBasp。需要USBasp的场景通常是下面几种新买回来的Atmega328P是空白芯片出厂没有bootloaderUSB串口下载直接报错必须先用USBasp把bootloader烧进去。自己画的板子或者把328P单独拆下来做成模块没有USB转串口电路只能用ISP方式烧录。不小心把熔丝位设错了芯片“变砖”需要用USBasp重新读熔丝、写熔丝。需要读写EEPROM、修改熔丝位、校验芯片签名这类底层操作USBasp比串口方便太多。说白了USBasp是给芯片“装系统”的工具串口下载是“装完系统后再装软件”的工具。两者职责不同但配合起来才能让Arduino生态跑起来。2. 驱动和识别电脑不认USBasp九成是这一步出了问题2.1 Windows下驱动安装的正确姿势USBasp插入电脑后如果设备管理器里出现“USBasp”且带黄色感叹号或者直接提示“无法识别的USB设备”不要怀疑USBasp坏了大概率是驱动问题。USBasp用的驱动不是Windows自带的而是libusb-win32或者WinUSB那套机制。早期商家附赠的光盘里有一个“USBASP驱动.exe”很多还是32位老驱动在Win10/Win11 64位系统下根本装不上或者弹“无法验证发布者”被系统拦掉。我的做法是直接绕开所有附赠驱动用Zadig这个工具来装干净利落。Zadig在Windows USB驱动圈里很有名官网是zadig.akeo.ie下载绿色版直接运行。具体步骤先把USBasp插到电脑USB口。打开Zadig菜单栏选择Options勾选List All Devices。在下拉框里找到USBasp对应的条目注意别选成别的USB设备。右侧驱动框里选择libusb-win32如果列表里没有选WinUSB也行。点击Install Driver或者Replace Driver等几秒完成。装完之后设备管理器里会多出一个“libusb-win32 devices”分组下面能看到USBasp状态正常这一步就算过了。注意avrdude对libusb-win32的兼容性最稳。如果Zadig里没有libusb-win32退而求其次选WinUSB新版avrdude基本都认。libusbK个别版本可能让avrdude找不到设备能不选就不选。2.2 驱动装好了还不识别先做这三步我遇到过不少情况Zadig装完驱动设备管理器也正常了但avrdude一跑还是找不到设备。这时候别急着折腾芯片先按这个顺序排查。第一换USB口和USB线。USBasp是老式USB设备对供电和信号完整性有一定要求。前置USB口、USB HUB、延长线都可能导致枚举失败。直接插主机后面板原生USB口换一条短一点的、能传数据的USB线。很多USB线只能充电不能传数据插上去Windows有反应但设备枚举不完整这是常见坑。第二目标板暂时不要接USB线。比如给Arduino Uno烧bootloader时如果Uno自身的USB口也插着电脑板上的5V会通过VCC引脚反馈到USBasp两路电源在目标板上形成冲突轻则枚举失败重则导致芯片异常。我现在的习惯是用USBasp烧录时目标板所有外部供电全部断开只让USBasp通过ICSP的VCC供电。第三把驱动彻底卸干净重来。Windows驱动叠加冲突是这个场景里最隐蔽的问题。如果之前装过商家版驱动、又用过Zadig可能残留多个驱动。去设备管理器里把USBasp相关的设备右键卸载勾选“删除此设备的驱动程序软件”然后拔掉USBasp重新插上再用Zadig装一次基本能解决。2.3 用avrdude手动验证确认设备真的通了Arduino IDE的“烧录引导程序”按钮封装了很多细节报错信息又隐晦我建议直接跑一条avrdude命令把问题定位清楚。Arduino IDE安装目录里自带avrdude和avrdude.confWindows下通常在C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude.exe手动执行一下注意把自己机器上的路径替换掉avrdude.exe -C C:\Program Files (x86)\Arduino\hardware\tools\avr\etc\avrdude.conf -c usbasp -p m328p如果出现类似avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.00s avrdude: Device signature 0x1e950f说明USBasp驱动、PC通信、目标芯片SPI链路全部正常。看到签名0x1e950f就代表对面确实是一颗ATmega328P。如果没有任何芯片连接也能跑通avrdude但最终报找不到芯片那问题就在接线和供电跟设备识别无关。3. 接线和烧录bootloader一次过的手把手流程3.1 接线别凭感觉按信号名对号入座从这一节开始我默认你已经让电脑认出USBasp了。接下来是烧录环节最容易翻车的点接线。USBasp是2x5排针Arduino Uno板上的ICSP口是2x3排针两边物理排列不一样不能直接插。你需要用6根杜邦线把两边连起来。关键的规则是按信号名对齐不是按排针位置对齐。USBasp板上的丝印通常会标MISO、MOSI、SCK、RST、VCC、GND你只要把这几个信号一一对应到Arduino Uno ICSP口即可。对应关系如下信号USBasp端Arduino Uno ICSP端VCCVCCVCC2x3排针右上角GNDGNDGND2x3排针右下角MOSIMOSIMOSI2x3排针右侧中间MISOMISOMISO2x3排针左侧中间SCKSCKSCK2x3排针左上角RSTRSTRST2x3排针左下角注意不同商家做的USBasp排针物理顺序可能不一样但丝印基本都会标。千万不能照着网上某一张图依葫芦画瓢一定要看板子上的丝印去对应。另外如果目标是裸片Atmega328P或者自己搭的最小系统记得在芯片的VCC和GND之间加一个0.1uF退耦电容晶振和两个负载电容也要先焊好。没有晶振的话烧bootloader也能成功但Arduino Uno标准配置是外部16MHz晶振熔丝位烧错会导致时钟不对后面串口上传必出乱码或失败。提示优先用Arduino Uno板子上的ICSP接口不要去碰D10-D13那几个数字口。ICSP走的是硬SPI信号时序稳定新手不容易翻车。3.2 Arduino IDE里点一下bootloader就烧进去了接线确认无误目标板电源只由USBasp提供然后打开Arduino IDE按这个流程操作工具 - 开发板 - Arduino Uno。工具 - 处理器 - ATmega328P新版IDE有些版本不显示这一项正常默认就是。工具 - 烧录器 - USBasp。工具 - 烧录引导程序。注意第3步是关键中的关键。很多人在“烧录器”里还是默认“AVR ISP”那其实是给其他下载器用的选错了之后步骤4要么报找不到设备要么programmer不响应。选成USBasp之后点“烧录引导程序”IDE底部状态栏会出现“Burning bootloader...”的提示。烧录过程中USBasp板上的指示灯会快速闪烁目标板如果有电源灯也会亮。正常十几秒就完成状态栏提示“Done burning bootloader.”。如果这时候去跑命令会看到IDE帮你做了三件事读取芯片签名、写入bootloader hex、自动设置熔丝位最后再校验一遍。Arduino IDE 2.x版本界面有点变化但入口逻辑一样在左侧栏切到开发板管理然后在工具菜单里找烧录器和烧录引导程序即可。3.3 烧完怎么验证用串口上传一次Blink最直接烧录bootloader是否成功最好的验证方式就是走一遍正常的USB串口上传流程。把USBasp从目标板上拔下来目标板的USB口插回电脑打开Arduino IDE工具-开发板选Arduino Uno工具-端口选目标板对应的COM口然后打开示例Blink点上传。如果串口上传顺利板载的L灯开始一秒闪一次就说明bootloader已经生效芯片也完全恢复成一块标准Arduino Uno了。我习惯再补一个验证上传时不插USBasp说明整个烧录链路不再依赖ISP如果这一步能成那这颗328P就是真正“救活”了。3.4 熔丝位和bootloader烧录背后到底发生了什么Arduino IDE的“烧录引导程序”不是简单地把一个hex文件写进去它还会顺带写好熔丝位。熔丝位是AVR芯片里一组硬件配置位相当于芯片的“BIOS设置”决定时钟源、复位脚功能、Boot区大小、BOD电压检测等。Arduino Uno标准配置下Atmega328P的熔丝位一般是LFUSE0xFF、HFUSE0xDE、EFUSE0xFD。这一组值的意思是外部晶振作为时钟源、Boot区占用8KB、保留复位脚功能、开启掉电检测等。Arduino IDE在烧录bootloader时会自动计算并写入这些值所以你根本不需要手动去记。最危险的操作就是自己用软件手动改熔丝位。一旦把RSTDISBL熔丝置位芯片的复位脚会被当成普通IOISP端口被封印之后USBasp根本连不上芯片只能靠高压编程器才能解锁。所以我强烈建议不是特别清楚自己在干嘛的情况下永远不要手动去动熔丝位。4. 常见报错逐条拆解avrdude英文到底在说什么4.1 could not find USB deviceUSBasp没被电脑看见报错信息长这样avrdude: error: could not find USB device with vid0x16c0 pid0x05dc这问题最粗暴直白avrdude在USB总线里没找到USBasp。先查驱动Zadig重装一次。再查设备管理器如果设备管理器里压根没有USBasp说明USB枚举失败换USB口、换数据线。如果设备管理器里有但依然报这个错可能是IDE的avrdude版本太老不认识你装的WinUSB驱动建议把烧录器选成“USBasp”而不是“USBtinyISP”并且确认avrdude.conf里的usbasp配置存在。4.2 program enable: target doesnt answer芯片不响应这句话是烧录过程中的经典杀手avrdude: error: program enable: target doesnt answer. 1意思是USBasp和电脑之间没问题但目标芯片没回应ISP握手信号。优先排查接线尤其是RESET这一根。很多板上其他外设会把RST拉低比如没断电的扩展板、电容残留电荷都会导致芯片无法进入ISP编程模式。目标板断电断开所有外设只留ICSP这6根线。再查供电。如果USBasp的VCC没有接到目标板VCC芯片根本没上电自然不响应。如果目标是独立的裸芯片别忘给VCC加退耦电容。还有个容易被忽略的情况芯片的RSTDISBL熔丝已经被设置过了ISP接口被禁用。这种情况USBasp再怎么折腾都没用只能上高压编程器或者直接换芯片。4.3 stk500_recv(): programmer is not responding选错烧录器的典型症状出错现场avrdude: stk500_recv(): programmer is not responding这句话一出现基本可以断定你的Programmer选错了。比如选了“Arduino as ISP”却插着USBasp或者选了“AVR ISP”但连线方式不是对应的。在Arduino IDE里工具-烧录器明确选USBasp再点烧录引导程序百分之九十九能绕过这个报错。如果Programmer没错但依然报这个还有一种可能是芯片没bootloader时你在用串口上传程序串口端根本没有ISP握手程序在响应。这也解释了为什么空白芯片必须先用USBasp烧bootloader。4.4 烧到一半校验失败接触不良是最常见元凶如果烧录过程能开始但写到一半报校验不一致、读不出来别怀疑芯片先怀疑物理连接。杜邦线是元凶。弹簧母头用久了会撑大接触电阻变大SPI通信在高速下就出错。换一条短的杜邦线插紧一点问题直接消失。另外如果USBasp板上丝印有跳线帽控制SCK速度遇到不稳定可以先拔掉跳线帽让SCK降到慢速模式牺牲一点速度换稳定。4.5 常见故障速查表整理一个速查表方便现场排查现象直接原因优先排查动作Windows感叹号驱动未装/签名拦截Zadig重装libusb-win32could not find USB deviceUSB枚举失败/选错烧录器换USB口/线检查烧录器选择program enable target not answer接线错/芯片没供电/RST被拉低检查六根线拔外设确认VCCstk500_recv not responding选错Programmer或芯片没bootloader把烧录器换成USBasp校验失败/半路卡住杜邦线接触不良/SCK太快换短线、拔跳线帽慢速签名全是0x000000芯片没进入ISP模式查RESET连线、VCC供电、晶振电路5. USBasp都救不回来用另一块Arduino当ISP5.1 ArduinoISP一块Uno也能当烧录器有时候USBasp本身有问题或者操作时驱动反复出怪事那也别急着放弃。只要手头还有一块正常的Arduino Uno就能把它当成一台ISP烧录器走一条完全不同的路径。Arduino IDE里自带一个示例叫ArduinoISP打开它把这块正常的Arduino Uno当普通板子通过USB口上传ArduinoISP程序。上传完成后把它当成烧录器接线方式如下Arduino Uno引脚目标芯片ATmega328P引脚D10RSTD11MOSID12MISOD13SCK5VVCCGNDGND注意这个接线表和USBasp那一套不一样D10对应RST千万别搞混。目标芯片放在面包板上接好晶振和电容共地共电源。Arduino IDE里工具-烧录器选“Arduino as ISP”然后点“烧录引导程序”。ArduinoISP的SCK默认有点快如果目标芯片熔丝还是内部RC时钟或者晶振没起振可能烧不进去。可以把示例里对SPI时钟的设置改慢或者直接给目标芯片加一个外部16MHz晶振。我给裸片烧bootloader时通常直接用外部晶振成功率最高。5.2 真锁死了怎么办如果确认RSTDISBL已经被设置ISP通道彻底关闭那USBasp和ArduinoISP都无能为力。这种情况只能靠高压编程器并行高压编程器HVPP可以解锁所有AVR芯片但普通爱好者手头基本没有这种设备。我的建议是直接换一颗新Atmega328P一颗芯片没多少钱摔一次跤买个教训比折腾高压编程器划算得多。后面每次烧录都老老实实走标准流程、不碰RSTDISBL基本不会再遇到这种事。最后再分享一个小经验玩AVR烧录这个事设备越便宜越容易踩暗坑。我手上这块USBasp用了好几年中间被孩子摔过外壳照样稳定。问题往往出在那些没有丝印标注、外壳封装得严严实实、连芯片型号都看不清的低价板子上。买的时候尽量选板子丝印完整、有跳线帽能切换SCK速度的版本能少很多麻烦。还有一点大面积排查问题时如果驱动重装了好几遍、线也换了好几条、接线也对了好几轮仍然不行把电脑重启一次。Windows对USB设备的枚举缓存有时会卡死重启之后莫名其妙就好了这毛病我遇到不止一次。希望这篇能让你少走几步弯路。烧好bootloader之后板子就真正变成一块满血Arduino Uno了后面驱动数码管、控制舵机、做智能小车都从这一步开始。
返回列表