マイクロコントローラのプログラミング:JTAG、SPI、USB Oh my !?


52

マイクロコントローラに関して、それらをプログラムする方法がいくつかあることに気付きました。ArduinoはUSBを介してプログラムできるので、私はUSBに精通しています。

JTAGまたはSPIインターフェースとは何ですか?

最終的に、これらのインターフェイスは新しい命令でチップをフラッシュする手段を提供することを知っていますが、どのように違いますか?あるものに別の利点があるのでしょうか?

回答:


39

工場から直接出荷されるarduinoのようなATMEGAマイクロコントローラーは、SPIまたはJTAGインターフェースを使用してのみプログラムできます。

SPIはSerial Peripheral Interfaceの略で、マイクロコントローラが相互に、または外部と通信するための方法です。通信に3本のワイヤを使用するため、3ワイヤとも呼ばれます。チップをプログラムするには、USBからコマンドを読み取り、SPIラインを駆動してチップをプログラムする特別なプログラマーが必要です。人気のあるものは、AdafruitUSBTinyISPのようです。SPIプログラミングの非常に優れた紹介はSparkFunにあります。Atmel AVRチップをプログラミングするための最も一般的なアプリケーションは、avrdude(cmdライン)、ponyprog(新しいプログラマーでは動作しません)、そして場合によってはAVR Studio(プログラマーがサポートしている場合)です。SPIプログラミングの利点は、工場から直接Atmelチップをプログラムできるため、プロジェクトにArduinoが必ずしも必要ないことです。

SPIが「もう1つの」シリアルプロトコルである場合、JTAGはマイクロコントローラーのプログラミングとデバッグ用に特に設計されたプロトコルです。すべてのAtmel microがJTAGをサポートしているわけではありませんが、Arduinoで使用されているものはサポートしています。JTAGプロトコルは、「インサーキットエミュレーション」やデバッグなどのクールなものに使用できます。つまり、実際に実行中のマイクロコントローラーでプログラムの状態を確認できます。これを行うには、特別なプログラマーが必要です。別の質問に対する私の答えを見ました。

USBを使用してチップをプログラムするには、最初にSPIまたはJTAGを使用して「ブートローダー」でプログラムする必要があります。ブートローダーをロードすると、システムはUSBシリアルコンバーターを使用して任意のPCからプログラム可能になります。欠点は、ブートローダーがメモリ領域を占有し、この方法ではチップの実行中にチップの状態を確認できないことです。


10
シリアルブートローダーは新しいATMEGAでは使用できないという考え方は正確ですが(他の多くのマイクロコントローラーでは使用できますが)、SPIまたはJTAGを使用する必要があるという主張は間違っています。ATMEGAは、高電圧の並列プログラミングモードもサポートしています。これは、より一般的なインサーキットプログラミング方法を実行できないヒューズ設定を上書きする機能を備えています。JTAGは、マイクロのプログラミング用ではなく、IOピンレジスタに値を入力および出力することにより、PCボードをテストするために設計されました。プログラミングやコア機能のデバッグのために拡張することは、後のハックでした。
クリスストラットン

SPIとインシステムプログラミング/シリアルプログラミングは異なります。私も小さなAtmega MCUの多くがSPIインターフェースにシリアルプログラミングピンを持っているという事実に慣れていましたが、大きなAtmega MCUのいくつかではシリアルプログラミングピンがSPIインターフェースにないという事実に噛まれました。
フェスト

30

利用可能なさまざまなプログラミング方法に飛び込みたいのですが、他の誰かがすでに持っています。ここでディーンカメラ AVRFreaks上のチュートリアル、AVRのプログラミング方法は

AVRマイクロコントローラーをプログラムするには多くの方法があります。多くの人がさまざまな質問を一度に行うので、質問にすばやく効率的に答えられるように、ここでそれらの概要を説明すると思いました。メソッドを見逃したり、エラーを犯した場合はご容赦ください。

方法1:システムプログラミング(ISP)で

サポート対象: AVRの大部分(以下の投稿を参照)
サポートされているプログラマ: AVRISP MKI / II、JTAG MKII、STK500、STK600、ドラゴン、AVRISPクローン、AVR910プログラマ、AVRONE

