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

「110 円のマイコンで 220 円のマイコンに書き込む」シリーズの 3 回目ですが、「書き込む」側と「書き込まれる」側を明確にするために、タイトルを少し変えました。
進展としては、いわゆる「LED チカチカ」プログラム (Microchip 社のコンパイラ XC32 に付属のサンプル・プロジェクト「Explorer16PIC32MX_1 」のターゲットを PIC32MX220F032B に変更してコンパイルしたもの) の書き込みに成功して、PIC32MX 上で正常に動作しました。
と言っても、独立したフラッシュ・プログラマとして機能するプログラムができたわけではなく、LPC1114 の C ソース・ファイルの中に PIC32MX のプログラムのオブジェクトを初期値付き定数配列として抱えて、それを書き込むだけのものです。
ともかく、この方式で実現できるめどが立ったので、あとはホスト PC 上で実行する「pic32prog」と、LPC1114 のプログラムとの間での機能の分担を考えていくことになります。
ここで、話を ICSP の説明に戻します。
コンフィギュレーションでディスエーブルされていない限り、4 線式 JTAG はリセット後から何の操作もしなくても常に利用可能になっています。
それに比べ、2 線式 ICSP では、ICSP を利用可能にするための信号シーケンスを入力する必要があります。
その信号のようすを表した図を下に示します。


これは

PIC32MX Flash Programming Specification
(DS61145 Revision K, July 2012)

の 20 ページの「FIGURE 7-1」に一部修正を加えたものです。
細かい時間パラメータを省略し、一部のパラメータだけを残し、その具体的な値を添えたものです。
文章で説明すると、

  1. \overline{\small\rm MCLR} = L の状態から
  2. 1 μs 以下の立ち上がり時間で \overline{\small\rm MCLR} = H の状態とし、
  3. 500 μs 以下の間 H を維持し、
  4. 再び \overline{\small\rm MCLR} = L の状態とする
  5. PGEDx / PGECx に 32 ビットの「キー・シーケンス」を MSB ファーストで入力する
  6. 0.5 μs 以上の間隔をおいてから ICSP での操作に移る

ということになります。
PGEDx / PGECx へのシリアル入力は SPI モード 0 に相当します。
つまり、PGECx の立ち下りで PGEDx が変化し、PGECx の立ち上がりでターゲットは PGEDx をサンプルし取り込みます。
これは、ICSP モードに移ってからの TDI / TMS のタイミング (SPI モード 1) とは異なっています。
「キー・シーケンス」は 16 進数で 0x4D434850 で、これは文字列 "MCHP" を ASCII コードで表現したものになっています。
PGECx の最高クロック周波数は 10 MHz (周期は 100 ns) で、図示していない細かいタイミングの最小値は 40 ns とか 100 ns の程度で、ほとんど気にする必要はありません。
この中で問題になりそうなのは、 \overline{\small\rm MCLR} = H を維持する期間の最大値 0.5 ms です。

USB - シリアル変換ケーブルを使うと、時間的に連続した 2 つのシリアル・データであったとしても、最悪の場合、それぞれが別々の USB フレームに割り振られる可能性があり、結果として両者が 1 ms 程度離れて到着する可能性があります。
つまり、 \overline{\small\rm MCLR} の上げ下げを、それぞれ独立したコマンドとしてシリアルで送ると、その持続時間が 1 ms に達する可能性があるということです。
したがって、ひとつのコマンドで \overline{\small\rm MCLR} = L → H → L というシーケンスを実現する必要があります。
LPC1114 のプログラムで発生させた、キー・シーケンス部分の波形写真を下に示します。

上のトレースが PGEDx、下のトレースが PGECx です。
キー・シーケンスの最初の部分を拡大したもので、
"M" = 0x4D = 0b01001101
の付近が見えています。
このシーケンスは 2-wire 4-phase ICSP のシーケンスとは別であり、ICSP にハードウェア SPI を使う場合でも、キー・シーケンスに対してハードウェア SPI の使用が強制されるわけではありません。
キー・シーケンスはソフトウェアで IO ポートを操作して発生させ、ICSP モードに移ってからハードウェア SPI を使用してもかまいません。
ここでは、キー・シーケンスもハードウェア SPI を使っており、16 ビット転送、 SPI モード 0 に設定しています。