AoiSaya が 2020年04月19日03時49分17秒 に編集
初版
タイトルの変更
M5StickCを使ってGreenPAKに設計データを焼いてみた
タグの変更
GreenPAK
M5StickC
Burner
本文の変更
# はじめに 前回、チョットした回路を組むのにGreenPAKのSLG46826っていうデバイスが便利っていう記事を書きました。 https://elchika.com/article/6ddfba55-fa3e-436b-b603-69478b6b450d/ だけど、デザインファイル(設計データ)を焼くための開発ボードがちょっとお高い。 公式サイトでarduinoで焼く方法が紹介されてるけど、arduinoを持ってないと使えない。M5StickCならもってるんだけどなぁという人はきっといるはず。 そこで、arduino用のスケッチを改造してM5StickCで焼く方法を試してみたので紹介します。 # 用意するもの ## 部品 - SLG46826V-DIP または SLG46826VかSLG46826G搭載の自作基板 - M5StickC - Grove 4ピンコネクタ - ジャンパーピン変換ケーブル(オスまたはメス) - ブレッドボード (変換ケーブルがオスの場合に必要) ## ダウンロードするもの - 公式のArduino用スケッチ&ドキュメント https://www.dialog-semiconductor.com/sites/default/files/an-cm-255_slg468246_mtp_arduino_programming_example.zip # 接続方法 ## SLG46826V-DIP (20pinDIP)の場合 - 変換ケーブルを使って、M5StickCとGreenPAKを繋ぎます。 - オスならブレッドボード経由で、メスなら直接DIPソケットにつなぎます。 M5StickCの端子 | SLG46826V-DIPの端子番号 | 機能 :---: | :---: | :---: VOUT | 1 | VDD G33 | 8 | SCL G32 | 9 | SDA GND | 11 | GND ## SLG46826V (20pin STQFN)の場合 - 変換ケーブルなどを使って、M5StickCとGreenPAKを繋ぎます。 - 自作基板でチップに別途電圧を与えている場合は、VDDはつながなくて構いません。 - VDD2は電圧を与えていてもオープンでも問題ありません。 M5StickCの端子 | SLG46826Vの端子番号 | 機能 :---: | :---: | :---: VOUT | 1 | VDD G33 | 8 | SCL G32 | 9 | SDA GND | 11 | GND ## SLG46826G (20pin TSSOP)の場合 - 変換ケーブルなどを使って、M5StickCとGreenPAKを繋ぎます。 - SLG46826GはSLG46826Vと端子番号が異なりますのでご注意ください。 - 自作基板でチップに別途電圧を与えている場合は、VDDはつながなくて構いません。 - VDD2は電圧を与えていてもオープンでも問題ありません。 M5STickCの端子 | SLG46826Gの端子番号 | 機能 :---: | :---: | :---: VOUT | 20 | VDD G33 | 13 | SCL G32 | 12 | SDA GND | 10 | GND # 基本スケッチ ダウンロードした`an-cm-255_slg468246_mtp_arduino_programming_example.zip`には、以下のファイルが含まれています。 ```:zipの中身 AN-CM-255 SLG46824_6 MTP Arduino Programming Example.pdf MTP_Programmer.ino SLG46824_6 MTP Arduino Programming Example.gp6 ``` 「MTP_Programmer.ino」をM5StickC用「GreenPAK_Burner.ino」に改造する方法を説明します。 # スケッチの修正方法 1. まず、「MTP_Programmer.ino」を「GreenPAK_Burner.ino」に名前を変えて保存します。 2. 次に、以下の差分を見ながら修正します。 ## includeファイルの修正 ```:MTP_Programmer.ino #include <Wire.h> ``` ```:GreenPAK_Burner.ino #include <M5StickC.h> ``` ## 書き込むデータの記述方法の変更 M5Stickはメモリ容量に余裕があるので、データの差し替えが楽になる様に変更します。 データの差し替え方法は後で説明します。 ```:MTP_Programmer.ino // Store nvmData in PROGMEM to save on RAM const char nvmString0[] PROGMEM = "010E000000008E3F0300000000000000"; (中略) eepromString15 }; ``` ```:GreenPAK_Burner.ino // Store nvmData in PROGMEM to save on RAM const char nvmData[] PROGMEM ="\ "; // Store eepromData in PROGMEM to save on RAM const char eepromData[] PROGMEM ="\ "; ``` ## setup関数の修正 ```:MTP_Programmer.ino void setup() { Wire.begin(); // join i2c bus (address optional for master) Wire.setClock(400000); Serial.begin(115200); pinMode(VDD, OUTPUT); // This will be the GreenPAK's VDD digitalWrite(VDD, HIGH); delay(100); } ``` ```:GreenPAK_Burner.ino void setup() { M5.begin(); Wire.begin(32, 33); Wire.setClock(100000); Serial.begin(115200); M5.Lcd.setRotation(3); M5.Lcd.setCursor(0, 0, 4); M5.Lcd.print("GreenPAK\n"); M5.Lcd.print("Burner\n"); M5.Lcd.print("ver.0.1"); delay(100); } ``` ## powercycle()に引数を追加 2ヶ所あるので、2ヶ所とも変更します。 ```:MTP_Programmer.ino powercycle(); ``` ```:GreenPAK_Burner.ino powercycle(control_code); ``` ## writeChip関数の変更 データのコピー方法を変更します。 ```:MTP_Programmer.ino if (NVM_selected) { char * ptr = (char *) pgm_read_word (&nvmString[i]); strcpy_P(buffer, ptr); } else if (EEPROM_selected) { char * ptr = (char *) pgm_read_word (&eepromString[i]); strcpy_P(buffer, ptr); } ``` ```:GreenPAK_Burner.ino if (NVM_selected) { memcpy(buffer,&nvmData[i*43+9],32); } else if (EEPROM_selected) { memcpy(buffer,&eepromData[i*43+9],32); } ``` スレーブアドレスの上書き方法を修正します。 (元の記述ではピンによるスレーブアドレス指定が無効になってしまうため) ```:MTP_Programmer.ino data_array[0xC][0xA] = slave_address; ``` ```:GreenPAK_Burner.ino data_array[0xC][0xA] = (data_array[0xC][0xA] & 0xF0) | slave_address; ``` ## powercycle関数の変更 自作基板でも使えるようにソフトウェアリセットに変更します。 ```:MTP_Programmer.ino void powercycle() { Serial.println(F("Power Cycling!")); digitalWrite(VDD, LOW); delay(500); digitalWrite(VDD, HIGH); // Serial.println(F("Done Power Cycling!")); } ``` ```:GreenPAK_Burner.ino void powercycle(int code) { Serial.println(F("Power Cycling!")); // Software reset Wire.beginTransmission(code & 0x78); Wire.write(0xC8); Wire.write(0x02); Wire.endTransmission(); // Serial.println(F("Done Power Cycling!")); } ``` # 書き込むデータの準備 ## 回路設計 「GreenPAK Designer」を使って好きな回路を設計します。 設計が終わったら、セーブしておきましょう。 (フロッピーディスクのアイコンを押すか、[File]-[Save]を選択) 以下の説明では、ダウンロード済みの`SLG46824_6 MTP Arduino Programming Example.gp6`を使って説明します。 1. 「SLG46824_6 MTP Arduino Programming Example.gp6」を「GreenPAK Designer」で開きます。 もし、下記のようなダイアログボックスが表示されたら、[OK]を押してください。 「GreenPAK Designer」のアップデートに伴うものですが、設計データには問題ありません。 ## HEXデータの作成 ### NVMデータ(デザインファイル) 1. [File]-[Export]-[Export NVM]を選択 2. 保存ダイアログが開いたら、「ファイルの種類(T):」で「Intel HEX files (*.HEX)」を選択 3. 「ファイル名(N):」に好きな名前を入力 デフォルトでは*.gp6と同じ名前が表示されるので、変更しない場合はそのままでよい 4. 「保存(S)」をクリックして保存 ### EEPROMデータ EEPROMデータがある場合は、EEPROMデータのHEXデータも作成します 1. [File]-[Export]-[Export EEPROM]を選択 2. 保存ダイアログが開いたら、「ファイルの種類(T):」で「Intel HEX files (*.HEX)」を選択 3. 「ファイル名(N):」に好きな名前を入力 デフォルトでは*.gp6と同じ名前が表示されるので、設計データと重複しないようにする 4. 「保存(S)」をクリックして保存 ### スクリプトへの埋め込み 1. 作成したHEXデータを好きなエディタで開く 2. 上記で作成したスクリプト「GreenPAK_Burner.ino」に中身をすべて張り付ける。 張り付ける場所は、「設計データ」であれば、 ```:GreenPAK_Burner.ino const char nvmData[] PROGMEM ="\ "; ``` の間に、「EEPROMデータ」であれば、 ```:GreenPAK_Burner.ino const char eepromData[] PROGMEM ="\ "; ``` の間に張り付ける。 3. 張り付けたデータのすべての行末に`\`を追加する。 4. 最終的に下記のようになれば、OK。 ```:GreenPAK_Burner.ino const char nvmData[] PROGMEM ="\ :1000000000000000000000000000000000000000F0\ :1000100000000000000000000000000000000000E0\ :1000200000000000000000000000000000000000D0\ :10003000000000000000000000000000000000C4FC\ :100040003FFCC21FFC000000000000000000000098\ :1000500000000000000000000000000000000000A0\ :100060000030300030303030000030303000303080\ :100070000000000000000000000000000000000080\ :1000800000000000001422300C00000000000000FE\ :100090000000000000000000000000000000000060\ :1000A0000000002000010000000201000002000129\ :1000B0000000020100000200010000020100000235\ :1000C000000100000200010000000101000000002A\ :1000D0000000000000000000000000000000000020\ :1000E0000000000000000000000000000000000010\ :1000F000000000000000000000000000000000A55B\ :00000001FF";\ ``` # M5StickCへの書き込み ## コンパイル&書き込み 「GreenPAK_Burner.ino」を好きな環境でコンパイルしてM5StickCに書き込む。 エラーなしで書き込めると、シリアルモニタに下記画面が表示される。 また、画面に「GreenPAK Burner ver.?.?」と表示される。 ## 動作確認 GreenPAKをつなぎ、シリアルモニタで`p`[ENTER]」を打ち込んだときに書き画面のように「device 0x0? is present」と表示されれば準備完了。もしdeviceが表示されない場合は、配線が間違っている可能性があります。また、M5StackCの電源を入れなおすと動作する場合があります。 # コマンド `MENU: r = read, e = erase, w = write, p = ping` と表示されているときにコマンドを受け付けます。 本稿の説明は、オリジナルのarduinoスケッチの使い方と同じです。 ## ping デバイスを探します。 1. `p`[ENTER]を入力する。 2. I2Cデバイスが見つかった場合は、 ```:Ping Pinging! device 0x0? is present ``` と表示されて最初のMENUに戻る。 ?の部分は見つかったI2Cアドレスの上位4bit。 ## read データを読みだして表示する。 1. `r`[ENTER]を入力する。 2. メッセージが表示されて入力待ちになる。 ```:read例 MENU: r = read, e = erase, w = write, p = ping Reading chip! device 0x01 is present Submit slave address, 0-F: ``` 3. 書き込むデバイスの番号を入力して[ENTER]。上記例では`1`[ENTER]。止めたいときは、M5StickCの電源を入れなおす。 4. メッセージが表示されて入力待ちになる。 ```:read例 MENU: n = NVM, e = EEPROM: ``` 5. NVMデータを読むときは`n`[ENTER]、EEPROMデータを読むときは`e`[ENTER]を入力 6. データ読み出しが実行されて最初のMENUに戻る。 7. 一連の実行結果の例を示す。 ```:read MENU: r = read, e = erase, w = write, p = ping Reading chip! device 0x01 is present Submit slave address, 0-F: 01 MENU: n = NVM, e = EEPROM: NVM 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000001 000000000000000000000000000000C4 3FFCC21FFC0000000000000000000000 00000000000000000000000000000000 00303000303030300000303030003030 00000000000000000000000000000000 00000000001422300C00000000000000 00000000000000000000000000000000 00000020000100000002010000020001 00000201000002000100000201000002 00010000020001000000010100000000 00000000000000000000000000000000 00000000000000000000000000000000 41140E2A251910101000B800000000A5 MENU: r = read, e = erase, w = write, p = ping ``` ## erace データを消去する。 1. `e`[ENTER]を入力する。 2. メッセージが表示されて入力待ちになる。 ```:erace例 MENU: r = read, e = erase, w = write, p = ping Erasing Chip! device 0x01 is present Submit slave address, 0-F: ``` 3. データを消去するデバイスの番号を入力して[ENTER]。上記例では`1`[ENTER]。止めたいときは、M5StickCの電源を入れなおす。 4. メッセージが表示されて入力待ちになる。 ```:erace例 MENU: n = NVM, e = EEPROM: ``` 5. NVMデータを消すときは`n`[ENTER]、EEPROMデータを消すときは`e`[ENTER]を入力する。 6. データ消去が実行されて最初のMENUに戻る。 7. 一連の実行結果の例を示す。 ```:erace MENU: r = read, e = erase, w = write, p = ping Erasing Chip! device 0x01 is present Submit slave address, 0-F: 01 MENU: n = NVM, e = EEPROM: NVM Erasing page: 0x00 NVM ready Erasing page: 0x01 NVM ready Erasing page: 0x02 NVM ready Erasing page: 0x03 NVM ready Erasing page: 0x04 NVM ready Erasing page: 0x05 NVM ready Erasing page: 0x06 NVM ready Erasing page: 0x07 NVM ready Erasing page: 0x08 NVM ready Erasing page: 0x09 NVM ready Erasing page: 0x0A NVM ready Erasing page: 0x0B NVM ready Erasing page: 0x0C NVM ready Erasing page: 0x0D NVM ready Erasing page: 0x0E NVM ready Erasing page: 0x0F NVM ready Power Cycling! device 0x00 is present MENU: r = read, e = erase, w = write, p = ping ``` ## write データを書き込む。 1. `w`[ENTER]を入力する。 2. メッセージが表示されて入力待ちになる。 ```:write例 MENU: r = read, e = erase, w = write, p = ping Writing Chip! device 0x01 is present Submit slave address, 0-F: ``` 3. データを書き込むデバイスの番号を入力して[ENTER]。上記例では`1`[ENTER]。止めたいときは、M5StickCの電源を入れなおす。 4. メッセージが表示されて入力待ちになる。 ```:write例 MENU: n = NVM, e = EEPROM: ``` 5. NVMデータを消すときは`n`[ENTER]、EEPROMデータを消すときは`e`[ENTER]を入力する。 6. 最初に`erace`が実行される。NVMデータを消した場合は再度入力待ちになる。 ```:write例 Erasing page: 0x00 NVM ready Erasing page: 0x01 NVM ready Erasing page: 0x02 NVM ready Erasing page: 0x03 NVM ready Erasing page: 0x04 NVM ready Erasing page: 0x05 NVM ready Erasing page: 0x06 NVM ready Erasing page: 0x07 NVM ready Erasing page: 0x08 NVM ready Erasing page: 0x09 NVM ready Erasing page: 0x0A NVM ready Erasing page: 0x0B NVM ready Erasing page: 0x0C NVM ready Erasing page: 0x0D NVM ready Erasing page: 0x0E NVM ready Erasing page: 0x0F NVM ready Power Cycling! device 0x01 is present Control Code: 0x02 Enter new slave address 0-F: ``` 7. 「GreenPAK Designer」上で設定したGreenPAKの「slave address」(Control codeレジスタ)を上書きできる。 番号を入力して[ENTER]。書き込む前と同じ値にするなら`1`[ENTER]。 8. 書き込みが実行された後に、'read'が自動的に実行され、最初のMENUに戻る。 Verifyは実装されていないので、書き込みデータと'read'結果を目で確認する必要がある。 最後のデータはデバイス情報が読みだされるため、書き込みデータと一致しないが問題はない。 10. 一連の実行結果の例を示す。 ```:write例 MENU: r = read, e = erase, w = write, p = ping Writing Chip! device 0x01 is present Submit slave address, 0-F: 01 MENU: n = NVM, e = EEPROM: NVM Erasing page: 0x00 NVM ready Erasing page: 0x01 NVM ready Erasing page: 0x02 NVM ready Erasing page: 0x03 NVM ready Erasing page: 0x04 NVM ready Erasing page: 0x05 NVM ready Erasing page: 0x06 NVM ready Erasing page: 0x07 NVM ready Erasing page: 0x08 NVM ready Erasing page: 0x09 NVM ready Erasing page: 0x0A NVM ready Erasing page: 0x0B NVM ready Erasing page: 0x0C NVM ready Erasing page: 0x0D NVM ready Erasing page: 0x0E NVM ready Erasing page: 0x0F NVM ready Power Cycling! device 0x01 is present Control Code: 0x02 Enter new slave address 0-F: 0x01 00 00000000000000000000000000000000 ack ready 01 00000000000000000000000000000000 ack ready 02 00000000000000000000000000000000 ack ready 03 000000000000000000000000000000C4 ack ready 04 3FFCC21FFC0000000000000000000000 ack ready 05 00000000000000000000000000000000 ack ready 06 00303000303030300000303030003030 ack ready 07 00000000000000000000000000000000 ack ready 08 00000000001422300C00000000000000 ack ready 09 00000000000000000000000000000000 ack ready 0A 00000020000100000002010000020001 ack ready 0B 00000201000002000100000201000002 ack ready 0C 00010000020001000000010100000000 ack ready 0D 00000000000000000000000000000000 ack ready 0E 00000000000000000000000000000000 ack ready 0F 000000000000000000000000000000A5 ack ready Power Cycling! device 0x01 is present 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 000000000000000000000000000000C4 3FFCC21FFC0000000000000000000000 00000000000000000000000000000000 00303000303030300000303030003030 00000000000000000000000000000000 00000000001422300C00000000000000 00000000000000000000000000000000 00000020000100000002010000020001 00000201000002000100000201000002 00010000020001000000010100000000 00000000000000000000000000000000 00000000000000000000000000000000 41140E2A251910101000B800000000A5 MENU: r = read, e = erase, w = write, p = ping ``` # 注意事項 本記事では、日本国著作権法第20条(同一性保持権)第2項第三号および第四号ならびに第32条(引用)第1項で認められている範囲内で、dialog社の公開しているarduinoスケッチを改変し、その方法を記載したつもりです。もしも同法の解釈に考え違いがあったと判明した場合は、プログラムの改変部分もしくは他の部分を含め記事を修正する場合があります。 また、本記事はdialog社およびプログラムの権利者(以下、dialog社等)の所有する権利を侵害することを意図したものではありません。また、なんらdialog社等が関与するものではありません。本記事に関してdialog社等への問い合わせはお控えください。 # 免責事項 本記事の正確性については努力しておりますが、当方は利用者が当記事の情報を用いて行う一切の行為について何ら責任を負うものではありません。本記事の情報の利用、内容によって、利用者にいかなる損害、被害が生じても、著者は一切の責任を負いません。ご自身の責任においてご利用いただきますようお願いいたします。 # Author [GitHub/AoiSaya](https://github.com/AoiSaya) [Twitter ID @La_zlo](https://twitter.com/La_zlo)