编程微控制器:JTAG、SPI、USB 哦,我的!?

电器工程 微控制器 spi 编程 标记
2022-01-02 02:50:56

我注意到,关于微控制器,有几种编程方法。我对 USB 有点熟悉,因为我的 Arduino 可以通过 USB 进行编程。

什么是 JTAG 或 SPI 接口?

最终我知道这些接口提供了一种用新指令刷新芯片的方法,但它们有什么不同呢?一个比另一个有什么优势吗?

4个回答

ATMEGA 微控制器(如 arduino 中的那种直接从工厂出厂的微控制器)只能使用 SPI 或 JTAG 接口进行编程。

SPI代表串行外设接口,是微控制器相互或与外界通信的一种方式。它有时也称为 3 线,因为它使用三根线进行通信。要对芯片进行编程,您需要一个特殊的编程器,该编程器从 USB 读取命令以驱动 SPI 线对芯片进行编程。一个流行的似乎是来自 Adafruit 的 USBTinyISPSparkFun对 SPI 编程进行了很好的介绍. 最流行的 Atmel AVR 芯片编程应用程序是 avrdude(cmd 行)、ponyprog(不适用于较新的程序员)以及在某些情况下 AVR Studio(如果您的程序员支持的话)。SPI 编程的优势在于您可以直接从工厂对任何 Atmel 芯片进行编程,因此您的项目中并不总是需要 Arduino。

SPI 是“另一种”串行协议,而JTAG是专门设计用于编程和调试微控制器的协议。并非所有 Atmel micro 都支持 JTAG,但 Arduino 中使用的支持 JTAG。JTAG 协议可用于“电路仿真”和调试等很酷的事情,这意味着它使您能够在微控制器实际运行时查看程序的状态。为此,您需要一个特殊的程序员。看到我对另一个问题的回答。

要使用 USB 对芯片进行编程,您必须首先使用 SPI 或 JTAG 使用“引导加载程序”对其进行编程。一旦加载了引导加载程序,系统就可以在任何使用 USB 串行转换器的 PC 上进行编程。缺点是引导加载程序占用了一些内存空间,并且这种方法不允许您在运行时查看芯片的状态。

虽然我很想深入研究可用的各种编程方法,但其他人已经有了。这是Dean Camera关于 AVRFreaks, AVR Programming Methods的教程:

有很多方法可以对 AVR 微控制器进行编程。由于很多人一次或多次询问不同的问题,我想我会在这里概述它们,以便他们的问题可以快速有效地得到回答。如果我错过了一个方法或犯了错误,请原谅我。

方法 1:在系统编程 (ISP)

支持者:绝大多数 AVR(见下文)
支持的程序员: AVRISP MKI/II、JTAG MKII、STK500、STK600、Dragon、AVRISP 克隆、AVR910 程序员、AVRONE

在系统编程中,可能是对整个 AVR 线路的闪存、EEPROM、熔丝和锁定字节进行编程的最常用方法。ISP 可以以极高的时钟速率对 AVR 进行编程(假设目标 AVR 以高频率运行并且程序员支持它)并且是几乎所有 AVR 爱好者的首选方法。市场上有许多 AVRISP 克隆和 AVR910 编程器,除了连接到计算机并行端口的简单的自己动手做的加密狗。

最近的新加密狗设计可能会使用计算机的串行端口,但传闻证据表明,由于技术限制,这种方法非常缓慢。

ISP 要求目标 AVR 以至少四倍于 ISP 时钟的时钟速率运行。这是一个常见的陷阱,也是许多 AVR 新手困惑的根源。

方法 2:JTAG

支持者:有关 MKI 和 MKII 器件支持,请参阅 AVRStudio 工具帮助
支持的编程器: JTAG-ICE、JTAG-ICE MKII、Dragon、JTAG-ICE 克隆、AVRONE、STK600(仅编程)

从技术上讲,JTAG 是一种调试系统,而不是一种编程方法。尽管如此,JTAG 接口仍允许对支持它的 AVR 进行编程。

JTAG 是一种系统内调试工具,允许您在支持的 AVR 在电路中运行时操作和检查其状态。JTAG 允许用户随时停止执行、对 AVR 内部寄存器的操作等等。

来自 ATMEL 的官方 JTAG-ICE 单元已被 JTAG-ICE MKII 取代,它支持 AVR 系列 DebugWire 调试协议以及通过 ISP 方法(见上文)进行编程的更新和更广泛的支持。