システムプログラミングでは、おそらくAVRライン全体のフラッシュ、EEPROM、ヒューズ、およびロックバイトをプログラミングする最も一般的な方法です。ISPは、非常に高いクロックレートでAVRをプログラミングでき(ターゲットAVRが高周波数で実行され、プログラマがサポートしていると仮定)、ほとんどすべてのAVR愛好家が選択する方法です。市場には、コンピューターのパラレルポートに接続する簡単なDIYドングルに加えて、多くのAVRISPクローンとAVR910プログラマーが市場に出ています。

最近の新しいドングル設計ではコンピューターのシリアルポートを使用する場合がありますが、技術的な制限によりこの方法は非常に遅いという事例証拠があります。

ISPでは、ターゲットAVRがISPクロックの少なくとも4倍のクロックレートで動作している必要があります。これはよくある落とし穴であり、AVRを初めて使用する多くの人にとって混乱の原因です。

方法2:JTAG

:によってサポートされて MKIとMKIIデバイスのサポートを参照AVRStudioツールのヘルプ
サポートされているプログラマ: JTAG-ICE、JTAG-ICEのMKII、ドラゴン、JTAG-ICEのクローン、AVRONE、STK600(のみプログラミング)

技術的には、JTAGはデバッグシステムであり、プログラミング方法ではありません。それでも、JTAGインターフェースはそれをサポートするAVRのプログラミングを可能にします。

JTAGはインサーキットデバッグツールであり、サポートされているAVRが回線で実行されているときに、そのステータスを操作および検査できます。JTAGを使用すると、ユーザーはいつでも実行を停止したり、AVRの内部レジスタの操作などを行うことができます。

ATMELの公式JTAG-ICEユニットはJTAG-ICE MKIIに取って代わられました。JTAG-ICEMKIIは、AVR範囲のDebugWireデバッグプロトコルとISPメソッドによるプログラミングをサポートします(上記参照)。

JTAG-ICEクローンは低価格で入手できますが、ほんの一握りのAVRとの限られた互換性が有用性を制限します。これに関係なく、AVRがJTAGインターフェイスをサポートしている場合、JTAG-ICEは非常に優れた効果的なデバッグ方法およびプログラマーのままです。

方法3:DebugWire

サポート対象:多くの小規模な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セクションを参照)またはブートローダー(AVRButterflyボードなど)がプリロードされたAVRの購入によって解決されます。

方法5:高電圧並列プログラミング(HVPP)

サポート対象:ほとんどの非TINY AVR(例外を含む)
サポート対象プログラマ: STK500、STK600、ドラゴン、Homebrew Dongles、AVRONE

高電圧並列プログラミングは、セットアップに手間がかかるため、めったに使用されないプログラミング方法です。それにもかかわらず、HVPPプログラミングは一般に、ヒューズビットが別のプログラミング方法で誤って設定されたAVRを「復活」させるために使用されます。

STK500とDragonはどちらもHVPPをサポートしています。HVPP中、ターゲットの/ RESETピンが異常に高い値の12Vに引き上げられ、内部の並列プログラミング回路が作動します。/ RESETピンは、このレベルまで安全に上げることができるAVR(HVPPでサポートされるAVR)の唯一のピンです。

このようなオンラインプランを使用して、独自のHVPPドングルを作成できます。

方法6:高電圧シリアルプログラミング(HVSP)

サポート対象:多くのTINY AVR(例外を含む)
サポート対象プログラマ: STK500、STK600、ドラゴン、Homebrew Dongles、AVRONE

HVSPはHVPPに似ていますが、データ転送が並列ではなく連続的に実行される点が異なります。これは、HVPPに十分なピンがない多くのTINYシリーズAVRで使用される代替プログラミング方法です。

方法7:PDI

サポート対象: XMEGA AVR
サポート対象プログラマ: STK600、AVRONE、JTAG MKII、Dragon、AVRISP MKII

PDIは、AVRのXMEGAライン用のdebugWireプロトコルに基づいた新しいプログラミングインターフェイスです。現在、他の8ビットAVRマイクロコントローラーでは使用されていません。

