大家好,我是电源漫谈,在MCU使用过程中,编程失败不可避免的会发生。有时甚至在与微控制器的通信开始之前就可能发生错误。当一个工具错误显示,有一些可能的事情可以去尝试。首先,重试该操作以验证这不是一次性故障。如果问题仍然存在,请尝试重新启动 MPLAB X IDE/IPE。在某些情况下,由于在这个故障背后发生线程/进程崩溃,需要完全重新启动计算机。
接下来,检查器件文件包(DFP)、工具包和 MPLAB X 插件的更新。 DFP 和工具包更新可以从工具 → 包访问,如图1所示,而 MPLAB X IDE 插件更新可以通过从工具 → 插件访问,如图3所示。
图1 DFP查看访问路径
在图一所示菜单打开之后,可到如下图2所示页面,这里可以下载更新相应器件或者工具的DFP不同版本。
图2 器件DFP和工具DFP访问查看路径
图3 插件访问更新页面
注意,新项目会默认安装最新的工具包版本。然而,在项目属性→<编程器/调试器>→工具包选择,可以设置具体版本,如图4所示,仅当最新版本存在已知问题时才需要执行此操作。最后,在极少数情况下,可能需要升级新版本的 IDE/IPE 或编译器安装。注意: 对于 DFP版本 或编译器版本更改,必须在“项目”属性下选择更新的版本。
图4 工具DFP设置位置
这里以PICkit4为例说明,可以看到在项目属性中的PICkit4选项下,可以更新项目工程使用的工具Tool Pack.
图5 默认情况下工具Pack选项
默认情况下,新建工程都是以最新的工具Pack有效,但是必要时,可以选择指定的工具Pack,如图6所示。
图6 指定相应版本的工具Pack
图7 选择项目工程对应的编译器和器件DFP
如上图,在实际的项目工程中,需要选择相应的器件DFP和你所希望的编译器版本,这里笔者只安装了XC16 2.0版本编译器。
目标电压没有检测到,也是一个常见的错误,该错误信息表明编程器没有检测到微控制器电源电压。但是编程时,微控制器必须通电, 且编程器和开发板之间的地必须连接。可以使用编程器给板子供电,但输出能力有限,这必须在编程器设置中使能。如图8-2,8-3所示,如果编程器未启用自供电,编程器将仅尝试检测板上的电源。有时,有故障的USB 集线器可能会暂时断开编程器/调试器的连接,从而导致行为异常。
图8-1 外部供电编程形式
一般来说,只有三条线处于活动状态并且与内核调试器操作相关:引脚 1 (VPP/MCLR)、
5 (PGC) 和 4(PGD)。为了完整起见,引脚 2 (VDD) 和 3 (VSS) 也标了出来。MPLAB PICkit 4 有两种为目标器件供电的配置:内部调试器电源和外部目标板电源。建议使用外部电源并给到目标电路应用(见图8-1)。在这个配置中,目标 VDD 由调试器监测,如果调试器无法检测其 VDD (接口连接器的引脚 2)上的电压,则MCU不会运行。
图8 -2使能工具供电选项1
图8-3 使能工具供电选项2
目标板采用PICkit4供电的方式下,其供电能力有限,仅仅有50mA,如图8-4所示。
图8-4 目标板采用自供电形式
并非所有器件都有 AVDD 和 AVSS 端口,但如果它们存在于目标器件上,则他们都必须连接到适当的电平以便调试器运行,它们不能浮空。
此外,具有 VCAP 端口的器件(例如 PIC18FXXJ,dsPIC33EPGS等)应连接到适当的电容或电平。注意:互连非常简单。遇到的任何问题通常是由其他连接或这些关键线路上的组件会干扰 MPLAB PICkit 4 在线调试器的运行。
如果编程器未检测到器件MCU或器件 ID = 0x0000 ,或者设备ID无效(如0x0000),那么电路板上可能存在电气问题。如图10所示,正确的连接显示如图11。首先,验证编程器的接线是否正确,如图12所示, 并且确保从编程头到 I/O 引脚存在连续性。一个常见的ICSP问题是反转了 ICSPCLK 和 ICSPDAT 线。
另一个可能的原因是,如果在其中一条编程线上放置了电容器,尤其是MCLR 或者复位pin。这些线上的电容,可能会导致在编程中出现不期望的行为,或如果运行时电源电压(VDD)下降。
图10 IPE中典型的通信前连接错误
图11 IPE中典型的正常连接示意图
图12 工具连接到目标电路的标准电路
图12显示了 MPLAB PICkit 4 在线调试器与目标板连接,该图还显示了从连接器到目标 PCB 上的器件的接线。一个上拉电阻(通常约为 10-50 kΩ)建议从 VPP/MCLR 线连接到 VDD,以便该线可以选通为低电平以复位器件。
图13 典型的MCLR pin连接
注意在编程时,MCLR pin上尽量不要放太大容值的电容,否则可能造成编程失效,或者建议放置100pF以内的电容滤波。上图中R1用于当MCLR pin被ESD或者EOS损坏时限流,如图13,14所示。
图14 典型的MCLR引脚外围参数设置
熔丝或配置位也可能导致编程失败,例如一些AVR 器件可以选择更改UPDI 引脚行为,这会阻止正常激活用于编程的UPDI功能。相反,必须使用进入引脚的高压脉冲来激活UPDI。不是所有编程器/调试器都支持这一点;请查阅程序员文档了解更多信息指导。 最后,某些器件可以选择一次性编程(OTP),设置完成后,设备无法重新编程或与之通信,这也是可能的一个无法编程的原因,前提是芯片具有这个一次性OTP编程设置功能,如图15.
图15 dsPIC33C 芯片ICSP写抑制功能
这里需要注意在dsPIC33C系列芯片上,无法停用ICSP写禁止这个功能。相关的细节我们后续再讨论。
另外,有些器件是针对特定的供电电源范围而设计的。如果出现以下情况,可能会出现意外行为,比如专为 3.3V(LF 型号)设计的MCU使用 5V 电源供电,反之亦然。器件数据表将指定器件可使用的工作电源范围。注意, 并非所有器件系列都有特殊的 LF 变体。
此处再最后强调一下编程器和目标芯片之间的连接需要注意的问题,如图16所示。
图16 不合适的编程器外围线路器件
具体来说,必须遵循以下这些准则:
• 不要在PGC/PGD 上使用上拉电阻——它们会破坏电压电平,因为在调试器中这些线路具有可编程的下拉电阻。
• 不要在PGC/PGD 上使用电容器——它们会阻止数据和时钟线上的快速转换,在编程和调试通信中降低编程时间。
• 不要在MCLR 上使用电容器——它们会阻止VPP 快速转换。一般是一个简单的上拉电阻就足够。
• 不要在PGC/PGD 上使用二极管——众所周知,二极管只能单向导电,它们会阻止调试器和目标器件之间的双向通信。
图17 项目属性中通过工具选项配置编程器下拉和上拉电阻
通过项目属性工具选项,也可以去更改PGD,PGC上拉或者下拉电阻,以及相应的阻值,这里可以看到,最大阻值可选50kohm,而功能上可选择上拉,或者下拉,或者忽略,工程项目默认状态为下拉4.7kohm。
以上对MCU常见的编程失效问题做了一个简单总结,作为后续讨论的基础。