2012年07月18日

pic32progの改造

PIC32MX のライタは、純正の pickit3 を使うのが普通らしい。だが、pic32prog を使うと pickit2 が使えるばかりではなく、FT2232 系の Olimex ARM-USB-TINY Jtag ケーブルが使えるらしい。ソースコードも公開されているので、改造すればいろんなものに対応できそう。

秋月で USB OTG 対応の PIC32MX220F032B が、220円 と低価格で売られているが、ライタが高価ではなかなか薦められない。そこで、950 円の AKI-UM232R あたりで書き込めるようにならないか検討することにした。最初の書き込みさえできれば、PIC32MX220F032自身を使ったライタも作れるだろうから、書き込み速度はあまり気にしないことにする。
機能の検討

    さて、PIC32MX の書き込み方法には、2通りある。ひとつは JTAG もうひとつは 2-Wire 式の ICSP 。pickit3 も ICSP らしく、どうも こちらが標準らしい。PIC32MX220F032B を使う場合、JTAG は Disable にすると思う。となると、やはり ICSP を使いたくなる。

    ただ、ICSP は非常に入出力の切り替えの頻度が高く、Synchronous BitBang(以下 SYNCBB) と相性が悪い。付加回路なしだと限度を超える遅さになるはず。そこでこんな風にしようかと思う。



    要するに 出力を I2C のように pull-up / L にする。これだと PGD 出力を負論理にしなければならないが、外付け回路が トランジスタ+抵抗で済む。これでも部品が多いと思うなら デジトラを使えば 2 つ抵抗を減らせる。あと 100 Ωは 保護用で直結の場合でも入れた方が良いもの。

    あと MPSSE が使える 上に Hi-Speed の UM232Hも 1680円と比較的安価に買えるようになった。こちらも 使えるようにしておきたい。

    SYNCBB を使うならば、同様の付加回路で実現できるのだが、MPSSE だと 入出力を頻繁に切り替えることが可能で、直結することが出来る。MPSSE でも ICSP に対応したいもの。

    これに加えて SYNCBB での JTAG にも対応したい。MPSSE では、ICSP との兼ね合いで 本来の性能が出ないやりかたになりそう。(要するに MPSSE の BITBANG というべき機能を使う)

標準ピン配置 (未確定)

    syncbb-icsp
    dbus_tck PGC D5/DSR
    dbus_tdi PGD_OUT D6/DCD
    dbus_tdo PGD D3/CTS
    dbus_sysrst ~MCLR D7/RI
    mpsse-icsp
    dbus_tck PGC ACBUS0
    dbus_tdi PGD ACBUS1
    dbus_sysrst ~MCLR ACBUS7
    syncbb-jtag
    dbus_tck TCK D5/DSR
    dbus_tdi TDI D2/RTS
    dbus_tdo TDO D3/CTS
    dbus_tms TMS D4/DTR
    dbus_sysrst ~MCLR D7/RI
    mpsse-jtag
    dbus_tck TCK ACBUS0
    dbus_tdi TDI ACBUS1
    dbus_tdo TDO ACBUS2
    dbus_tms TMS ACBUS3
    dbus_sysrst ~MCLR ACBUS7

    こういう風に決めた。UM232H などでは、この 4 つのどれも使える。FT232R だとケーブルによっては、4 つしか ピンがなく JTAG は使えない。(多分: 実は良くわからないのだ)

      訂正: MPSSE では、ADBUS 0-3 は、BITMANG として扱えなかった。ACBUS に移動。
      注意:出力専用線は、TXD , RTS, DTR だが、これらを PGC/PGD/PGD_OUT あと TDO には割り当てないように。できるだけ ~MCLR に割り当てる。やむを得ない場合は、PGD_OUTに 割り当てた方がよい。

      さらに訂正: ADBUS 0-3 は、BITMANG として扱える。LOWBYTE のアクセスで、bit0-3 が GPIOL0-L3 だと思ったら違った。GPIOL0-L3 は、bit4-7 。紛らわしいのに説明を見つけられなかったので誤解していた。

    この 4 つをどうやって選択するのか? ピン配置をカスタマイズするのはどうしたら良いのか? 実は悩んだ。pic32prog では、使用可能なものを自動的に選ぶだけで、オプションすらないのだ。

    しょうがないので -t 文字列 というのを追加することにした。この文字列に syncbb-icsp とかを入れることで、標準的なピン配置は使えるようにする。

    次にカスタマイズだが、コンフィグファイルというものもない。ややこしいのだが、syncbb-icsp-5637 とか 上記のエントリの順番でビット番号を指定していくことにした。