方法8:TPI

サポート: 6ピンTINY AVR(ATTINY10など)
サポートされるプログラマ: STK600、Dragon、AVRISP MKII

TPIは、6ピンATTINY10のようなピンが限られた新しいTINYライン用の非常に小さなプログラミングインターフェイスです。dWと同様に、TPIはデバイスの/ RESET行を通信インターフェイスの一部として使用しますが、類似性は終わります。パイントサイズのTINY AVRにはオンチップデバッグ回路がないため、TPIプロトコルは半二重プロトコルで3つのピンの新しいプログラミングインターフェイスを使用します。デバイスのRSTDSBピンが設定されている場合、プログラミングのために/ RESETラインを+ 12Vに上げる必要があるため、現在、これは新しいSTK600プログラミングボードでのみサポートされています。

ボーナスFAQセクション!

  1. 最適な方法はどれですか?
    普遍的な「最良の」方法はありません。ISPプログラミングはシンプルで非常に人気がありますが、上記の方法はすべて機能します。2つの高電圧プログラミングモード(デバイスに該当する方)は、ヒューズの構成が誤っているAVRの修復を可能にするため、最も機能が豊富です。ただし、これらの方法は設定が面倒なので、ほとんどのユーザーがISPを使用する理由です。

  2. パラレルポートドングルを作成しました。AVRStudioで使用できますか?
    そうではないと思います。AVRStudioは「ダム」ドングルとインターフェースできません。送信する通信プロトコルを解読するには、マイクロコントローラー自体を含むスマートプログラミングデバイスが必要です。マイクロコントローラーのない単純なドングルは、「ビットバンギング」(つまり、コンピューター経由でドングルを介してシミュレートされる適切な信号)でなければなりません。

  3. だから私のドングルは役に立たないのですか?
    いいえ。サードパーティ製のプログラミングソフトウェアツールを使用して、自家製のドングルを介してプログラムできます。AVRDudeは、優れた既知の無料のコマンドラインユーティリティです。WinAVRパッケージに含まれています。

  4. プログラマーにAVRStudioを使用する場合のオプションは何ですか?
    AVRStudioがサポートするプロトコルを使用するプログラマーを選択してください。これは、単純な「AVR910」プロトコル(非推奨)またはSTK500 / AVRISPが使用するプロトコルのカスタム実装です。これらのプログラマーにはマイクロコントローラーが必要であり、catch-22の状況につながることに注意してください。これは、購入時にプログラマーのAVRを適切なファームウェアで事前にプログラムするか、AVRをブートローダーで事前にプログラムすることで解決できます。

  5. わかりました、ブートローダーを使いたいです。そもそもそこに入れるにはどうすればいいですか?!
    AVRでブートローダーを使用するには、最初にブートローダーをプログラムする必要があります。既存のプログラマーがいない場合(単純なダムドングルでも初期プログラミングで十分です)、代わりにプログラム済みのAVRを購入できます。複数のサプライヤーからのブートローダー。
    Atmelはまた、MEGA169 AVRにAVR-Studio互換ブートローダーがプリロードされたButterflyデモボードを製造しています。

  6. 助けて!ISPの使用中にヒューズを台無しにして、AVRをこわした! 最も一般的な間違いは、クロック選択ヒューズを無効な設定に変更することです。AVRのXTAL1ピンに外部クロックを配置してみて、それが役立つかどうかを確認してください。
    それに失敗した場合、可能であれば高電圧方式のいずれかを使用してください。これらは、高電圧方式がプログラミングのために独自のクロックをAVRに提供するため、クロックソースに関連するものを含め、あらゆる構成ミスを修正します。

  7. プログラマーとどのようにやり取りしますか?
    プログラマとのインターフェイスに使用するソフトウェアは、使用しているプログラマの種類によって異なります。
    単純な「ダム」ドングルには、PonyProgやAVRDudeなどのサードパーティソフトウェアが必要です。これらはコマンドラインツールまたはGUIツールの場合があります。Webを見て回れば、ニーズに合わせて最適なツールが見つかるでしょう。
    AVR910プロトコルに基づくプログラマーとブートローダーは、AVRStudio内で使用できます。[ツール]メニューから[AVRProg]オプションを選択して、GUI画面を開き、プログラマーとインターフェイスします。別の方法として、AVRDudeなどのサードパーティツールもAVR910と互換性があります。
    特にデバッグ版(JTAG / Dragon / etc)の場合、公式ツールはAVRStudioに緊密に統合されています。AVRStudio Toolsメニューから、「Program AVR ...」サブメニューを選択し、「Connect」アイテムをクリックします。新しいウィンドウから、ツールとその接続インターフェイスを選択し、[OK]をクリックします。
    ダムドングルやAVR910プログラマの場合と同様に、公式ツールはサードパーティのプログラミングソフトウェアでも使用できます。

