私は今までワンチップマイコンでは、主に AVRマイコンを使っていまして、
PICマイコンは使ったことがなかったのですが、こちらのサイト
「自分で作るDCCデコーダ - ワンコインデコーダ6(Web Nucky)」では、
DCCデコーダ用に PICマイコン(PIC12F1822)が使われていましたので、
それのファームの書込み環境を Seeeduino XIAOで作ってみました。
MPLAB PicKit 4 やMPLAB SNAP などの純正ライタは、
お試しで気軽に買える値段ではないですしね。
■ ファームの書込み仕様
ファームの書込み仕様は、PIC12F1822マイコンのサイトにあります
「PIC12(L)F1822/PIC16(L)F182X Memory Programming Specification」を
見まして、LV-ICSP (Low Voltage In-Circuit Serial Programming)モードのみに
対応することにしました。
■ Seeeduino XIAOと PIC12F1822マイコンの接続
当初は Seeeduino XIAOの SPI機能を使った通信を考えていましたので
SPIピンと接続しましたが、ICSPの 6ビットのコマンドを
送信できないことが分かり、結局 GPIOによるソフトウェア制御にしたため、
GPIOの割当て設定を変えればどのピンと接続しても大丈夫です。
Seeeduino XIAO | - | WIRE | PIC12F1822 | ||
---|---|---|---|---|---|
3V3 | 3V3 | - | RED | 1-pin | VDD |
GND | GND | - | BLACK | 8-pin | VSS |
D7 | GPO (SPI.CSn) | - | YELLOW | 4-pin (RA3) | nMCLR |
D8 | GPO (SPI.SCK) | - | BLUE | 6-pin (RA1) | ICSPCLK |
D9 | GPI (SPI.MISO) | 4.7 kΩ | GREEN | 7-pin (RA0) | ICSPDATA |
D10 | GPO (SPI.MOSI) | 4.7 kΩ |
■ Seeeduino XIAOのプログラム
ファームの書込み環境を準備することは手段であって目的ではないため、
Seeeduino XIAOのプログラムのために別途開発環境のインストールが
必要になることは避けたく、その必要のない CircuitPythonで作成しました。
ただ、CircuitPythonのスクリプトファイル(main.py)と、
書込むファームのイメージファイル(image.hex)を
CIRCUITPYドライブにコピーするだけで済むようにしたかったのですが、
途中でメモリ不足になってしまったため、
残念ながら Intel HEXフォーマットのパース処理は削除して、
事前に変換した専用イメージファイルをコピーすることにせざるを
得ませんでした。
最終的に書込み作業は下記の流れで行うことになりました。
コピーとシリアルコンソールの作業も PowerShellスクリプトで行えば
よいのですが、そこはやる気がなくなりました。
(1) パソコンで PowerShellスクリプトを実行して、
Intel HEXイメージファイル(.hex)から、PIC12F1822マイコンの
プログラム領域/データ領域/コンフィグレジスタ設定に分けた
3つの専用イメージファイル(.program/.data/.config)に変換する。
(2) CircuitPythonのスクリプトファイルと変換した専用イメージファイルを
Seeeduino XIAOの CIRCUITPYドライブにコピーする。
(3) パソコンのシリアルコンソールで Seeeduino XIAOを操作して、
PIC12F1822マイコンのファーム書込みを行う。
■ 専用イメージファイルの変換
元の Intel HEXイメージファイル: image.hex
:020000040000FA
:020000000428D2
:080008008C0123008C01210092
:100010007A30990021000C308C0022009D141D14B0
:10002000250091010830BF23AB00AB1D1C28200028
…
:020000040001F9
:02000E00A40943
:02001000FF3CB3
:10E000000300000000000000FF0000005C009C0016
…
変換後の専用イメージファイル
image.hex.program | image.hex.data | image.hex.config |
|
|
|
■ Seeeduino XIAOの操作
CircuitPythonのスクリプトファイルを CIRCUITPYドライブにコピーすると
自動的にスクリプトが実行され、
PIC12F1822マイコンを LV-ICSPモードへ遷移させてコンフィグ設定を
読み出します。
Adafruit CircuitPython 7.3.2 on 2022-07-20; Seeeduino XIAO with samd21g18
>>>
soft reboot
Auto-reload is on. Simply save files over USB to run them or enter REPL to disable.
main.py output:
User ID Location : 3FFF 3FFF 3FFF 3FFF
Device ID : 2700 (REV: 09)
Configuration Word : 3FFF 3FFF
Calibration Word : 28F1 1A8C
# PIC16F1xxx LV-ICSP Programmer
MI/MO : Enter/Exit LV-ICSP Mode
RP/RD/RC : Read Program/Data/Configuration Memory
EP/ED : Erase Program/Data Memory
WP/WD/WC : Write Program/Data/Configuration Memory
>
WP、WD、WCのコマンドを実行して、
プログラム領域/データ領域/コンフィグレジスタ設定を書込みます。
> wp
0000: 2804 3FFF 3FFF 3FFF 018C 0023 018C 0021 307A 0099 0021 300C 008C 0022 149D 141D
0010: 0025 0191 3008 23BF 00AB 1DAB 281C 0020 30FF 009B 0020 2821 0020 307F 009B 0020
0020: 2821 0020 300B 052B 009C 0020 018C 01B7 01BF 0020 301D 23BF 00B0 18B0 284B 0837
0030: 1903 2842 3001 23BF 00A9 0237 1803 283A 0829 00B7 3004 23BF 00AA 0237 1C03 2842
…
> wd
0000: 0003 0000 0000 0000 00FF 0000 005C 009C 0000 0000 0000 0000 0001 0000 0000 0000
0010: 00C0 0080 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0002 0000 0000 0000
0020: 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0030: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
…
> wc
RP、RD、RCのコマンドを実行して、
プログラム領域/データ領域/コンフィグレジスタ設定を読出します。
ベリファイ機能はありませんので自分で確認します。
> rp
0000: 2804 3FFF 3FFF 3FFF 018C 0023 018C 0021 307A 0099 0021 300C 008C 0022 149D 141D
0010: 0025 0191 3008 23BF 00AB 1DAB 281C 0020 30FF 009B 0020 2821 0020 307F 009B 0020
0020: 2821 0020 300B 052B 009C 0020 018C 01B7 01BF 0020 301D 23BF 00B0 18B0 284B 0837
0030: 1903 2842 3001 23BF 00A9 0237 1803 283A 0829 00B7 3004 23BF 00AA 0237 1C03 2842
…
> rd
0000: 0003 0000 0000 0000 00FF 0000 005C 009C 0000 0000 0000 0000 0001 0000 0000 0000
0010: 00C0 0080 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0002 0000 0000 0000
0020: 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0030: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
…
> rc
User ID Location : 3FFF 3FFF 3FFF 3FFF
Device ID : 2700 (REV: 09)
Configuration Word : 09A4 3CFF
Calibration Word : 28F1 1A8C
■ ICSP通信波形
最後にオシロで測定した ICSP通信波形です。
CH1(赤色)がクロック ICSPCLK で、CH2(黄色)がデータ ICSPDAT です。
PIC12F1822マイコンを LV-ICSPモードへ遷移させるために、
キーシーケンスとして 0x4D434850 ("MCHP"のASCIIコード)のデータを
LSB Firstで送信するのですが、32ビット分のクロックとデータを送信した後に、
クロックをもう 1ビット送信して計 33ビットのクロックが必要なことがミソです。
以上です。