改造の方針

    さきに 使用可能なものを自動的に選ぶようになっていると書いたが、MPSSE の場合 Olimex の VID のみに対応する。FTDI の VID には対応しないのだ。

    これを逆に利用して、別のソースコードにしようと思う。オリジナルのコピーして改造版を別のライタ用として作りなおすわけだ。オリジナルは、ftd2xx を使っていなかったりするのだが、使った方が結局は楽そうなので、そこも変えるつもり。

    あと、FTDI のケーブルが複数あると困ったことになる。syncbb-icsp と指定すると書いたが、ft0-syncbb-icsp とか フレフィックスを付けることで対応しようかと思う。

      調べてみたのだが、ftd2xx は、デフォルトでは、FTDI 社の VID:PID のみしか対応しない。FT_SetVIDPID で VID:PID を あらかじめ設定 しておくことで 他のものに対応できる。

      プレフィックスは、
       (1) 見つかる順番に ft0 , ft1 ... ft9
       (2) seriall number (- が含まれないこと)
       (3) description (- が含まれないこと)
      ということにしたのだが、VID:PID (4桁 16進数 :0xは付けない) もサポートしようかと思う。

      FT232R 対応の avrdude では困らなかったのだが、MPSSE だと普通 1384:6010 とか JtagKey 互換にしているはず。ただこれだけでは、対応できない。

      基本的に SYNCBB では、AD0-AD7 のみ。MPSSE(BitBang) では、AC0-AC7 + AD4-AD7 のみの操作しかできないのだ。バッファの出力制御のコンフィグをどうするかの問題もある。 真っ当な JTAG ケーブルの ICSP 対応は SYNCBB のみということにして、バッファの出力制御のコンフィグの方法を検討するに留めたい。



      多分こういう回路になる。指定は、syncbb-icsp-01234 。最後の 4 が新設で、初期化時に 出力 L に設定する。

    ちなみに、スナップショットを取った r51 版 : pic32prog-r51-20120714.tar.gz をベースに改造していくことにする。最新版への追従は別途考える。

(補足)MPSSE の BITBANG

    MPSSEめも』の記事で MPSSE について調べたのだが、

      Set Data bits LowByte 0x80 Value Direction
      Set Data bits HighByte 0x82 Value Direction
      Read Data bits LowByte 0x81
      Read Data bits HighByte 0x83

    こんな機能があるのだ。入出力の方向と出力値を同時に指定できる。そして、必要な時だけ 入力値を読み込める。SYNCBB だと方向はあらかじめ決めておかなければならない。そして常に読み込むのだ。この違いは大きく処理的にも随分違う。

    追記: LowByte は、TCK/TDI/TDO/TMS , GPIOL0-4 で、HighByte は GPIOH0-7 。

    ビットレートがどうなるかは、不明。内部クロックは 60MHz(2232D は 12MHz) で これを分周する設定があるのだが、TCK の分周を規定しているだけで、エンジンそのもののクロックが変わるとは書いてない。

(補足)JTAG と ICSP

    ICSP は、JTAG の操作にマップできる。基本は、4 倍遅い 4-PHASE 。一部 2 CLK で済む 2-PHASE が使えるらしいのだが、面倒なので全部 4-PHASE で行くつもり。
    シーケンスはこう。

    BITBANG ICSP

    PGC 1 0 1 0 1 0 1 0
    PGD_OUT ~TDI ~TMS 0 0 0 0
    PGD/TDI - - - - - - X -

    MPSSE ICSP
    PGC 1 0 1 0 1 0 1 0 (idle 0)
    PGD DIR 1 1 1 1 0 0 0 0
    PGD TDI TMS 1 1 1 1
    PGD(READ) - - - - - - X -

    わかりづらいと思うがこういう操作。

    あと、ICSP は、リセット中に特別な操作をすることで 使用可能になる。

    Entering ICSP (MPSSE)

    SYSRST 0 1 0 .. 0 .............0 0 ... 0 1 (idle 1)
    PGC 0 0 0 .. 0 1 0 1 0 1 0 1 0 0
    PGD 0 0 0 .. b31 b30 ... b00 0 0 0

    key_data: 0x4D434850

    これもわかりづらいと思うが一応メモしておく。

作ってみた