(C)Dean Camera、2009。すべての権利は保護されています。事前の明示的な許可なしにAVRFreaks.net以外のWebサイトで複製することはできません。

もちろん、事前の明示的な許可を得て複製ました!


5

議論にもう1つ追加したいと思います。

SPIは、チップの非常に一般的なインターフェイスです。3線の意味は、チップの選択ピンを使用しないSPIモードです。

I2Cは、チップの数に関係なく2線のみを使用するため、インターフェイスのメインコンテストです。SPIは、インターフェイスごとに別の線を必要としますが、低速です。

教えるとき、インターフェイスについて教えることは最も重要なタスクの1つです。

私の情報を拡張したい人のために利用可能なコミュニティwiki。


2
私は理由はありませんけれども、それは私が思うブートローダ...へのエントリポイントであることができなかった、マイクロコントローラ上のネイティブのフラッシュ・プログラミング・インターフェースとして使用されているI2C聞いたことがない
vicatcu

@vicatcu、私はそれを非常に一般的なインターフェースとして追加していました。
Kortuk

3

全体的な観点から、これらのインターフェースは、どのプログラマーとどのマイクロコントローラーがそれらをサポートするかでのみ異なります。プログラマーとマイクロコントローラーが一致していれば心配ありません。

さらに詳しく説明すると、インターフェイスがマイクロコントローラーで使用するピンがより重要であることがわかります。これらのピンをセンサーに使用している場合、デバイスをプログラミングしているときに信号が干渉する可能性があります。これが問題になる場合の最も簡単な解決策は、プログラミング中にセンサーを切断することです。

一部のインターフェース(JTAGを含む)ではデバイスのデバッグが可能です-ただし、これもサポートするプログラマー(およびそれを駆動するソフトウェア)が必要です。で前の質問私はAVRデバイスをデバッグするためにドラゴンで指摘された-私は1つを取得し、再生するためにしようとするとき、プロジェクト近づく完了の私の現在のラウンド。


2

シリアルについて述べたように、spi(2線、3線?)、usb、jtag、swdなどがすべて使用されます。

はい、長所と短所があります。たとえば、Jtagはハードウェアに組み込まれていることを知っているすべてのケースで、もともと主にプロセッサデバッグ以外の目的で使用されますが、たまたまそれでも使用されています。jtagが利用可能な場合、一般的にはそのために最適なインターフェイスですが、例外もあります。たとえば、ピンがjtag専用でない場合、コードにバグがあるか、またはjtagを使用してチップにアクセスできないようにするためにそれらのピンの1つを意図的に使用する可能性があります(フラッシュでソフトウェアを起動する場合それらのピンを再利用します)。もう1つの例外は、プロセッサコアがフラッシュ内のソフトウェアのバグによってハングし、ハングしたコアがjtagを介してデバッグできない場合です。私はそれをハードウェア設計のバグと呼びますが、最近、商業的な部分でこれに対処しました。

AVRの場合、たとえばPDIは、ここでspiを呼び出すかもしれませんが、そうではないかもしれません。少なくともxmegaでは、pdiと外部jtagが内部で共通のpdiインターフェイスにフィードするように見えます。そのため、pdiピンを使用すると、jtagオーバーヘッドの代わりにこれに直接アクセスできます。フラッシュ内のソフトウェアがコアをハングさせたときにこのインターフェイスが機能する限り、これはこのファミリにとって理想的なインターフェイスになります。プロトコルは公開されており、比較的単純で、ハードウェアに組み込まれています。i2cのような双方向データバスの欠点があります。

