Skip to content

Latest commit

 

History

History
381 lines (296 loc) · 21.7 KB

advanced.md

File metadata and controls

381 lines (296 loc) · 21.7 KB

詳細な使い方

書込装置を使ってUPDI4AVRを書き込む

この項は Arduino Nano Every 等のオンボードデバッガ付マイコンボードは対象としていない

既に複数の UPDI書込装置を所持していて、ひとつを UPDI4AVR 専用にするならば以下の設定で書き込むと良い。

  • No bootloader
  • Disabled hardware RESET pin, PF6 == GPIO (MAKE signal assignment)

bootloadrを使わなければ、起動が従前より1〜8秒高速になる。 さらに MAKE を有効にすると無用な再起動が抑制されるので JTAG通信開始が安定する。 そうした上で UPDI4AVR 実装器への誤った(ブートローダーによる)スケッチ書込が抑制されるので、誤操作に対する耐性が高まる。

正常動作確認後、LOCKBITを無効化してデバイス施錠すればファームウェアを永続化することもできる。 正しい手順で解錠しない限り、簡単には上書きされなくなる。

  • Arduino Nano Every 等はそもそもブートローダー書込みではないのでこの項目は当たらない。 手軽に試すには便利だが、ハードウェアの制約があるため本格的なライタ運用に使うには不便でもある。

端子割当

既定では以下の機能を各端子に割り当てている。configuration.h で変更可能。

機能名 方向 Nano Every Bare Zinnia tiny2 用途
JTRX IN --(PB5) PA1 PA1(D0) PA2 PCからのJTAG受信
JTTX OUT, Hi-Z --(PB4) PA0 PA0(D1) PA1 PCへのJTAG返信
PGEN OUT, Hi-Z D13(PE2) PA7 PA7(D10) PB3 JTAG通信時HIGH
DBGTX OUT D1(PC4) PF4 PF4(D3) -- DEBUGコンソールUART出力(8N1、標準57600bps、最大1.5Mbps)
TDAT IN, OUT, Hi-Z D6(PF4) PC0 PC0(D7) PB2 UPDI双方向単線通信
TDIR OUT A5(PF3) PC3 PC3(D4) PB0 HOST送信時HIGH
MAKE IN A0(PD3) PF6(/RESET) PF6(/RESET) PA6 LOWエッジでリセット検出
HVEN OUT A1(PD2) PD2 PD2(A1) PA6 通常LOW、tinyAVRへの高電圧印加時HIGH
HVP1 OUT A2(PD1) PD3 PD3(A2) PA4 チャージポンプ駆動正出力
HVP2 OUT A3(PD0) PD4 PD4(A3) PA5 チャージポンプ駆動逆出力

JTRX / JTTX

待機中は JTRX ポートを 19200bps に設定して PCからの JTAG通信を待つ。 速度はその後のJTAG通信過程で動的に変更される。(avrdude-b オプション)
主クロックに依存するが最大 3M bps (F_CPU=24Mhz以下では1.5M bps) 動作まで対応する。
待機時の JTTX ポートはハイインピーダンスとしているので、 同一 UART通信ペアにターゲットMCUの UARTペアを繋ぐことができ、UARTパススルーとして構成できる。

  • UNO WiFi 等では JTRX/JTTX に使うべき PB4/PB5 ポートはボード内部で USB-UART(オンボードデバッガ経由)に繋がっているため変更できない。 また外部にピン出力も引き出されていない。このため UARTパススルーは機能しない。 追加の USB-UART 変換器を用意して PB0/PB1 等を JTRX/JTTX に割り当てることは可能。

PGEN

PGEN は後述の USBパススルー を行うときのゲート制御に使用する。
JTAG通信中は点灯するLED制御にも使用できる。

DBGTX

DBGTX ポートは DEBUGマクロ有効時に UARTコンソール出力として活性化される。 そうでなければ未使用。 出力専用で RX方向は用意されていない。 主クロックに依存するが最大 1.5M bps 動作まで対応する。(既定値は 8N1 57600 bps)

TDAT

