AoiSaya が 2021年02月09日02時11分58秒 に編集
コメント無し
本文の変更
# はじめに 前回、チョットした回路を組むのにGreenPAKのSLG46826が便利っていう記事を書きました。 https://elchika.com/article/6ddfba55-fa3e-436b-b603-69478b6b450d/ だけど、デザインファイル(設計データ)を焼くための開発ボードがちょっとお高い。 公式サイトでArduinoで焼く方法が紹介されてるけど、Arduinoを持ってないと使えない。 M5StickCやM5Stackならもってるんだけどなぁという人はきっといるはず。 そこで、Arduino用のスケッチを改造してM5StickCまたはM5StackからI2Cで焼く方法を試してみたので紹介します。 本記事はピン番号の数え方、I2Cの基本的な知識およびM5StickCまたはM5StackのC言語によるプログラミング知識がある方を対象としています。 # 用意するもの ## 部材一覧 1. SLG46826V-DIP または SLG46826VかSLG46826G搭載の自作基板 2. M5StickC または M5Stack 3. USB Type-Cケーブル(M5StickCの付属品) 4. Grove 4ピンコネクタ - ジャンパーピン変換ケーブル(オスまたはメス) 5. ブレッドボード (変換ケーブルがオスの場合に必要) ![部材一式](https://camo.elchika.com/99b20901694ed2252ad8d682d0ba272bcbe22fa7/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f30383562623466332d343530612d343164632d393963622d6164373366646533326230382f33383566376633312d306232622d343738362d386162372d393862356239316230343933/) ## ダウンロードするもの - 公式のArduino用スケッチ&ドキュメント https://www.dialog-semiconductor.com/sites/default/files/an-cm-255_slg468246_mtp_arduino_programming_example.zip ++2021/2/9追記 M5StickCおよびM5Stackのどちらでも動作するスケッチをGitHubに公開しました。 https://github.com/AoiSaya/GreenPAK_Burner このスケッチを使う場合は「5.スケッチの修正方法」をとばして「6.書き込むデータの準備」からお読みください。++ ## M5StickCの開発環境 下記は検証に使用した環境です(ご参考) 1. dynabook T351/57CW 2. Windows 10 Pro 64bit (1909) 3. GreenPAK6 Designer(64bit) Version: 6.21 (Build 005) 4. Arduino Software (IDE) 1.8.12 # 接続方法 ## SLG46826V-DIP (20pinDIP)の場合 - 変換ケーブルを使って、M5StickCとGreenPAKを繋ぎます。 - オスならブレッドボード経由で、メスなら直接DIPパッケージにつなぎます。 - ●ぽっちが付いている端子が1番ピンです。(写真では左下) - ブレッドボードに回路を組んでいる場合など、GreenPAKに他から電圧を与えている場合やVDDに他のデバイスがつながっている場合は、VDDはつながないでください。5Vが供給されるため故障の原因になります。
M5StickC | M5Stack | SLG46826V-DIPのピン番号 | 機能 | 備考
#### ピン番号 M5StickC | M5Stack | SLG46826V-DIP | 機能 | 備考
:---: | :---: | :---: | :---: | --- GND | - | 11 | GND | VOUT | + | 1 | VDD | 5V。他から電圧を与えているときはつながない G32 | _Г | 9 | SDA | G33 | \_Π\_ | 8 | SCL | ![M5StickC と SLG46826V-DIP の場合](https://camo.elchika.com/f2f46ebd6020e72c3974eedd40b571ea9f672df8/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f30383562623466332d343530612d343164632d393963622d6164373366646533326230382f34306564373063632d333538652d346238342d383465352d366233343261386432356438/) ## SLG46826V (20pin STQFN)の場合 - 変換ケーブルなどを使って、M5StickCとGreenPAKを繋ぎます。 - 自作基板などでGreenPAKに別途電圧を与えている場合やVDDに他のデバイスがつながっている場合は、VDDはつながないでください。5Vが供給されるため故障の原因になります。 - VDD2は電圧を与えていてもオープンでも問題ありません。
M5StickC | M5Stack | SLG46826Vのピン番号 | 機能 | 備考
#### ピン番号 M5StickC | M5Stack | SLG46826V | 機能 | 備考
:---: | :---: | :---: | :---: | --- GND | - | 11 | GND | VOUT | + | 1 | VDD | 5V。他から電圧を与えているときはつながない G32 | _Г | 9 | SDA | G33 | \_Π\_ | 8 | SCL | ## SLG46826G (20pin TSSOP)の場合 - 変換ケーブルなどを使って、M5StickCとGreenPAKを繋ぎます。 - SLG46826GはSLG46826Vとピン番号が異なりますのでご注意ください。 - 自作基板などでGreenPAKに別途電圧を与えている場合やVDDに他のデバイスがつながっている場合は、VDDはつながないでください。5Vが供給されるため故障の原因になります。 - VDD2は電圧を与えていてもオープンでも問題ありません。
M5StickC| M5Stack | SLG46826Gのピン番号 | 機能 | 備考
#### ピン番号 M5StickC| M5Stack | SLG46826G | 機能 | 備考
:---: | :---: | :---: | :---: | --- GND | - | 10 | GND | VOUT | + | 20 | VDD | 5V。他から電圧を与えているときはつながない G32 | _Г | 12 | SDA | G33 | \_Π\_ | 13 | SCL | # 基本スケッチ ダウンロードした`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」に改造する方法を説明します。 # スケッチの修正方法 ++2021/2/9追記 M5StickCおよびM5Stackのどちらでも動作するスケッチをGitHubに公開しました。 https://github.com/AoiSaya/GreenPAK_Burner このスケッチを使う場合は、この章をとばして「6.書き込むデータの準備」からお読みください。++ 1. まず、「MTP_Programmer.ino」を「GreenPAK_Burner.ino」に名前を変えて保存します。 2. 次に、以下の差分を見ながら修正(コピペ)します。 ## include文の変更 M5StickC用のインクルードファイルに差し替えます。 ```C++:MTP_Programmer.ino #include <Wire.h> ``` ```C++:GreenPAK_Burner.ino #include <M5StickC.h> ``` ## 書き込むデータの記述方法の変更 M5StickCはメモリ容量に余裕があるので、データの差し替えが楽になる様に変更します。 データの差し替え方法は後で説明します。 ```C++:MTP_Programmer.ino // Store nvmData in PROGMEM to save on RAM const char nvmString0[] PROGMEM = "010E000000008E3F0300000000000000"; (中略) eepromString15 }; ``` ```C++: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()関数の修正 I2Cのピン指定、M5StickC用の画面表示などを加えます。I2Cは100kHzで動作させます。(動作が安定しやすい) ```C++: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); } ``` ```C++: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ヶ所とも引数を追加します。 ```C++:MTP_Programmer.ino powercycle(); ``` ```C++:GreenPAK_Burner.ino powercycle(control_code); ``` ## writeChip()関数の変更 1. データのコピー方法を変更します。 ```C++: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); } ``` ```C++:GreenPAK_Burner.ino if (NVM_selected) { memcpy(buffer,&nvmData[i*43+9],32); } else if (EEPROM_selected) { memcpy(buffer,&eepromData[i*43+9],32); } ``` 2. スレーブアドレスの上書き方法を修正します。 (元の記述ではピンによるスレーブアドレス指定が無効になってしまうため) ```C++:MTP_Programmer.ino data_array[0xC][0xA] = slave_address; ``` ```C++:GreenPAK_Burner.ino data_array[0xC][0xA] = (data_array[0xC][0xA] & 0xF0) | slave_address; ``` ## powercycle()関数の変更 自作基板でも使えるようにソフトウェアリセットに変更します。 ```C++:MTP_Programmer.ino void powercycle() { Serial.println(F("Power Cycling!")); digitalWrite(VDD, LOW); delay(500); digitalWrite(VDD, HIGH); // Serial.println(F("Done Power Cycling!")); } ``` ```C++: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!")); } ``` # 書き込むデータの準備 ## 回路設計 「GreenPAK6 Designer」を使って好きな回路を設計します。 設計が終わったら、セーブしておきましょう。 (フロッピーディスクのアイコンを押すか、[File]-[Save]を選択) 以下の説明では、ダウンロード済みの`SLG46824_6 MTP Arduino Programming Example.gp6`を使って説明します。 1. 「SLG46824_6 MTP Arduino Programming Example.gp6」を「GreenPAK6 Designer」で開きます。 もし、下記のようなダイアログボックスが表示されたら、[OK]を押してください。 「GreenPAK6 Designer」のアップデートに伴うものですので、デザインには問題ありません。 ![キャプションを入力できます](https://camo.elchika.com/87f2acd0c36f11797b14bd31b0d92935d4dc2a01/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f30383562623466332d343530612d343164632d393963622d6164373366646533326230382f36396430656630392d613030312d346636652d623065332d303965373337646664313061/) ## 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と同じ名前が表示されるので、NVMデータと重複しないようにする 4. 「保存(S)」をクリックして保存 ## スクリプトへの埋め込み 1. 作成したHEXデータを好きなエディタで開きます。 2. 「NVMデータ」を上記で作成したスクリプト「GreenPAK_Burner.ino」の下記の行の間にすべて張り付けます。 ```:GreenPAK_Burner.ino const char nvmData[] PROGMEM ="\ "; ``` 3. 「EEPROMデータ」があれば、上記で作成したスクリプト「GreenPAK_Burner.ino」の下記の行の間にすべて張り付けます。 ```:GreenPAK_Burner.ino const char eepromData[] PROGMEM ="\ "; ``` 4. 張り付けたデータのすべての行末に`\`を追加します。 5. 最終的に下記のようになれば、完成です。 ```: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(またはM5Stack)への書き込み ## コンパイル&書き込み 「GreenPAK_Burner.ino」を好きなツールや環境でコンパイルしてM5StickC(またはM5Stack)に書き込みます。 M5StickC(またはM5Stack)に書き込む前にシリアルモニタを開いておきます。 エラーなしで書き込めると、シリアルモニタに下記画面が表示されます。 また、M5StickC(またはM5Stack)に「GreenPAK Burner ver.?.?」と表示されます。 ![キャプションを入力できます](https://camo.elchika.com/41116dcbd359a254c7b7eac52369cf583f8e4be8/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f30383562623466332d343530612d343164632d393963622d6164373366646533326230382f39393066353533362d363362352d346537362d386333352d373138383363306537646235/) ## 動作確認 GreenPAKがつながった状態で、シリアルモニタで`p`[ENTER]」を打ち込んだときに下記画面のように「device 0x0? is present」と表示されれば正常です(`?`の部分は0~Fのいずれか)。お疲れさまでした。 もしdeviceが表示されない場合は、M5StickC(またはM5Stack)の電源を入れなおしてみてください。それでも動かない場合は配線やプログラムを見直してください。 自作基板などでVDDを繋いでいない場合は、GreenPAKに電圧が供給されているかも確認してみてください。GreenPAKの書き込みには2.5~5.5V、3mA以上が必要です。 ![キャプションを入力できます](https://camo.elchika.com/75112d780498370229ec3bc30b5f2b6bddaa0af1/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f30383562623466332d343530612d343164632d393963622d6164373366646533326230382f39633665643864352d626234342d343965622d386563342d396562303462373864326264/) # コマンド `MENU: r = read, e = erase, w = write, p = ping` と表示されているときにコマンドを受け付けます。 本稿の説明は、オリジナルのArduinoスケッチの使い方と同じです。 ## ping I2Cデバイスを探します。 1. `p`[ENTER]を入力します。 2. I2Cデバイスが見つかった場合は、 ```:Ping Pinging! device 0x01 is present ``` と表示されて最初のMENUに戻ります。 `0x01`の部分はみつかったデバイスのI2Cアドレスの上位4bit(以下、上位アドレス)が表示されます。他のコマンドも同様です。 I2Cアドレスの下位3bitが0の時に反応するデバイスをスキャンするので、GreenPAK以外のデバイスのアドレスが表示される場合もあります。 ## 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. 書き込むGreenPAKの上位アドレスを入力して[ENTER]。上記例では`1`[ENTER]。止めたいときは、M5StickC(またはM5Stack)の電源を入れなおします。 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. データを消去するGreenPAKの上位アドレスを入力して[ENTER]。上記例では`1`[ENTER]。止めたいときは、M5StickC(またはM5Stack)の電源を入れなおします。 4. メッセージが表示されて入力待ちになります。 ```:erace例 MENU: n = NVM, e = EEPROM: ``` 5. NVMデータを消すときは`n`[ENTER]、EEPROMデータを消すときは`e`[ENTER]を入力します。 6. データ消去後にGreenPAKがリセットされ、最初の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. データを書き込むGreenPAKの上位アドレスを入力して[ENTER]。上記例では`1`[ENTER]。止めたいときは、M5StickC(またはM5Stack)の電源を入れなおします。 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. 「GreenPAK6 Designer」上で設定したGreenPAKの「slave address」(Control codeレジスタ)を上書きできます。 新しく設定するGreenPAKの上位アドレスを入力して[ENTER]。書き込む前と同じ値にするなら`1`[ENTER]。 8. 書き込みが実行された後に、GreenPAKのリセットと'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 ``` # 注意事項 本記事では、日本国著作権法で認められている範囲内で、Dialog Semiconductor社が公開しているArduinoスケッチを改変して実験を行い、その方法を記載したつもりです。もしも同法の解釈に考え違いがあったと判明した場合もしくはそれに関わらず、プログラムの改変部分もしくは他の部分を含め記事を修正する場合があります。 なお、本記事はDialog Semiconductor社およびプログラムの権利者(以下、Dialog社等)の所有する権利を侵害することを意図したものではありません。また、なんらDialog社等が関与するものではありません。本記事に関してDialog社等への問い合わせはお控えください。 # 免責事項 本記事の正確性については努力しておりますが、当方は利用者が当記事の情報を用いて行う一切の行為について何ら責任を負うものではありません。本記事の情報の利用、内容によって、利用者にいかなる損害、被害が生じても、著者は一切の責任を負いません。ご自身の責任においてご利用いただきますようお願いいたします。 # 商標について 本記事に掲載されている商品またはサービスなどの名称は、各社の商標または登録商標です。 # Author [GitHub/AoiSaya](https://github.com/AoiSaya) [Twitter ID @La_zlo](https://twitter.com/La_zlo)