LPC1114FN28/102 (22) -- ICSP 接続で PIC32MX のフラッシュに書き込む (7)

LPC1114 用のプログラムができました。 Yahoo! ボックス上においてあります。(→ こちら)
とりあえず、HEX パッケージのみを公開します。
ソース・パッケージは近日公開の予定です。
(2012/12/30 追記: ソース・パッケージを公開しました。それにともない、HEX パッケージは削除しました)
まだ「自前」の PIC32MX 用プログラムがないので、「ケンケン」さんの PIC32MX 用 NTSC カラーコンポジットビデオ信号出力プログラム (→ こちら) などを書き込んで確認しました。
カラーシューティング・ゲーム「ロペー」のプログラム・サイズは 二十数 KB 程度あり、これが動作したので、書き込みは多分大丈夫だと思います。
ただし、対象のデバイスが PIC32MX120F032B であるのに対し、試してみたのが USB 内蔵の PIC32MX220F032B なので、キー入力用のポート 1 本と、サウンド出力用のポート 1 本が使用不可になり、全機能のテストはできていません。
HEX パッケージ内の readme.txt ファイルの内容を下に示します。

LPC1114FN28/102 を使った PIC32MX 用フラッシュ・プログラマ

(別名: 110 円マイコンで 220 円マイコンに書き込むプロジェクト)

2012 年 12 月 29 日 (暫定版 HEX パッケージ) pcm1723

●はじめに

これは、 600 mil 28 ピン DIP パッケージの LPC1114FN28/102 マイコン (秋月価格 110 円) を使って 300 mil 28 ピン DIP パッケージの PIC32MX220F032B (秋月価格220 円) などの小容量 PIC32MX マイコンのフラッシュに書き込むためのソフトウェアです。
ブート・フラッシュ・サイズが 3 Kバイト (flash row size が 32 ワード) の品種 PIC32MX1XX/2XX) のみに対応しています。

プログラムは Serge Vakulenko 氏の「pic32prog」を参考にし、一部はそのまま利用しています。

PIC32MX とは 2 線式 ICSP インターフェースで接続し、ホスト PC とは (レガシー)シリアル・ポート、あるいは USB - シリアル接続ケーブルを使ってつなぎます。 通信速度は 115200 bps 固定です。

ホスト PC 上のフラッシュ書き込みアプリケーションとしては、Microchip 社のアプリケーション・ノート AN1388 に付属する Windows 用のプログラム「PIC32UBL.exe」を使います。

このパッケージには含まれませんから、別途、Microchip 社の web サイトからダウンロードしてください。 「AN1388」で検索すると見つかる項目の、「AN1388 Source Code」の ZIP アーカイブの中に実行ファイルも含まれています。

●ハードウェア

LPC1114 は内蔵 12 MHz RC クロックで動作する設定になっていますから、特に水晶振動子を接続する必要はありません。

LPC1114 と PIC32MX との間のインターフェースに必要なハードウェアとしては、抵抗 4 本と、接続用のケーブル、コネクタだけです。

PIC32MX 側には PGEC1/PGED1、PGEC2/PGED2、PGEC3/PGED3 の 3 組の ICSP 端子がありますが、どのペアに接続してもかまいません。
外部回路からドライブされる端子だと ICSP と干渉して誤動作する可能性がありますから、外部回路の影響のない端子を選びます。

ICSP クロックの周波数は 1 MHz です。

2 線式インターフェースですが、MCLR 端子も制御する必要があるので、1 番ピンの MCLR にもつなぎます。

PIC32MX のコンフィギュレーションで外部クロックを使用する設定になっていても、フラッシュ書き込み時には常に内部クロックを使用するので、PIC32MX に外部クロックをの接続しておく必要はありません。

PC 側との接続は RS232C インターフェース用の IC を介する必要があります。 USB - シリアル変換モジュールの出力が 3.3 V ロジック・レベル出力 (正論理) であれば直結できます。

LPC1114 に「Flash Magic」でプログラムを書き込める環境であれば、すでにシリアル接続されているはずです。

