SNSへはこちら

Mac(とLinux)でPIC32MXを動かす

最近 PIC に手を出しているということですが、ついこの間 PIC32MX マイコンなるものを発見してしまいましたので手を出してみました。

例によって PICKit なんて買ってやるかコンチクショーの精神で色々頑張りました。おそらく Linux でも kextunload の箇所を除けば同じように出来ると思います。

PIC32MX とは

昔からある、言わずと知れた由緒正しき PIC アーキテクチャ...は積んでいません。PIC32MX ではこのアーキテクチャを捨て、32bit マイコンとなったのです。それではどのアーキテクチャなのかというと、MIPS なんですねえ。丁度僕が大熱血!!アセンブラ入門で読んだんですけど、同じアーキテクチャでした。この本を読んでいない方でも、情報系や電子系の方なら知っている方が多いと思います。

この PIC32MX 以外に MIPS マイコンはあるのかな〜と思ってググりましたが出てこず。今回はこの MIPS マイコンである PIC32MX マイコンに目を向けました。
また、このマイコンは旧来の PIC の用に高電圧プログラミングは出来ませんので、高電圧発生回路を作る必要はありません。よって、書き込み回路も簡単にすることが出来ます

開発環境

コンパイルまでの過程はおなじみ MPLAB X でできます。コンパイラは XC32 コンパイラ。
また、MIPS ということで、mips-elf-gcc を自分でビルドして用いることも出来ます。が、僕はまだ gcc を使って開発をしたことがありません。一応 sudo make install するところまでは終わりました。

書き込み環境がまたしても大きな壁になるのですが、こちらは以下のサイトを参考にして回路を考えました。

使用ソフトはすzさんの施した改造版の pic32prog で、2つ目のリンクからダウンロード出来ます(バージョンは pic32prog-r62-ftdi-05)。

書き込み回路の製作

すzさんによりますと、このライタは FTDI のチップを用いることが出来るとのこと。BitBang を使用していて、FT2232 や FT232 や FT245 での使用が可能とのことです。2つ目のリンクのコメントに「FT245R でできたよ」との報告がありました。だったら FT232RL でも出来るはずです

改造版 picprog を見ると、README-ftdi.txt と言うファイルに FTDI チップの繋ぎ方が書いてあります。その中で動作確認が出来ているという BitBang での結線方法を見ると...

こんな記述が。自分は 74HC541 というトライステートバッファを持っていたので、この回路図通りトライステートインバータではありませんが、トランジスタと抵抗でインバータを作って対応しました。実際に書き込み成功できています。
しかしながら「このために複数回路が入っているバッファを使うのもなあ」とか、「そんな IC 持ってない」と思われる方もいると思いますので、トランジスタと抵抗で今回の場合のバッファを作ります。こちらも動作確認出来ていて、ライタ回路として採用しました。

要は DCD = High で PGED = Low、DCD = Low で PGED = RXD を実現すればいいので、こんな感じの回路になりました。この線は実際のデータが行ったり来たりするため、このような構造を必要とします。RXD はフローティングにならないように、先程の回路図の指示通りプルアップです。なお PGED にもプルアップが別途必要となります。あ、あと DCD の入力にも必要ですよね。
結局のところ、説明のファイルのバッファを上のトランジスタ+抵抗に置き換えればOKですね。これで回路が完成しました。使った FT232RL モジュールは秋月の物を使用します。抵抗値を含めた回路図は以下。黒枠が FT232RL から持ってくる配線、水色枠が PIC32MX へ伸ばすピンとなっています。

改造版 pic32prog の改造

僕が用意した PIC32MX は以下のものとなっています。

電子部品,通販,販売,半導体,IC,LED,マイコン,電子工作PICマイコン PIC32MX270F256B-50I/SP秋月電子通商 電子部品通信販売

んで、こちらがなんとこのソフトに対応していないんですよ。正確には、デバイス識別のデータベースに入っていないと言うだけです。なのでデータシートを見ながら情報を追記しちゃいましょう。target.c を開いて、以下の行を 39行目あたりの構造体配列内に追加します。

    {0x26600053, "MX270F256B",  256,  3, 1}, // ADD

この状態で make してもらえば対応できます。

実際の書き込み

まず、この書き込みソフトは BitBang を使用しますので、FTDI のドライバを kextunload -b しておいてください。

# どちらかを打ち込む
$ sudo kextunload -b com.FTDI.driver.FTDIUSBSerialDriver
$ sudo kextunload -b com.apple.driver.AppleUSBFTDI

以下、pic32prog がパスの通っている場所にあると仮定します。まず単に pic32prog と打ち込むと結線が正しければデバイス情報が出てきます。

$ pic32prog
Programmer for Microchip PIC32 microcontrollers, Version 1.Unversioned directory
    Copyright: (C) 2011-2012 Serge Vakulenko
      Adapter: syncbb-icsp
    Processor: MX270F256B (id 26600053)
 Flash memory: 256 kbytes
  Boot memory: 3 kbytes

第一引数に hex ファイルを指定すれば書き込みが行われるというわけです。完了後は自動でリセットされて、プログラムが動き出します。

$ pic32prog ~/MPLABXProjects/LEDChika32.X/dist/default/production/LEDChika32.X.production.hex
Programmer for Microchip PIC32 microcontrollers, Version 1.Unversioned directory
    Copyright: (C) 2011-2012 Serge Vakulenko
      Adapter: syncbb-icsp
    Processor: MX270F256B
 Flash memory: 256 kbytes
  Boot memory: 3 kbytes
         Data: 17360 bytes
        Erase: done
Program flash: #################### done
 Program boot: #### done
 Verify flash: #################### done
  Verify boot: ### done
Rate: 538 bytes per second

書き込みが成功しない方へ

思いの外見てくださっている方が多いので、追記します。書き込みが成功しない方へのトラブルシューティングです。

PGED, PGEC を間違えている

すごく初歩的ですが、慣れた方でも思い込みによる結線間違いが結構あると思います。TXD <--> RXD のようにクロスしてしまっていませんか?

ちゃんと kextunload できていない

したつもりでも、エラーで出来ていなかったりします(名前の打ち間違い、コピペミス等)。また、FTDI 社謹製のドライバをインストールしている方は、一度 FTDI.driver.FTDIUSBSerialDriver を無効化しても、知らないうちに com.apple.driver.AppleUSBFTDI がしゃしゃり出てくることがありますので、合わせて確認してください。

プルアップ抵抗を忘れている

これ案外ありがちです。RXD と PGED には必須なので面倒でも付けましょう。

電源が発振している

パスコンをサボっているとなることがあります。確かに秋月のモジュールにはパスコンがありますが、念のため付けておくのがよろしいかと思われます。また、USB ケーブルが異常に長い場合は通信速度を律速してしまいますので、1m くらいの物を使いましょう。

Vcap を無視している

ピン配置図に Vcap というのがあるというのはご存知でしょうか。こちらには Vss へコンデンサを介して接続する必要があります。ここを無視するとイレースまではうまくいきますが、書き込みのフェーズに入れずエラーで終了してしまいます。0.1uF 〜 10uF を入れてあげましょう。