编程微控制器:JTAG,SPI,USB哦,我的天哪!


52

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

什么是JTAG或SPI接口?

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

Answers:


39

像arduino中那样的ATMEGA微控制器,是直接从工厂购买的,只能使用SPI或JTAG接口进行编程。

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

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

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


10
尽管在新的ATMEGA上不提供串行引导加载程序(尽管在许多其他微控制器上可以使用串行引导加载程序)是正确的,但声称必须使用SPI或JTAG的说法是不正确的。ATMEGA还支持高压并行编程模式,该模式具有超越某些熔丝设置的能力,这会使更流行的在线编程方法不可行。JTAG不是为微控制器编程而设计的,而是用于通过将值输入和输出IO引脚寄存器来测试PC板的。将其扩展用于编程或调试核心功能是后来的黑客。
克里斯·斯特拉顿

SPI和系统内编程/串行编程不同。我也已经习惯了许多较小的Atmega MCU在SPI接口上具有串行编程引脚的事实,但是我被这样的事实所困扰:在一些较大的Atmega MCU上,串行编程引脚不在SPI接口上。
电影节

30

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

有许多方法可以对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

支持者:请参阅AVRStudio工具帮助以获取MKI和MKII设备支持
支持的编程器: 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
支持的程序员: N / A

再次从技术上讲不是编程方法。引导加载程序是一个小型AVR程序,它位于常规闪存的用户可设置的保留区中。引导加载程序利用较新的AVR中提供的闪存自我修改功能,使AVR可以通过从外部源加载的程序数据对自身进行编程。引导加载程序可以从任何位置(例如,外部数据闪存或SD卡)获取数据,但是到目前为止,最常见的引导加载程序类型是通过AVR的RS-232(串行)端口与PC进行通信的。

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

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

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

支持者:大多数非TINY AVR(例外)
支持的编程器: STK500,STK600,Dragon,自制软件加密狗,AVRONE

高压并行编程是一种编程方法,由于设置麻烦而很少使用。尽管如此,HVPP编程通常用于“复活”其熔丝位通过另一种编程方法配置不正确的AVR。

STK500和Dragon均支持HVPP。在HVPP期间,目标的/ RESET引脚升高到异常高的12V值,该值与内部并行编程电路配合使用。/ RESET引脚是AVR的唯一引脚(在HVPP支持的AVR上),可以安全地升至该电平。

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

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

支持者:许多TINY AVR(例外)
支持的编程器: STK500,STK600,Dragon,自制软件加密狗,AVRONE

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

方法7:PDI

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

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

方法8:TPI

支持者: 6针TINY AVR(ATTINY10等)
支持的编程器: STK600,Dragon,AVRISP MKII

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

奖金常见问题解答部分!

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

  2. 我做了一个并行端口加密狗。我可以在AVRStudio上使用它吗?
    恐怕不是。AVRStudio不能与任何“哑”软件狗连接-它需要一个智能编程设备-本身包含一个微控制器-才能解密它发送的通信协议。没有微控制器的简单加密狗必须自己进行“位撞击”(即通过加密狗模拟的适当信号)。

  3. 那我的加密狗没用了吗?
    不能。您仍然可以使用第三方编程软件工具通过家用加密狗进行编程。AVRDude是一个很好的,已知的免费命令行实用程序-它随WinAVR软件包一起提供。

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

  5. 好的,我想使用引导加载程序。我该如何首先获得它?
    要在AVR中使用引导加载程序,首先必须对引导加载程序进行编程。如果您没有现有的编程器(即使是简单的笨拙的加密狗也足以满足初始编程要求),则可以购买使用AVR预先编程的AVR。多个供应商提供的引导程序。
    Atmel还生产Butterfly演示板,其MEGA169 AVR预先装有AVR-Studio兼容的引导程序。

  6. 救命!使用ISP时,我搞砸了保险丝,k了我的AVR! 最常见的错误是将时钟选择保险丝更改为无效设置。尝试在AVR的XTAL1引脚上放置一个外部时钟,看看是否有帮助。
    如果失败,请使用高压方法之一。这些将解决所有错误配置,包括那些涉及时钟源的错误配置,因为高压方法会将自己的时钟提供给AVR进行编程。

  7. 我该如何与我的程序员互动?
    用于与编程器接口的软件取决于您使用的编程器类型。
    简单的“哑”软件狗需要第三方软件,例如PonyProg或AVRDude。这些可能是命令行或GUI工具-在网上四处浏览,您会发现其中一种适合您的需求。
    可以在AVRStudio中使用基于AVR910协议的编程器和引导程序。从“工具”菜单中,选择“ AVRProg”选项,以打开GUI屏幕以与您的编程器进行交互。另外,第三方工具(如AVRDude)也兼容AVR910。
    官方工具已紧密集成到AVRStudio中,尤其是在调试版本(JTAG / Dragon / etc)的情况下。从AVRStudio工具菜单中,选择“程序AVR ...”子菜单,然后单击“连接”项。在新窗口中,选择您的工具及其连接界面,然后单击确定。
    与傻瓜加密狗和AVR910编程器一样,官方工具也可以与第三方编程软件一起使用。

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

转载事先明确同意,当然!


5

我想在讨论中再增加一件事。

SPI是芯片非常常见的接口。对3线的暗示是SPI的模式,在该模式下您不使用芯片的选择引脚。

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