開発ターゲット購入

    実を言うと PIC32MX も UM232H もまだ持っていない。

    Mouser で PINGUINO があるのを知ったので、PIC32-PINGUINO-MX220 と一緒に PIC32MX250F128B(DIP) , UM232H も 購入することにした。

    当面は、PIC32MX250F128B + UM232H の組み合わせのみで デバッグしていこうと思う。( PIC32MX220F032B が真のターゲットだが 大は小を兼ねる -- はず )

    PIC32MX440F256H の PINGUINO-MICRO も購入することにしたが、これを使う予定はまだない。

ベースバージョン変更

    pic32prog-r62-20120804.tar.gz ベース(r62)
    pic32prog-r62-ftdi-02.zip ftdi-02版 を r62 ベースにしたもの。

    )jzlibの使い方』の記事で書いているように大分ライブラリも出来上がってきた。

    あいかわらず、割り込みは動いていないのだ。UART に printf できる環境を作って、デバッグしようかと思う。そのためにはまず、FTDI シリアル を使う。そうなると、DIP を使って 書き込みもできるようにしたほうが便利。

    そろそろ 再始動する時期が来たようだ。まずは、最新版とのマージから。

ブレットボードでライタを



    どんな感じになるか検討してみた。... のだが、IEC801 とか、30 行?しかない。AKI-UM232R が 12 ピン分、PIC32MX2xx が 14 ピン分使うから 残り 4 ピン分の空きしかない。ここに タクトスイッチを入れる。あとは LED か。

    LED はどうしても収まりが悪い。小基板使うしかないような気がする。もしくは抵抗入り LED を作るか。

    AKI-UM232Rは、これでも まだ良いのだ。本命は、UM-232H なのだが、これは 28 ピン。PIC32MX-DIP と並べると 2 ピンしか空きがない。

    リセットスイッチは、27 ピンの AGND を使って 付けられそう。だが、付加する部品がある。これは、DTC144 ( IN - OUT - GND というピン配置 ) を使って、IN を AD6 に OUT を AD7 に割り当てるしかなさそう。

    o-------o
    | |
    | TACT |
    | -SW |
    --o---o---o o-------o
    |
    | o---o---o
    UM232H | |
    | x x | PIC23MX220F032B
    | |
    | o---o---o
    --o---o---o

    o o o DTC144
    IN OUT GND

    位置関係を書くとこうなる。(UM232H の端 は AD6 - AD7 )

    syncbb-icsp-5673
    dbus_tck PGC AD5/DSR
    dbus_tdi PGD_OUT AD6/DCD
    dbus_tdo PGD AD7/RID
    dbus_sysrst ~MCLR AD3/CTS

    こういう風にしよう。