TDAT ポートはハードウェアによる単線半二重非同期 UART入出力通信線である。 ホストとターゲットが同一の単一電源で駆動されるなら、直結とする。
両者が異なる電圧であるなら少なくとも保護抵抗を介するか、電圧レベル変換回路が必要となる。 ただし UPDIピンの駆動電力は弱いため(100uA以下?) 簡易な方法では高速通信が難しくなる。 特に高電圧プログラミングを可能にするには保護回路が必須なので条件が一層厳しくなる。

  • このピンの実体は、単線式RS-485通信の差動回路を含まない論理制御部である。
  • UPDIの通信速度は通常 225000 bps である。公差の範疇で 230400 bps までは設定可能。 さらにデバッガ用途では倍速/4倍速が可能だが、プログラムモードは必ずしも安定しないため UPDI4AVR では対応していない。
  • 実用上の下限は 45000 bps 以上。
  • 電気的に安定しない等で UPDI許可手順に失敗する場合、UPDI4AVR は 1/2速、1/4速 と自動的にフォールバックする。 それでもなお失敗するなら チップ消去実行時に高電圧プログラミングを試みる。

TDIR

TDIR 出力信号は UPDI通信の送受信方向を示す。 ホスト側からターゲットに向けて出力されるときに HIGH、 ターゲット側からの受信を待つ時には LOW に駆動される。 (設定で論理を逆にすることもできる)
これは TDAT 通信線に外部バスバッファ回路を追加した場合の制御に使用する。

  • このピンの実体は、単線式RS-485通信の差動回路用XDIR出力である。

ステータスLED制御に用いた場合は次のようになる。

  • リセット時に一瞬点灯、ターゲットが見つからなければ(異常があれば)2回以上点滅、以後消灯
  • UPDI通信中は点滅
  • 一連のJTAGセッションが正常終了すれば1回点灯、異常があれば消灯(設定で論理を逆にしなければ)

MAKE

MAKE 入力ポートは、LOWエッジを検出すると JTAG通信を 192000 bps に設定し、 ターゲットへの UPDI通信を試み、 可能ならターゲットに対して MCUリセットを実行する。 これは UPDI機能とRESETピン機能が排他である tinyAVR 系列に対して有用な、 代替リセット能力を提供する。 さらにはターゲットにブートローダーがインストール済であれば、それを活性化することでもある。
また MAKE は約 0.7sec を超えて LOWが維持されると、 UPDI4AVR 自身に対してもリセットを実行する。

  • プログラミングを途中で強制中断するには、JTAG通信側UART を切断する。 (avrdude を Ctrl+Cなどで KILLする。Arduino IDE使用時は USBケーブルを抜く)

  • AVRベースの Arduino互換機の多くは、DTR/RTS のエッジをキャパシタを介したパルスとして /RESET(PF6) で検出できる。 このため汎用設定の既定では PF6 に割り当てているが、代替ピンに変更もできる。 ブートローダーを使わない場合は充分高速に起動できるため通常の DTR-RESET のままで問題ない。

  • DTR/RTS パルスは、avrdude 起動時に1回、ブートローダーへの Arduinoスケッチ転送時 に更に1回観測できる。 UARTパススルー制御はこのパルス回数を数えることで行われる。

avrdude は特に設定変更をしなければ、DTRとRTSに同じ信号を出力する。
avrdude 6.8 では、JTAG通信開始時に 1回だけパルスを送信し、その250ms〜350ms後から通信を開始する。
10秒後からリトライを開始するが、その時に DTR/RTSパルスは生成されない。
avrdude 7.0 ではリトライの度に新たな DTR/RTS パルスを生成する。(Nano Everyが使いにくい理由)
Arduinoプロトコル使用時は、書込のあいだ DTR/RTS 線を LOW で維持する。

HVEN

HVEN 出力信号は tinyAVR に対する高電圧プログラミングが必要なときに 1msの HIGH パルスを出力する。 通常の UPDI許可手順で UPDI通信が確立できるならば常に LOW であり、HIGHになることはない。
このピンを使う時は、ターゲット駆動電圧は 5Vであることが推奨される。

HVP1 / HVP2