在教学时,我考虑了有关接口的教学,这是最重要的任务之一。

社区维基可用于那些希望扩展我的信息的人。


2
我从来没有听说过I2C被用作微控制器上的本机闪存编程接口,尽管没有理由不能成为我认为的引导加载程序的入口点……
vicatcu 2010年

@vicatcu,我只是将其添加为非常常见的界面。
Kortuk

3

从总体上看,这些接口仅在哪些程序员和哪些微控制器支持它们方面有所不同。只要您在编程器和微控制器之间具有匹配性,我就不会担心。

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

一些接口(包括JTAG)允许调试设备-但是您需要一个也支持此功能的程序员(和驱动它的软件)。在上一个问题中,我曾针对Dragon调试AVR设备进行了指点-我打算在我当前的一轮项目接近完成时开始使用它。


2

正如您提到的串行,SPI(2线,3线?),USB,JTAG,SWD等都被使用。

是的,有优点也有缺点。例如,对于我所知的所有有关硬件内置Jtag的情况,最初都是将Jtag用于处理器调试以外的其他用途,但他们碰巧也将其用于硬件。如果有jtag,则通常是最好的接口,但是有例外。例如,如果这些引脚不是专用于jtag的,则您可能在代码中存在错误,并且/或者有意将这些引脚之一用于其他用途,从而使得无法使用jtag来访问芯片(如果它在闪存中引导该软件,重新设置这些引脚的用途)。另一个例外是如果处理器内核可以被闪存中软件中的错误挂起,并且挂起的内核无法通过jtag进行调试。我将其称为硬件设计中的错误,但最近在商业方面已对此进行了处理。

例如在AVR上的PDI,我认为人们可能在这里称呼spi,也许不是。至少在xmega上,pdi和外部jtag会在内部馈入通用的pdi接口。因此,pdi引脚使您可以直接访问此端口,而不是jtag开销。只要该接口在Flash中的软件已成为核心时起作用,那么它将是该系列的理想接口。该协议已发布且相对简单,并内置于硬件中。它确实具有双向数据总线(如i2c)的缺点。

Arm的jtag带有较少的称为swd的导线,因此不一定要公开发布。开源工具正在实现它。从理论上讲,这是一个串行jtag,不同的jtag信号以某种方式在一条线上顺序发送,而不是在多条线上并行发送。在部件内部,我认为它会再次并行化并提供正常的jtag逻辑。这有一个缺点,即ARM希望将其保留为半秘密,而ARM的jtag调试器无论如何都很难使用。所以这是很多工作。如果/当openocd使它起作用时,则可能是另一回事了。您还必须担心重新使用的引脚以及挂芯会发生什么。

许多供应商使用的解决方案中,它们具有一个或多个引导闪存区域,具体取决于拉动销钉的方式是一两个还是三个,具体取决于您从哪个闪存引导。因此,您可以从用户闪存启动,也可以从至少在出厂时具有基于串行端口的引导加载程序的闪存或具有基于USB引导加载程序的闪存启动。对于每个供应商而言,这些软件解决方案可以而且确实会有所不同,串行协议以微妙的方式变化甚至超过微妙的方式,USB解决方案也可能会发生很大变化。好的和坏的是,您可以使用其中的某些闪存,因此您可以选择更改串行引导加载程序,这既有好处,也有坏处,好处是您可以选择根据产品对其进行自定义,但有可能以意外擦除它并砌成零件,至少为该接口砌成该零件。

Jtag工具过去要花费数千美元,而现在却不用了,大约15美元就可以得到一个ftdi突破板,并用openocd对其进行调整。只需花费$ 50,您就可以获得基于ftdi的usb解决方案,该解决方案可与openocd一起使用。您可以获得$ 75- $ 80美元的非商业性j-link。然后是几千美元的快速,确定但不值得的钱。当您是一家拥有大量现金并希望支付支持费用的大型公司时,您就可以购买这些产品。当您支付这些价格时,您将获得所需的产品,并且您会立即获得技术支持问题的答案。就像免费的Linux vs Windows或RHEL这样,Linux支持是免费的,但是您得到的就是所得到的。无论如何,这会使jtag更具吸引力,

您应该在负担得起的时间和地点使用调试和开发武库jtag工具。sparkfun具有基于ftdi的usb到串行板,并且ftdi部件可重新用于大型保险杠,您可以将它们用于spi或i2c或pdi或jtag或其他接口。理想情况下,为您感兴趣的总线/零件制造电路板,并使用其随附的免费/开源软件。还要使用这些串行板,理想情况下应具有3.3V和5V的电源(每个lillypads和arduino mini等所用的电压约为15美元),用于连接具有某种串行协议的各种微型计算机的串行端口。我发现根据这些协议编写自己的加载器会更容易,尤其是像arduino / avr这样的人,他们会发布引导加载程序源,并且是他们支持的假定标准的相当大的子集。YMMV。

简而言之,没有一个好的解决方案,它们各有利弊。准备支持其中至少两个。usb和serial或usb和jtag或jtag和serial等。只需在板上放下焊盘或针孔即可,不一定要填充。对于您的个人或实验室开发,请使用一整套工具,并准备好在切块并恢复板时或在开发自己的引导程序,USB固件等时从一种切换到另一种。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.