JTAG-ICE 克隆价格低廉,但它们仅与少数 AVR 的有限兼容性限制了它们的实用性。无论如何,如果您的 AVR 支持 JTAG 接口,那么 JTAG-ICE 仍然是一种非常好的和有效的调试方法和编程器。

方法 3:调试线

支持者:许多较小的 AVR
支持的程序员: JTAG-ICE MKII、Dragon、AVRONE

再次,DebugWire 是一个调试而不是编程接口,但可用于将程序加载到支持的 AVR 中。dW 接口使用单个 AVR 引脚(/RESET 线)进行所有通信,使其成为低引脚数 AVR 设备的理想选择。

方法 4:引导加载程序

支持者:大多数较新的 AVR
支持的程序员:不适用

同样在技术上不是一种编程方法。引导加载程序是一个小型 AVR 程序,位于常规闪存的用户可设置保留部分。引导加载程序利用较新的 AVR 中可用的闪存自修改功能,允许 AVR 通过从外部源加载的程序数据自行编程。引导加载程序可以从任何位置(例如外部数据闪存或 SD 卡)获取数据,但目前最常见的引导加载程序类型通过 AVR 的 RS-232(串行)端口与 PC 通信。

引导加载程序受到限制,因为它们确实会消耗闪存空间(限制可用于 AVR 应用程序的闪存大小)并且它们无法更改 AVR 熔丝位。

引导加载程序可以在互联网上广泛下载,但它们存在“鸡与蛋”的问题;您首先需要此处列出的另一种类型的程序员在引导加载程序中进行编程。这通常通过构建一个简单的并行端口加密狗(参见 ISP 部分)或通过购买已经预装了引导加载程序的 AVR(例如 AVRButterfly 板)来解决。

方法 5:高压并行编程 (HVPP)

支持者:大多数非 TINY AVR(有例外)
支持的程序员: STK500、STK600、Dragon、Homebrew Dongles、AVRONE

高压并行编程是一种很少使用的编程方法,因为它需要设置麻烦。尽管如此,HVPP 编程通常用于“复活”其熔丝位已通过另一种编程方法错误配置的 AVR。

STK500 和 Dragon 都支持 HVPP。在 HVPP 期间,目标的 /RESET 引脚升高到 12V 的异常高值,这与内部并行编程电路接合。/RESET 引脚是 AVR 的唯一引脚(在支持 HVPP 的 AVR 上),可以安全地提升到此级别。

您可以使用此类在线计划制作自己的 HVPP 加密狗。

方法 6:高压串行编程 (HVSP)

支持者:许多 TINY AVR(有例外)
支持的程序员: STK500、STK600、Dragon、Homebrew Dongles、AVRONE

HVSP 类似于 HVPP,不同之处在于数据传输是串行执行的,而不是并行执行的。这是许多 TINY 系列 AVR 使用的替代编程方法,这些 AVR 缺少足够的 HVPP 引脚。

方法 7:PDI

支持者: XMEGA AVR
支持的编程器: STK600、AVRONE、JTAG MKII、Dragon、AVRISP MKII

PDI 是基于 debugWire 协议的新编程接口,适用于 XMEGA 系列 AVR。它目前未用于任何其他 8 位 AVR 微控制器。

方法 8:TPI

支持: 6-Pin TINY AVR(ATTINY10 等)
支持的编程器: STK600、Dragon、AVRISP MKII

TPI 是一个非常小的编程接口,适用于具有有限引脚的较新 TINY 系列 AVR,例如 6 引脚 ATTINY10。与 dW 一样,TPI 使用设备的 /RESET 线作为通信接口的一部分,但相似之处到此为止。由于小尺寸的 TINY AVR 缺少片上调试电路,因此 TPI 协议在半双工协议中使用了新的三引脚编程接口。由于在设置设备的RSTDSB 引脚时需要将/RESET 线升至+12V 进行编程,因此目前只有较新的STK600 编程板支持。