Armには、swdと呼ばれるワイヤが少ないjtagがあり、必ずしも公開されているとは限りません。しかし、オープンソースツールはそれを実装しています。これは理論的にはシリアルjtagであり、異なるjtag信号は、多くのワイヤで並列に送信されるのではなく、何らかの方法で1本のワイヤで順次送信されます。パーツ内では、再び並列化され、通常のjtagロジックにフィードされると想定しています。これには、ARMがそれを半秘密にしておきたいという欠点があり、ARMのjtagデバッガーはとにかく使用するのに非常に苦痛です。だからこれは大変な仕事です。openocdが機能するようになった場合は、別の話かもしれません。また、ピンの転用や、ハングしたコアで何が起こるかについても心配する必要があります。

多くのベンダーは、1つまたは複数のブートフラッシュ領域を備えたソリューションを使用しています。ピンまたは2つまたは3つを引き出す方法に応じて、起動するフラッシュによって異なります。そのため、ユーザーフラッシュから起動するか、少なくとも工場からシリアルポートベースのブートローダーを備えたフラッシュ、またはUSBベースのブートローダーを備えたフラッシュから起動します。ベンダーごとに、これらのソフトウェアソリューションは変化する可能性があり、実際に変化します。シリアルプロトコルは微妙に変化するか、微妙に変化しますが、USBソリューションはかなり変化する可能性があります。良い点と悪い点は、これらのフラッシュの一部を入手できることです。したがって、シリアルブートローダーを変更することを選択できます。これは良い点と悪い点の両方です。誤って消去して部品をレンガにするには、少なくともそのインターフェイスにレンガを入れてください。

Jtagツールは数千ドルの費用がかかっていましたが、今ではありません。約15ドルでftdiブレイクアウトボードを入手し、openocdで再利用できます。50ドルのプラスまたはマイナスで、openocdですぐに使えるftdiベースのUSBソリューションを入手できます。非営利のjリンクを75〜80ドルで入手できます。そして、数千ドルもの高速のものがありますが、確かにお金の価値はありません。大量の現金を抱える巨大企業であり、支援のために支払いたい場合に購入します。これらの価格を支払うと、必要な製品が手に入り、テクニカルサポートの質問に対する回答がすぐに得られます。たとえば、無料のLinux対WindowsまたはRHELのように、Linuxサポートは無料ですが、入手したものを手に入れることができます。とにかく、これによりjtagがより魅力的になり、

いつでもどこでも手頃な価格でデバッグおよび開発の武器となるjtagツールを用意する必要があります。sparkfunにはftdiベースのシリアルボードへのUSBがあり、ftdiパーツはビッグバンガーに再利用できます。これらをspiまたはi2cまたはpdiまたはjtagまたは他のインターフェイスに使用できます。理想的には、興味のあるバス/部品用に作られたボードを入手し、それに付属するフリー/オープンソースソフトウェアを使用します。また、これらのシリアルボードを使用して、理想的には3.3Vと5Vの電源(リリーパッドやarduinoミニなどに使用するものごとに約15ドル)を用意して、シリアルプロトコルのようなさまざまなマイクロのシリアルポートに接続します。これらのプロトコルに基づいて独自のローダーを書く方が簡単だと思います。特に、ブートローダーのソースが公開されており、それらがサポートする想定標準からかなりのサブセットであるarduino / avrの人々のようです。YMMV。

要するに、良いソリューションはありません。それらにはすべて長所と短所があります。それらのうち少なくとも2つをサポートする準備をしてください。usbとシリアルまたはusbとjtagまたはjtagとシリアルなど。ボードにパッドまたはピンホールを置くだけで、必ずしも入力する必要はありません。個人またはラボでの開発には、ツール一式があり、ブリックチップを使用してボードを回復したり、独自のブートローダー、USBファームウェアなどを開発したりするときに、ツールを切り替える準備ができています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.