HVP1HVP2 はチャージポンプ昇圧回路駆動用の、互いに逆相の矩形波出力を提供する。 既定値は 100kHz で、直結なら 0.1uF1uF 程度の負荷を充電でき、2段3倍圧で 12mA程度の出力を得られる。

  • HV_PWM_STARTUP_DELAY_MS マクロで HVEN 有効化前の起動猶予時間を設定できる。

端子割当の変更

configuration.h を編集することで端子割当を変更できるが、以下の制約がある。 詳細はインストールするMCUのデータシートを参照のこと。

  • TDATTDIR は同一のポートグループに属する、UART専用の特定の TXD/XDIRピンでなければならない。
  • JTTXJTRX は同一のポートグループに属する、UART専用の特定の TXD/RXDピンでなければならない。
  • DBGTX はUART専用の特定の TXDピンでなければならない。
  • HVP1HVP2 は TCA0 タイマーに接続可能な、同一端子グループ内のピンでなければならない。

UARTパススルー回路

JTRX/JTTX ポートペアは、JTAG通信をしない時は単に制御指令を受け取るまで何も送信せずに遊んでいる。 そこで待機状態時は ターゲットMCU の PC間 UART通信に使えるよう、 ポート制御を開放しておくのが UARTパススルー である。

 Target        UPDI4AVR(HOST)         PC
    +--------------+    +-----||-----+
    |              |    |      C     |
+------+        +----------+      +--------+
| UPDI |        |TDAT  MAKE|      |DTR/RTS |
|      |        |          |      |        |
|RX  TX|        |JTRX  JTTX|      | RX  TX |
+------+        +----------+      +--------+
  |  |              |  |             |  |
  |  |      R       |  |             |  |
  |  +-----VVV------|--+-------------+  |
  |                 |                   |
  +-----------------+-------------------+

Fig.2 UART pass through

UPDI4AVR の JTTX は、待機中の無通信時は内蔵プルアップ付きハイインピーダンス状態なので、 ターゲットの TX と繋いでおくことができる。 ただし偶発的に両者が同時に活性化した際の短絡を緩和するため、 電流制限抵抗をターゲット側の TX に挿入しておくことが望ましい。(330ohm)

UPDI4AVR は JTRX にて PCからの JTAG_SIGN_ON指令を受け取ると、 直ちに UPDI を経てターゲットをリセット状態に置こうとする。 すると AVR系列のチップは 全GPIOがハイインピーダンスになるため TX 同士が衝突することは無く、 UPDI4AVR は PC に向けて JTAG_RSP_SIGN_ON を送信することができる。

UPDI4AVR は JTAG_SIGN_ON指令を受け取るまでは活性化しないので、 ターゲットがブートローダを備え、スケッチアップロードを受け入れる状態であっても、 それに干渉することはない。 MAKE による DTR/RTS 検出は、その状況を見越して JTTX を不活性化する動作にも使われる。 (そしてターゲットのブートローダーを活性化する)

UPDI4AVRがターゲットのUPDI制御を再試行を経ても獲得できなかった場合は、 ターゲットが存在しないか高電圧プログラミングを必要としているものと仮定して PCに応答する。 この場合ターゲットが TX を開放していないなら、PCに正しく応答が届くとは限らない。 例えばターゲットにブートローダーが入っている場合、そちらの応答が優先されるので JTAG通信は成立しない。

つまり事前に 高電圧プログラミングを必要としていることが明白なら、 ターゲットの TX 線は外しておくべきである。

これを自動化するために、3ステートバッファゲート(74LVC1G125等)を回路に加え、 PGEN 信号出力で TX衝突を制御することができる。

 Target       UPDI4AVR(HOST)         PC
    +--------------+    +----||-----+
    |              |    |     C     |
+------+        +----------+      +--------+
| UPDI |        |TDAT  MAKE|      |DTR/RTS |
|      |    +---|PGEN      |      |        |
|RX  TX|    |   |JTRX  JTTX|      | RX  TX |
+------+    |   +----------+      +--------+
  |  |      |       |  |             |  |
  |  |  /OE |   R   |  |             |  |
  |  +-----|>--VVV--|--+-------------+  |     x1 74LVC1G125
  |                 |                   |
  +-----------------+-------------------+     R = 330ohm

