2011年4月16日作成 2010年4月17日更新
PICプログラマを作ったときに調べた書き込み手順を、自分が忘れてしまわないうちに書いておきます。
マイクロチップ社のデータシート(PIC24FJXXXGA0XX Flash Programming Specification 39768d)にすべて書かれているので、まずはそれを読みます。
PIC24FJXXXGA0XXシリーズは書き込みに高電圧を使用しないので、書き込み回路がらくちんです。
PIC24のICSPはPIC16のような書き込みや消去のコマンドが無く、CPUの機械語を1ワード送信してはそれを実行するという動作を繰り返してフラッシュメモリに書き込んでゆきます。そのため、PIC16と比べると通信量がだいぶ多くなります。
Enhanced ICSPでは、あらかじめ通常のICSPモードで書き込み用のファームウェアを専用のフラッシュメモリに書き込んでから、そのファームウェアと通信しながら書き込んでゆきます。CPUの機械語を1ワードずつ送信・実行する必要がないので、高速に書き込みする事ができます。
今回作成したプログラマでは、面倒なのでEnhanced ICSPモードには対応していません。
PICへ機械語を1ワード送るコマンドと、PICからVISIレジスタの内容を受信するコマンドの二つしかありません。
クロック同期式のシリアル通信で、クロックの立ち上がりでデータ有効です。(PIC16と異なります)
PICへ機械語を1ワード(24ビット)送ります。
コマンドの部分は4ビットですが、ICSPモードに入った直後の一回目のみ9ビット送らなければなりません。面倒なのでICSPに入った直後にNOPを一つ送っておけばよいようです。
PICからVISIレジスタの内容(16ビット)を受信します。
たとえば、チップイレーズは
このように機械語を1ワードづつ送り行います。書き込みや読み出しも同じようにプログラムを1ワードづつ送って行います。
データシートには、上の表のように手順が載っているので、そのとおりに行えばよいでしょう。
書き込みのラッチは64ワードあるのですが、このうち一部にだけデータをセットして書き込みを行うと、(以前のデータが残って?)余計なデータ(ゴミ)がフラッシュメモリに書き込まれてしまったので、データの無いところは0xFFFFFFで埋めて64ワードすべてにデータをセットしてから書き込みを行うようにしました。
PIC24FJ64GA002でLEDを点滅させるプログラムのHEXファイル
ベクタテーブルの定義が含まれるので、短かいプログラムでもサイズがすこし大きい。pic24f_test.hex
:020000040000fa
:080000000002040000000000f2
:020000040000fa
:100400000f802000007f2200000188000000000013
(省略)
:020000040000fa
:020000040001f9
:0457f800af78000086
:020000040000fa
:020000040001f9
:0457fc007f3f0000eb
(省略)
:020000040000fa
:040578000000fe0081
:00000001FF
数はすべて16進。2文字で1バイトを表す。
:
行頭は必ず':'で始まる08
この行に含まれるデータの数(この場合4バイト)0000
オフセットアドレス。アドレス32ビットの下位16ビットを示す(ビッグエンディアン)この値と拡張リニアアドレスレコードの値を合わせたものを1/2したのがPICの実際のアドレスになる
00
レコードタイプ00はデータレコード
0002040000000000
データ上のデータの数の通り8バイトあり、4バイトで1ワードを示す。リトルエンディアンなのでこの場合
となる。PIC24は1ワード24ビットなので、実際には上位8ビットを無視する。
PIC24のアドレスは1ワードで2進む。
f2
チェックサム1バイトづつ、チェックサム自身も含めてすべての数を加算して下位1バイトが0になれば正常
04
レコードタイプ04は拡張リニアアドレスレコード。32ビットアドレスの上位16ビットを示す
0000
拡張リニアアドレスの値01
レコードタイプ01はファイル終了レコード。「この行で終了ですよ」の意味
('A`)