再始動

    jzlib』の方なかなかうまくいかないので、飽きてきた。こっちの方に手を付けることにした。どうせ両方仕上げないと自由には使えないのだ。『基板』の方もそろそろ送られて来るし急がないと。

    さて、本家の『pic32prog』だが、しばらく r62 で更新が止まっている。Windows 版は、バグを入れたまま放置のようだ。

      adapter-hidboot.c で、hid_read_timeout を使うようになったのだが、Windows では、hid_read_timeout 自体が変。元に戻して -S (ベリファイをスキップ) で 使った方がマシ。


    FTDI 版の状況だが、UM232H でデバッグしている。SYNCBB と MPSSE(BitBang) の両方をデバッグできて便利なのだ。ターゲットは、ブートローダを壊してしまった PIC-PINGUINO-MX220 。実は 2つ買ったので、jzlib の開発には支障がないのだが、基板も出来てくるし、書き込み方法を確立しておきたい。

    まずは、前の版の『pic32prog-r62-ftdi-02.zip』を動かしてみたのだが、ターゲットに接続する以前のレベルのバグがいくつかあった。

    上位レイヤーは動いているはずなのだから、どんな信号を出そうとしているのかだけ、クリアすれば良いはず。このことに注力して、メッセージを入れてターゲットに接続しないでテスト中。

    もっとも単純なのは、MPSSE(BitBang) での JTAG (以下 mpsse-jtag) 。ちょっとメッセージを紹介

      $ ./pic32prog -DD -t mpsse-jtag
      Programmer for Microchip PIC32 microcontrollers, Version 1.exported
      Copyright: (C) 2011-2012 Serge Vakulenko
      FTDI adapter: found (UM232H) mode (mpsse-jtag)
      mpsse-jtag: divisor: 11
      mpsse-jtag: latency timer: 1 usec
      mpsse-jtag: speed 500000 samples/sec
      write : to_write 3 to_drain 0 to_read 0 v 0 rlen 3
      write : to_write 1 to_drain 0 to_read 0 v 0 rlen 1
      drain : to_drain 0 rlen 0
      ## ftdi_reset 0
      write : to_write 6 to_drain 0 to_read 0 v 0 rlen 6
      drain : to_drain 0 rlen 0
      ## ftdi_reset 1
      write : to_write 6 to_drain 0 to_read 0 v 0 rlen 6
      drain : to_drain 0 rlen 0
      drain : to_drain 0 rlen 0
      ## mpsse_send :TTTTT0
      to_write 36 to_drain 0 to_read 0 v 0
      ## mpsse_send :TT000010TT0
      to_write 102 to_drain 0 to_read 0 v 0
      ## mpsse_send :TT001110TT0
      to_write 168 to_drain 0 to_read 0 v 0
      ## mpsse_send :T000111111TT0
      to_write 246 to_drain 0 to_read 0 v 0
      ## mpsse_send :T000000000TT0
      to_write 332 to_drain 0 to_read 8 v 8
      write : to_write 332 to_drain 0 to_read 8 v 8 rlen 332
      drain : to_drain 0 rlen 0
      read : to_read 8 v 8 rlen 8
      :74 74 74 74 74 74 74 74
      mpsse-jtag: status 00ff
      mpsse-jtag: invalid status = 00ff
      No target found.

    ## mpsse_send :T000000000TT0 は、大分下のレベルで、なにを送ろうとしているかをダンプしたもの。T が TMS を H にする意味 で確かに合っている。write : と drain: は、バッファ管理のメッセージで、貯めこんで write している。drain は余計なデータを読み飛ばす処理で、write からさらに遅延させている。だが、mpsse では、必要なときだけ READ の要求を出すので、余計なデータは常にゼロ。ここが単純だと言っているところ。
    read も 読み込んだバイトデータの TDO bit を変換するだけで楽。

    同じ処理を SYNCBB でやるとどうなるか

      ## ftdi_reset 0
      write : to_write 1 to_drain 1 to_read 0 v 0 rlen 1
      drain : to_drain 1 rlen 1
      ## ftdi_reset 1
      write : to_write 1 to_drain 1 to_read 0 v 0 rlen 1
      drain : to_drain 1 rlen 1
      drain : to_drain 0 rlen 0
      ## mpsse_send :TTTTT0
      to_write 12 to_drain 12 to_read 0 v 0
      ## mpsse_send :TT000010TT0
      to_write 34 to_drain 34 to_read 0 v 0
      ## mpsse_send :TT001110TT0
      to_write 56 to_drain 56 to_read 0 v 0
      ## mpsse_send :T000111111TT0
      to_write 82 to_drain 82 to_read 0 v 0
      ## mpsse_send :T000000000TT0
      to_write 108 to_drain 88 to_read 20 v 8
      write : to_write 108 to_drain 88 to_read 20 v 8 rlen 108
      drain : to_drain 88 rlen 88
      read : to_read 20 v 8 rlen 20
      :4b 4b 4b 4b 4b 4b 4b 4b
      syncbb-jtag: status 00ff
      syncbb-jtag: invalid status = 00ff
      No target found.

    write するバイト数は減るのだが、読み飛ばすデータが圧倒的に増える。で、読み込む場合も 20 バイトのうち 8 バイトだけが有効なデータ。最初はバッファ管理でずれが出ていたのだが、直せたようだ。

    さて、ICSP が本命。mpsse-icsp もあるが、複雑な syncbb-icsp の方を紹介する。

      ## ftdi_reset 1
      write : to_write 1 to_drain 1 to_read 0 v 0 rlen 1
      drain : to_drain 1 rlen 1
      ## ftdi_reset 0
      write : to_write 1 to_drain 1 to_read 0 v 0 rlen 1
      drain : to_drain 1 rlen 1
      ## ftdi_reset 1
      write : to_write 1 to_drain 1 to_read 0 v 0 rlen 1
      ## ftdi_send_key 0x4d434850
      write : to_write 65 to_drain 66 to_read 0 v 0 rlen 65
      drain : to_drain 66 rlen 66
      ## ftdi_reset 0
      write : to_write 1 to_drain 1 to_read 0 v 0 rlen 1
      drain : to_drain 1 rlen 1
      drain : to_drain 0 rlen 0
      ## mpsse_send :TTTTT0
      to_write 48 to_drain 48 to_read 0 v 0
      ## mpsse_send :TT000010TT0
      to_write 136 to_drain 136 to_read 0 v 0
      ## mpsse_send :TT001110TT0
      to_write 224 to_drain 224 to_read 0 v 0
      ## mpsse_send :T000111111TT0
      to_write 328 to_drain 328 to_read 0 v 0
      ## mpsse_send :T000000000TT0
      to_write 432 to_drain 352 to_read 80 v 8
      write : to_write 432 to_drain 352 to_read 80 v 8 rlen 432
      drain : to_drain 352 rlen 352
      read : to_read 80 v 8 rlen 80
      :9f 9f 9f 9f 9f 9f 9f 9f
      syncbb-icsp: status 00ff
      syncbb-icsp: invalid status = 00ff
      No target found.

    まず、ICSP では、SYSRST = L にした後 KEY を送って、SYSRST = H にする必要がある。(JTA では、SYSRST = L にするだけ)

    mpsse_send だが、送受信ともに 4 倍になる。で、受信データも 8 bit のために 80 バイト受け取る。UM232H は、480M bps だから、こんな処理でも遅さを感じないんじゃないかと思う。FT232R では心配だが、何分もかかるものではないと思っている。遅いのが困るなら JTAG にする手もあるし、まぁなんとかなるだろう。。

    pic32prog-r62-ftdi-03.zip ftdi-03版

    まだまだなのだが、一旦スナップショット。exe ファイルも同梱している。HID BOOT の方は -S オプションで使える。
    pic32prog-r62-ftdi-04.zip ftdi-04版 (置き換え)

    あまり変わっていないが、いくつか気がついたので直した。ICSP モードに入るとき 最後の TCK の立下りと /MCLK の立ち上がりのタイミングがシビア。多分同時に変化させれば良いのだと思うが自信なし。また、ICSP に入る前に /MCLR を L → H → L にするのだが、H の期間が 500us 以下でないといけない。ftdi_reset() 関数を 2 回 call するのでは、これを保証できないので 専用の関数を作成した。タイミングがシビアなのは、この2つだけの模様。

    いろいろ試しているのだが、全然だめ。ひょっとして、JTAG が Disable されていたりしないか? 配線が長過ぎないのか? とか疑心暗鬼状態。PGEx3 が使えるのは確実だと思うのだが、ICSP モードの方が難しいし、悩ましい。
    懸案事項を列挙すると

    • ビットレートがどうなるか不明なこと。内部クロックは 60MHz(2232D は 12MHz) で これを分周する設定があるのだが、TCK の分周を規定しているだけで、エンジンそのもののクロックが変わるとは書いてない。GPIO の設定 を全力でされると 1/3 の 20 MHz で信号が切り替わるかも知れない。

      ICSP では、10 MHz が上限なので、それ以上になる不安がある。2 倍のデータを送れば レートを半分に落とせるものの、ICSP が耐えても ケーブルが適当ではダメかもしれない。

      USB の転送レートとは別の話なので、確認するには、ロジアナが必要になりそう。あと、SYNCBB だと、ルールが良くわからないものの、分周の設定に比例して変わっていた。MPSSE も同じようなものだと期待したい。

    • JTAG が Disable されている可能性。コンフィグが分れば良いのだが ... シリアルを用意したし、動いている PINGUINO で確認したいのだが、まだ printf が動かない。

    • 接触不良の可能性や 接続を間違えている可能性。動くと分かっていれば、これのチェックに注力すれば良いのだが ...

    pic32prog-r62-ftdi-04.zip を置き換えた。

    ロジック自体は、進展がない。bit clk の設定とメッセージ関係の修正。メッセージを眺めているのだが、動いてもおかしくなさそうな ... 特に syncbb-jtag は動きそうな気がする。

      $ ./pic32prog -DD -t ft0-syncbb-jtag
      Programmer for Microchip PIC32 microcontrollers, Version 1.exported
      Copyright: (C) 2011-2012 Serge Vakulenko
      syncbb-jtag Pin Assignment :
      TCK (PGC) 5
      TDI (PGD) 2
      TDO (PGD_OUT) 3
      TMS 7
      /MCLR 4
      FTDI adapter: found (UM232H) mode (syncbb-jtag)
      syncbb-jtag: latency timer: 2 msec
      syncbb-jtag: requested bit_clk: 500000 Hz
      syncbb-jtag: set baud 115200
      drain : to_drain 0 rlen 0
      ## ftdi_reset 0
      write : to_write 1 to_drain 1 to_read 0 v 0 rlen 1
      drain : to_drain 1 rlen 1
      ## ftdi_reset 1
      write : to_write 1 to_drain 1 to_read 0 v 0 rlen 1
      drain : to_drain 1 rlen 1
      drain : to_drain 0 rlen 0
      ## mpsse_send :TTTTT0
      to_write 12 to_drain 12 to_read 0 v 0
      ## mpsse_send :TT000010TT0
      to_write 34 to_drain 34 to_read 0 v 0
      ## mpsse_send :TT001110TT0
      to_write 56 to_drain 56 to_read 0 v 0
      ## mpsse_send :T000111111TT0
      to_write 82 to_drain 82 to_read 0 v 0
      ## mpsse_send :T000000000TT0
      to_write 108 to_drain 88 to_read 20 v 8
      write : to_write 108 to_drain 88 to_read 20 v 8 rlen 108
      drain : to_drain 88 rlen 88
      read : to_read 20 v 8 rlen 20
      :4b 6b 4b 6b 4b 6b 4b 6b 4b 6b 4b 6b 4b 6b 4b eb
      syncbb-jtag: status 00ff
      syncbb-jtag: invalid status = 00ff
      No target found.

    これは、なにもつなげずに 動かした結果。

    ## mpsse_send :T00[0000000T]T0

    [] の部分が、read の dump に対応する。2 バイト目は、前に書いたデータの結果で TCK=1 になっている。最後だけ eb で TMS=1 。

    このように、自分がどう出力したかは確認できた。baudrate も 115200 で問題ない。 やっぱり JTAG が Disable されていなければ動くと思える。

    read : to_read 16 v 8 rlen 16
    :74 75 74 75 74 75 74 75 74 75 74 75 74 75 74 7d

    では、mpsse-jtag ではどうなのか? mpsse では余計なデータを読まないので、コードを追加してやってみたところ同じようになった。... あとは、データが変化する周期がどうなのか確認できれば、syncbb-jtag と同じレベルになる。

    おなじように、ICSP の場合も結果を見られるようにしておいた。これは syncbb-icsp の結果

    :9f df df 9f 9f df df 9f 9f df df 9f 9f df df 9f
    :9f df df 9f 9f df df 9f 9f df df 9f 9f df 9f 9f

    もうなんだか分からなくなってくる。

    :9f df df 9f : 9f df df 9f : 9f df df 9f : 9f df df 9f
    :9f df df 9f : 9f df df 9f : 9f df df 9f : 9f df [9f] 9f

    ううむ。

    :fd fd fe fe : fd fd fe fe : fd fd fe fe : fd fd fe fe
    :fd fd fe fe : fd fd fe fe : fd fd fe fe : fd ff fe fe

    こちらは、mpsse-icsp 。

    まぁいいか。今回はここまでにしておこう。次は、基板がきた時。

    ちょっと進展というか残念な 情報が得られた。

    hello world 5 5 000003b0
    DEVCFG3 = 0x3fffffff
    DEVCFG2 = 0xfff979d9
    DEVCFG1 = 0xff60cedb
    DEVCFG0 = 0x7fffffeb

    だいぶごまかして、printf を動かし、DEVCFG を表示させた。これを見ると DEVCFG0 の最後 が 1011 になっている。すなわち JTAG は Disabled 。残念だが ICSP でなんとかするしかなくなった。 まぁ、原因がわかっただけでもすっきりした。