参考回路図として「ICSP1114.pdf」を添付しました。

PC 側のインターフェースとして、3.3 V 電源対応のチャージ・ポンプ付き RS232C インターフェース IC を使い、PIC32MX 側は PIC32MX220F032B の PGEC2 (22 番ピン) / PGED2 (21 番ピン) 端子に接続する例です。

すべての回路の電源は同一の 3.3 V 電源に接続されるものとしています。

LPC1114 側と PIC32MX 側が物理的に別々の電源で、その投入のタイミングも異なる場合の回路の保護については考慮してありません。

●ソフトウェア

LPC1114 用のプログラムの本体は HEX ファイル「icsp1114.hex」であり、これを「Flash Magic」などを使って LPC1114FN28/102 に書き込みます。

プログラム・サイズは 7 K バイト程度、RAM は 2 K バイト程度使っています。

このプログラムが、あたかも PIC32MX に書き込まれたブートローダのように振る舞って、ホスト PC 上の PIC32UBL.exe と通信して PIC32MX には ICSP 経由で書き込みます。

ブートローダのように振る舞いますが、本当のブートローダではないので、PIC32MX に書き込むべきプログラムとしては、ブートローダなしで「自力」でリセット・ベクタから立ち上がる、「普通」の構成にする必要があります。

●PC アプリケーション PIC32UBL の操作方法

PIC32UBL はシリアル、USB HID、イーサネット経由での接続に対応しており、立ち上げるとウィンドウ左側に接続先を選択するパネルが出ます。

シリアルの設定は左上側にあり、最初は必ず「COM1」「115200 bps」が選択された状態で起動します。
シリアル・ポートは COM1 から COM9 までの対応なので、USB - シリアル・ケーブルで COM10 以上になってしまう場合には利用できません。

通信速度は 115200 bps が上限です。 icsp1114 では通信速度は 115200 に固定なので、「115200」以外を選ぶと動作しません。

ウィンドウの右側が操作パネルで、下半分がメッセージの表示、上半分がボタンとなっています。

まず、右下の「Connect」ボタンを押すとブートローダ (実は LPC1114 上のプログラム) と通信を開始し、ブートローダバージョンを表示します。 これは表示だけで、PIC32UBL 側は何のチェックもしません。

接続されているデバイスについても無関心で、これでは不便なので、バージョン番号としてデバイスの情報を返すようにしてあります。

バイス、デバイス ID、バージョン番号の対応表を示します。

バイス Dev ID Ver
PIC32MX220F032B 0x04A00053 10.0
PIC32MX210F016B 0x04A01053 10.1
PIC32MX120F032B 0x04A06053 10.6
PIC32MX110F016B 0x04A07053 10.7

バイス ID の b24..b20 をバージョン番号の整数部、b15..b12 をバージョン番号の小数部としています。

この表示が正しくない場合には、デバイスとの接続がうまく行われていません。

PIC32UBL では、ブートローダ側からエラーのステータスを返すという概念はなく、処理が正常に終了したという応答がなければ規定の回数リトライを繰り返し、それでも正常終了の応答がなければタイムアウトとしてあきらめるという作りになっています。

したがって、デバイスとの接続がうまく行かない場合には、PIC32UBL 側の操作だけでエラーから回復することはできません。

PIC32UBL の左上のボタンに「Bootloader Ver」というのがありますが、これを押してもバージョン番号を表示させることができます。 
ただし、実行すると HEX ファイル名が未設定の状態に戻ってしまいます。

通常のフラッシュ書き込み操作としては、パネル上部中央にある「Load Hex File」ボタンを押して開くダイアログで HEX ファイルを選択し、左下にある「Load-Program-Verify」ボタンを押して、消去-書き込み-ベリファイを連続して実行させます。

「Verification Successfull」というメッセージが出れば書き込み成功です。
ただし、ブート・フラッシュおよびコンフィグ領域 (0x1FC00000 〜) に対してはベリファイは行われません。

書き込みが完了すると、グレーアウトされていた「Run Application」ボタンが有効になり、それを押すと、書き込まれたプログラムが走り始めます。