Fig.2 UART pass through additinal tri-state buffer logic

異電圧接続を考慮しないのであれば、 2入力1出力セレクタ素子(74LVC1G157等)を使うこともできる。 この場合は衝突緩和抵抗を挿入する必要はない。

     PGEN ------+
                |
          +-------+
H.TX ---- | A   S |
          |       |
T.TX ---- | B   Y | ---- PC.RX
          +-------+

Fig.3 Single 2-input multiplexer

UPDI線の異電圧接続

UPDI線は単線半二重双方向UARTのオープンドレイン制御であるが、 多くの品種のそのドライブ能力は他のGPIOに比べて弱い。 吸い込み方向の能力は不足がちのため、 よくある N-ch MOSFET による 異電圧レベルシフトの利用には注意を要する。

         HV           LV         x1 BSS138 (Nch-MOSFET)
          |           |
          |     +-----+          R1 = R2 = 100kohm
          |     |     |
       R1 >     |G    > R2
          >    ===    >
          |    |A|    |
X.UPDI ---+---- < ----+--- Y.UPDI
               D S

Fig.4 Level shift N-ch MOSFET (unbuffer)

この回路で UPDIが LOW に駆動されるとき、複数のプルアップ抵抗の合成抵抗値が配線に加わる。 その総和に打ち勝つだけのドライブ能力がないと、他方は閾値を下回るほど充分に電位が下がらず、LOWと認識されない。 かといって抵抗値を増やしすぎると HIGH への立ち上がりが遅くなり、規定時間内に電位が戻らなくなる。 このためプルアップ抵抗値の選定には慎重を要し、かつ高速な信号伝達速度を保つのが難しい。

UPDIポートはターゲット側において常に無効化出来ない内蔵プルアップ抵抗が機能しているため、 それも合成抵抗値に加わえて配慮しなければならない。 この値は20kohm〜50kohm程度と個体差による幅がある。

  • つまりターゲット側にプルアップ抵抗を外付けする必然性はない。 その場合ホスト側のプルアップ抵抗値は最低でも 82kohm 程度以上とする。 さらにホスト側で内蔵プルアップ抵抗を有効にした場合は両側とも不要にできる。 しかしながらそうすると外部からの ESDに対して MOSFETが無防備になるため、 非接続時に問題を生じる恐れはある。

両側3.3V給電、300mm MIL6Pハーネス、250kbps、BSS138使用の実測では、 R1、R2とも 最低68k、推奨100kohm 程だ。 この値はレベルシフト回路で一般的によく選ばれる 10kohm に比べると、一桁違う。

目安としては分流された負荷抵抗値が、内蔵プルアップ抵抗値を超えない 50kohm 以上とするのが良い。

  • 高電圧プログラミング時はターゲット駆動電圧が 5Vであることが推奨されるので、
    ホスト側が 5V駆動できない場合はこの種の変換回路が必要になる。

チャージポンプ昇圧回路

高電圧プログラミングを可能にするには、何らかの手段で 12V (AVR DDでは9V) 電圧を得る必要がある。 そこで HVP1HVP2 を使うと、簡単な部品の追加で昇圧回路を構成できるよう配慮されている。 数ミリAほどの出力しかとれないが高電圧プログラミングには充分だ。

            C
HVP1 ---||--+------+      +----+----+---- HV (12V~17V)
            |      |      |    |    |
          D -      V    D -    |    |
            A    D -      A    = C  ~ ZD 12V
            |      |      |    |    A
HVP2 -------+--||--+------+    |    |    x3 C = 0.1uF
               C               |    |    x3 D = SBD (Vf=0.3V)
                               =    =
                              GND  GND
Fig.5 Tripled Chargepump
  • PWM発振周波数は 100kHz に設定されている。
  • コンデンサ容量を増やすと出力電流は増大するが、所望電圧安定までの所要時間が増える。 さらに容量が過大だと PWM駆動ピンが損傷する。

高電圧プログラミング対応回路

この高電圧パルスをターゲットの UPDI(PA0)ポートに印加するには、 フォトカプラや MOSFETによるスイッチ回路を用意して HVEN で制御する。

               S D                      Pch = IRLML6402