進捗状況 (8/21)

    なんと、mpsse-icsp で、最初のところだけ動いた。jtag より先に進んでしまったのだ。

      ./pic32prog -t mpsse-icsp-012 -D
      Programmer for Microchip PIC32 microcontrollers, Version 1.exported
      Copyright: (C) 2011-2012 Serge Vakulenko
      mpsse-icsp-012 Pin Assignment :
      TCK (PGC) 0
      TDI (PGD) 1
      TDO -1
      TMS -1
      /MCLR 2
      FTDI adapter: found (UM232H) mode (mpsse-icsp-012)
      mpsse-icsp-012: latency timer: 2 msec
      mpsse-icsp-012: requested bit_clk: 500000 Hz
      mpsse-icsp-012: set divisor 3
      mpsse-icsp-012: idcode 04a00053
      mpsse-icsp-012:open status 008a
      Adapter: mpsse-icsp-012
      Processor: MX220F032B (id 04A00053)
      Flash memory: 32 kbytes
      Boot memory: 3 kbytes
      mpsse-icsp-012: enter serial execution
      mpsse-icsp-012:serial_execution(1) status 008a
      mpsse-icsp-012:serial_execution(2) status 008a
      mpsse-icsp-012: read word at 1fc00bf0 -> ffffffff
      mpsse-icsp-012: read word at 1fc00bf4 -> ffffffff
      mpsse-icsp-012: read word at 1fc00bf8 -> ffffffff
      mpsse-icsp-012: read word at 1fc00bfc -> 7fffffff

    jtag の方も Boot memory の表示までは行く。どうも変なバグを入れてしまったようだ。よく無限ループに落ちいる。

    ところで、デフォルトのコンフィグは、PGEC1/PGED1 を使うようになっているのだが、ICSP のコネクタは PGEC3/PGED3 にしている。PIC32-PINGUINO-MX220 と同じにしたわけだ。で、コンフィグを書き換えてみたところ、 PGEC3/PGED3に切り替わった。一応1回は書けたわけだ。だが、その後 無限ループに落ちいるようになってしまった。

    あと、PIC32-PINGUINO-MX220 のコンフィグは、PGEC1/PGED1 のままだった。コネクタまで付けているのにひどい話だ。(間違い --- 確認したところ PGEC3/PGED3 の設定になっていた。で、この設定では PGEC1/PGED1 も使えたので誤解していた。)

    この無限ループさえなんとかすれば、使えるようになるかも知れない。ただ、最も使われるであろう syncbb-icsp は、まだ動いていない。付加回路の部分がまずいのか、単なるバグかはまだ不明。いずれにしても 解決はすぐだろう。

    pic32prog-r62-ftdi-05.zip

    PIC32-PINGUINO-MX220 からダウンロードした HID ブートローダを試しにそのまま書いてみたら書けてしまった。... 壊してしまった PIC32-PINGUINO-MX220 が復活し、自作 PIC32MX-typeB 基板も HID ブートローダが使えてしまった。いまのところ mpsse-icsp しか実績がないが、一応公開しておく。

    syncbb-icsp も動いたら 別途公開するつもり。

    追記: 上記 05版 そのままで、 syncbb-icsp は動いた。確認は UM232H で行ったが、AE-UM232R や 一般の FT235R で 問題ないはず。 付加回路は、秋月で買った DTC144 に 4.7KΩで OUT をプルアップしたもの。保護に使った抵抗は 120 Ω。結局テスト用に用意した AE-UM232R は、ボロボロだったようで役に立たなかった。基板まで作ったのに、ブレッドボード + UM232H だけでのテストになった。

    後は JTAG だが、動きそうな気がする。



    ちょっと説明。例えば AE-UM232R だとこういう接続で良いはずなのだ。追加パーツは、4.7K と デジトラ。結線は 3 本のみ。GND の結線も不要 (USB 側でつながっている場合)
    使い方は、
     pic32prog -t syncbb-icsp-0175 -DD

    これでいけるはず。