奖金常见问题解答部分!

  1. 哪种方法最好?
    没有通用的“最佳”方法。ISP 编程简单且非常流行,但是上述所有方法都可以使用。两种高压编程模式(以适用于您的设备为准)功能最丰富,因为它们允许修复保险丝配置错误的 AVR。但是,这些方法设置起来很麻烦,因此大多数用户使用 ISP 的原因。

  2. 我做了一个并口加密狗。我可以将它与 AVRStudio 一起使用吗?
    恐怕不是。AVRStudio 无法与任何“愚蠢”的加密狗接口——它需要一个智能编程设备——本身包含一个微控制器——来破译它发送的通信协议。没有微控制器的简单加密狗本身必须是“bit-banged”(即通过计算机通过加密狗模拟的适当信号)。

  3. 那么我的加密狗没用了?
    不可以。您仍然可以使用第三方编程软件工具通过自制加密狗进行编程。AVRDude 是一个很好的、众所周知的免费命令行实用程序 - 它包含在 WinAVR 包中。

  4. 如果我希望我的程序员使用 AVRStudio,我有哪些选择?
    选择使用 AVRStudio 支持的协议的程序员。这可以是简单的“AVR910”协议(已弃用)或 STK500/AVRISP 使用的协议的自定义实现。请注意,这些程序员需要在其中使用微控制器,从而导致 catch-22 情况。这可以通过在购买时使用适当的固件对编程器的 AVR 进行预编程,或者使用引导加载程序对 AVR 进行预编程来解决。

  5. 好的,我想使用引导加载程序。我如何首先将它放在那里?!
    要在 AVR 中使用引导加载程序,您首先必须对引导加载程序进行编程。如果您没有现有的编程器(即使是一个简单的傻瓜加密狗也足以进行初始编程),您也可以购买预编程的 AVR来自多家供应商的引导加载程序。
    Atmel 还生产 Butterfly 演示板,其 MEGA169 AVR 预装了与 AVR-Studio 兼容的引导加载程序。

  6. 帮助!我在使用 ISP 时弄乱了保险丝并弄坏了我的 AVR! 最常见的错误是将时钟选择熔断器更改为无效设置。尝试在 AVR 的 XTAL1 引脚上放置一个外部时钟,看看是否有帮助。
    做不到这一点,如果可能的话,使用一种高压方法。这些将修复任何错误配置,包括涉及时钟源的错误配置,因为高压方法为 AVR 提供了自己的时钟以进行编程。

  7. 如何与我的程序员交互?
    您使用哪种软件与程序员交互取决于您使用的程序员类型。
    简单的“哑”加密狗需要第三方软件,例如 PonyProg 或 AVRDude。这些可能是命令行或 GUI 工具——在网上四处看看,你会找到适合你需要的。
    基于 AVR910 协议的编程器和引导加载程序可在 AVRStudio 中使用。从“工具”菜单中,选择“AVRProg”选项以打开 GUI 屏幕以与您的程序员交互。作为替代方案,AVRDude 等第三方工具也与 AVR910 兼容。
    官方工具紧密集成到 AVRStudio 中,尤其是在调试变体(JTAG/Dragon/等)的情况下。从 AVRStudio 工具菜单中,选择“Program AVR...”子菜单并单击“连接”项。在新窗口中,选择您的工具及其连接界面,然后单击确定。
    与哑加密狗和 AVR910 编程器一样,官方工具也可以与第三方编程软件一起使用。

(C) Dean Camera, 2009。保留所有权利。未经事先明确许可,不得在 AVRFreaks.net 以外的任何网站上复制。

当然,在事先明确许可的情况下转载!

我想在讨论中再补充一件事。

SPI是芯片非常常用的接口。3线的典故是不使用芯片选择引脚的SPI模式。

I2C 是接口的主要竞争,因为无论芯片数量如何,它都只使用 2 线,而 SPI 需要每个接口另一条线,但速度较慢。

在教学时,我认为有关接口的教学是最重要的任务之一。

社区 wiki 可供那些想要扩展我的信息的人使用。

从整体的角度来看,这些接口的不同之处仅在于哪些程序员和哪些微控制器支持它们。只要你有程序员和微控制器之间的匹配,我就不会担心。

随着您深入了解它,您会发现接口在微控制器上使用的引脚更重要 - 如果您将这些引脚用于传感器,那么当您对设备进行编程时,信号可能会干扰。如果这是一个问题,最简单的解决方案是在编程期间断开传感器。

一些接口(包括 JTAG)允许调试设备 - 但您需要一个也支持此功能的编程器(和驱动它的软件)。之前的一个问题中,我被指向了用于调试 AVR 设备的 Dragon——我打算在当前一轮项目接近完成时获得一个并玩。