HV -----+-------<-----------------+     Nch = BSS138
        |      |A|                |
        |      === Pch            |           VCC
        |  R1   |                 |            |
        +--VVV--+                 |         D  |
                |                 |       +-|<-+----+
              |-|D                |       |    |    |
HVEN -----+---|>A  Nch            |    R4 >    |G   > R5
          |   |-|S                |       >   ===   >
       R2 >     |                 |  R3   |   |A|   |
          >     |      T.UPDI ----+--VVV--+----<----+---- H.UPDI
          |     |                             D S
          =     =                             Nch
          V     V        R1 = R2 = 10kohm
                         R4 = R5 = 100kohm   R3 = 330ohm

Fig.6 HV Switching

右の Nch-MOSFET は Fig.4 の応用で、ホスト側に高電圧が直接流入するのを阻止する。 R3は信号の衝突を緩和するが、大きくすると最大通信速度が低下する。

  • フォトカプラを使うほうが部品数を削減できるが、遮断時の漏れ電流も 通電時の損失も大きいので MOSFET を使うより特性は劣るかもしれない。

AVR DDファミリの高電圧プログラミングでは事情が異なり、UPDI(PF7)ではなく、RESET(PF6)に 9Vパルスを印加する必要がある。 このため9V用ツェナーダイオードに変えた同種の回路を、RESETピン用に別途用意しなければならない。

その他の情報

UPDI

  • 一部のデバイスでは、NVMPROG_KEY と ERASE_KEY は一度にまとめて送ってよいようだ。 CS経由のリセット後には消去完了と同時に NVMPROG が有効になる。 ただしすべてのデバイスがそうであるわけではない。AVR_EAではそれぞれを分けて操作する必要がある。

  • 一部のチップは ERASE_KEY や USERROW_KEY 処理が他より数倍程遅い。他の操作に遷移する前に完全な処理完了を確認しないと、その後の応答が失われる。

  • デバイスリセットをするだけなら CS層にリセットコマンドを UPDI送信するだけかつ受信不要なので、 米粒AVR/PICで外部リセット回路が作れてしまう。 そのほうが FUSE 変更で UPDIポートを RESETポート化するより実用的かつ安全。

    • [UPDI-RESET-ADAPTOR] を参照

avrdude

  • avrdude のターミナルモードには UPDI4AVR では対応しない。 通信速度を 19200 bps で妥協するなら、限定的には使える。 しかし MAKE ピンによる DTR/RTS 監視と UARTパススルー制御は機能しない。
  • AVR Dx系統の FLASHは本来 512バイトページのはずだが、 256バイト単位で JTAGパケットを送ってくるようだ。
    • この点はページ単位消去書込時に不具合となるが、普通は全体消去一括書込をするので発覚しない。
  • 少量アクセス時(ブートローダー書込時)に限って、 512バイトブロック読出しを要求されることがある。どうして?
  • DEVICE_DESCRIPTOR からは FLASHページサイズ以外の有用な情報が全く得られない。 UPDIデバイス用の設定は何も用意されていない。
  • なぜか ENTER_PROG が2回送られてくる。BUGか仕様かは判然としない。
  • タイムアウトでもないのにハンドシェイクを無視して、応答しないうちに次の JTAGパケットが送られてくることがある。これはUSBパケットロストに起因する。他のUSBデバイスを可能な限り取り外し、USBハブも経由せず ホストPCに直結するように変更すると改善することが多い。
  • DEVICE_RESET で 1 以外のパラメータが送られてこない。 JTAGmkII 通信規約ではパラメータの使い分けがあるはずだが機能していない。
  • FLASH書き込み時に WRITE_MEMORY にエラーを返すと(あるいはタイムアウトすると) avrdude は1ワード単位の再書込みを始めてしまう。 この状態になると極端に書込が遅くなる。

<-- 戻る

Copyright and Contact

Twitter(X): @askn37
BlueSky Social: @multix.jp
GitHub: https://github.com/askn37/
Product: https://askn37.github.io/

Copyright (c) 2023 askn (K.Sato) multix.jp
Released under the MIT license
https://opensource.org/licenses/mit-license.php
https://www.oshwa.org/