付録) シーケンス表

    SENDING SEQUENCE (MEMO)

    SYNCBB_JTAG ( 2 bytes out / 2 bytes in) x bits

    +------+------+
    TCK | 1 | 0 |
    +------+------+
    TDI | TDI | TDI |
    +------+------+
    TDO | TDO | Z |
    +------+------+
    TMS | TMS | TMS |
    +------+------+
    SYSRST | | |
    (/MCLR) +------+------+

    MPSSE_JTAG ( 6 or 7 bytes out / 1 byte in) x bits

    READ
    +------+------+------+
    TCK | - | 1 | 0 |
    +------+------+------+
    TDI | - | TDI | TDI |
    +------+------+------+
    TDO | TDO | Z | Z |
    +------+------+------+
    TMS | - | TMS | TMS |
    +------+------+------+
    SYSRST | | | |
    (/MCLR) +------+------+------+

    SYNCBB_ICSP ( 8 bytes out / 8 bytes in) x bits

    +------+------+------+------+------+------+------+------+
    TCK | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 |
    (PGC) +------+------+------+------+------+------+------+------+
    TDI | ~TDI |~TDI |~TMS |~TMS | 0 | 0 | 0 | 0 |
    (PGD_OUT) +------+------+------+------+------+------+------+------+
    TDO | Z | Z | Z | Z | Z | Z | TDO | Z |
    (PGD) +------+------+------+------+------+------+------+------+
    SYSRST | | | | | | | | |
    (/MCLR) +------+------+------+------+------+------+------+------+

    MPSSE_ICSP ( 24 or 25 bytes out / 1 byte in) x bits
    READ
    +------+------+------+------+------+------+------+------+------+
    TCK | 1 | 0 | 1 | 0 | 1 | 0 | - | 1 | 0 |
    (PGC) +------+------+------+------+------+------+------+------+------+
    TDI | TDI | TDI | TMS | TMS | Z | Z | TDO | Z | Z |
    (PGD) +------+------+------+------+------+------+------+------+------+
    SYSRST | | | | | | | - | | |
    (/MCLR) +------+------+------+------+------+------+------+------+------+


    --------------------------------------------------------------
    SEND KEY SEQUENCE (ICSP only)

    SYNCBB_ICSP ( 65 bytes out / 65 bytes in)


    +------+------+ +------+------+------+
    TCK | 0 | 1 | | 0 | 1 | 0 |
    (PGC) +------+------+ +------+------+------+
    TDI |~MSB |~MSB | ..... | ~LSB |~LSB | 1 |
    (PGD_OUT) +------+------+ +------+------+------+
    TDO | Z | Z | | Z | Z | Z |
    (PGD) +------+------+ +------+------+------+
    SYSRST | 0 | 0 | | 0 | 0 | 1 |
    (/MCLR) +------+------+ +------+------+------+

    MPSSE_ICSP ( 195 bytes out / 0 byte in)

    +------+------+ +------+------+------+
    TCK | 0 | 1 | | 0 | 1 | 0 |
    (PGC) +------+------+ ------+------+------+
    TDI | MSB | MSB | ..... | LSB | LSB | 0 |
    (PGD) +------+------+ ------+------+------+
    SYSRST | 0 | 0 | | 0 | 0 | 1 |
    (/MCLR) +------+------+ +------+------+------+

付録) ピンアサイン 表

    AE-UM232R と UM232H
     

    PIC32MX-TypeB / PIC32-PINGUINO-MX220

    RA0 (x)AREF PGED3
    o GND
    o D13
    o D12
    RST(o) RB5 (o)D11 TMS
    3V3 o RA1 (x)D10 PGEC3
    5V o o D9
    GND o RB7 (o)D8 TDI
    GND o
    -- o -- o D7
    -- o D6
    A0 o -- -- o D5
    A1 o -- -- o D4
    A2 o RB0 RB9 (o)D3 TDO (*1)
    A3 o RB1 RB8 (o)D2 TCK (*1)
    A4 o RB2 o D1 TDO (*2)
    A5 o RB3 o D0 TCK (*2)

    (*1) PIC32MX-TypeB (my bourd)
    (*2) PIC32-PINGUINO-MX220 (Olimex)

関連記事
posted by すz at 21:50| Comment(1) | TrackBack(0) | PIC32MX
この記事へのコメント
Programmer for Microchip PIC32 microcontrollers, Version 1.exported
Copyright: (C) 2011-2012 Serge Vakulenko
syncbb-icsp-0176 Pin Assignment :
TCK (PGC) 0
TDI (PGD_OUT) 1
TDO (PGD) 7
TMS -1
/MCLR 6
FTDI adapter: found (FT232R USB UART) mode (syncbb-icsp-0176)
syncbb-icsp-0176: latency timer: 2 msec
syncbb-icsp-0176: requested bit_clk: 500000 Hz
syncbb-icsp-0176: set baud 115200
drain : to_drain 0 rlen 0
## ftdi_reset_pulse
write : to_write 3 to_drain 3 to_read 0 v 0 rlen 3
## ftdi_send_key 0x4d434850
write : to_write 66 to_drain 69 to_read 0 v 0 rlen 66
drain : to_drain 69 rlen 69
## mpsse_send :TTTTT0T000000000000000000000000000000000TT0
to_write 344 to_drain 64 to_read 280 v 32
write : to_write 344 to_drain 64 to_read 280 v 32 rlen 344
drain : to_drain 64 rlen 64
read : to_read 280 v 32 rlen 280
syncbb-icsp-0176: idcode 00000100
IDCODE=00000100 - incompatible CPU detected.
drain : to_drain 0 rlen 0
## ftdi_reset 0
write : to_write 1 to_drain 1 to_read 0 v 0 rlen 1
No target found.
わかりません
ご教授ねがいます
Posted by マイコン初心者 at 2014年02月02日 10:49
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/57118986
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック