AoiSayaのアイコン画像
AoiSaya 2020年04月19日作成 (2021年12月11日更新) © MIT
セットアップや使用方法 セットアップや使用方法 閲覧数 2296
AoiSaya 2020年04月19日作成 (2021年12月11日更新) © MIT セットアップや使用方法 セットアップや使用方法 閲覧数 2296

M5StickCやM5Stackを使ってGreenPAKに設計データを焼いてみた

M5StickCやM5Stackを使ってGreenPAKに設計データを焼いてみた

はじめに

前回、チョットした回路を組むのに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. ブレッドボード (変換ケーブルがオスの場合に必要)
  6. プルアップ抵抗(3.3kΩ~10kΩ程度)(2021/9/19追記)

2021/9/19追記
I2C通信時にデータが化けることがありました。GreenPAKのI2C端子(SCL,SDA)と電源(VDD)の間にプルアップ抵抗を入れると改善します。抵抗値は3.3kΩ~10kΩ程度、例えば4.7kΩとするのが適当だと思います。

部材一式

ダウンロードするもの

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 機能 備考
GND 11 GND
VOUT 1 VDD 5V。他から電圧を与えているときはつながない
G32 9 SDA プルアップ抵抗をつけるとよい
G33 _Π_ 8 SCL プルアップ抵抗をつけるとよい

M5StickC と SLG46826V-DIP の場合

SLG46826V (20pin STQFN)の場合

  • 変換ケーブルなどを使って、M5StickCとGreenPAKを繋ぎます。
  • 自作基板などでGreenPAKに別途電圧を与えている場合やVDDに他のデバイスがつながっている場合は、VDDはつながないでください。5Vが供給されるため故障の原因になります。
    • VDD2は電圧を与えていてもオープンでも問題ありません。

ピン番号

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 機能 備考
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
2021/2/9追記
上記ファイルのアップデートにより、設計データの貼りつけ方が更に簡単になりました。
このスケッチを使う場合は、この章をとばして「6.書き込むデータの準備」からお読みください。

  1. まず、「MTP_Programmer.ino」を「GreenPAK_Burner.ino」に名前を変えて保存します。
  2. 次に、以下の差分を見ながら修正(コピペ)します。

include文の変更

M5StickC用のインクルードファイルに差し替えます。

MTP_Programmer.ino

#include <Wire.h>

GreenPAK_Burner.ino

#include <M5StickC.h>

書き込むデータの記述方法の変更

M5StickCはメモリ容量に余裕があるので、データの差し替えが楽になる様に変更します。
データの差し替え方法は後で説明します。

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 = R"( )"; // Store eepromData in PROGMEM to save on RAM const char eepromData[] PROGMEM = R"( )";

setup()関数の修正

I2Cのピン指定、M5StickC用の画面表示などを加えます。I2Cは100kHzで動作させます。(動作が安定しやすい)

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()関数の変更

  1. データのコピー方法を変更します。

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); }
  1. スレーブアドレスの上書き方法を修正します。
    (元の記述ではピンによるスレーブアドレス指定が無効になってしまうため)

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!")); }

書き込むデータの準備

回路設計

「GreenPAK6 Designer」を使って好きな回路を設計します。
設計が終わったら、セーブしておきましょう。
(フロッピーディスクのアイコンを押すか、[File]-[Save]を選択)

以下の説明では、ダウンロード済みのSLG46824_6 MTP Arduino Programming Example.gp6を使って説明します。

  1. 「SLG46824_6 MTP Arduino Programming Example.gp6」を「GreenPAK6 Designer」で開きます。

もし、下記のようなダイアログボックスが表示されたら、[OK]を押してください。
「GreenPAK6 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と同じ名前が表示されるので、NVMデータと重複しないようにする
  4. 「保存(S)」をクリックして保存

スクリプトへの埋め込み

  1. 作成したHEXデータを好きなエディタで開きます。
  2. 「NVMデータ」を上記で作成したスクリプト「GreenPAK_Burner.ino」の下記の行の間にすべて貼りつけます。

GreenPAK_Burner.ino

const char nvmData[] PROGMEM = R"( )";
  1. 「EEPROMデータ」があれば、上記で作成したスクリプト「GreenPAK_Burner.ino」の下記の行の間にすべて貼りつけます。

GreenPAK_Burner.ino

const char eepromData[] PROGMEM = R"( )";
  1. 最終的に下記のようになれば、完成です。

GreenPAK_Burner.ino

const char nvmData[] PROGMEM = R"( :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.?.?」と表示されます。
キャプションを入力できます

動作確認

GreenPAKがつながった状態で、シリアルモニタでp[ENTER]」を打ち込んだときに下記画面のように「device 0x0? is present」と表示されれば正常です(?の部分は0~Fのいずれか)。お疲れさまでした。
もしdeviceが表示されない場合は、M5StickC(またはM5Stack)の電源を入れなおしてみてください。それでも動かない場合は配線やプログラムを見直してください。
自作基板などでVDDを繋いでいない場合は、GreenPAKに電圧が供給されているかも確認してみてください。GreenPAKの書き込みには2.5~5.5V、3mA以上が必要です。
キャプションを入力できます

コマンド

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:
  1. 書き込むGreenPAKの上位アドレスを入力して[ENTER]。上記例では1[ENTER]。止めたいときは、M5StickC(またはM5Stack)の電源を入れなおします。
  2. メッセージが表示されて入力待ちになります。

read例

MENU: n = NVM, e = EEPROM:
  1. NVMデータを読むときはn[ENTER]、EEPROMデータを読むときはe[ENTER]を入力します。
  2. データ読み出しが実行されて最初のMENUに戻ります。
  3. 一連の実行結果の例を示します。

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:
  1. データを消去するGreenPAKの上位アドレスを入力して[ENTER]。上記例では1[ENTER]。止めたいときは、M5StickC(またはM5Stack)の電源を入れなおします。
  2. メッセージが表示されて入力待ちになります。

erace例

MENU: n = NVM, e = EEPROM:
  1. NVMデータを消すときはn[ENTER]、EEPROMデータを消すときはe[ENTER]を入力します。
  2. データ消去後にGreenPAKがリセットされ、最初のMENUに戻ります。
  3. 一連の実行結果の例を示します。

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:
  1. データを書き込むGreenPAKの上位アドレスを入力して[ENTER]。上記例では1[ENTER]。止めたいときは、M5StickC(またはM5Stack)の電源を入れなおします。
  2. メッセージが表示されて入力待ちになります。

write例

MENU: n = NVM, e = EEPROM:
  1. NVMデータを消すときはn[ENTER]、EEPROMデータを消すときはe[ENTER]を入力します。
  2. 最初に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:
  1. 「GreenPAK6 Designer」上で設定したGreenPAKの「slave address」(Control codeレジスタ)を上書きできます。
    新しく設定するGreenPAKの上位アドレスを入力して[ENTER]。書き込む前と同じ値にするなら1[ENTER]。
  2. 書き込みが実行された後に、GreenPAKのリセットと'read'が自動的に実行され、最初のMENUに戻ります。
    Verifyは実装されていないので、書き込みデータと'read'結果を目で確認する必要があります。
    最後のデータはデバイス情報が読みだされるため、書き込みデータと一致しませんが問題はありません。
  3. 一連の実行結果の例を示します。

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社等への問い合わせはお控えください。

ライセンス等

Copyright 2021 AoiSaya
MIT Licenseとします。

免責事項

本記事の正確性については努力しておりますが、当方は利用者が当記事の情報を用いて行う一切の行為について何ら責任を負うものではありません。本記事の情報の利用、内容によって、利用者にいかなる損害、被害が生じても、著者は一切の責任を負いません。ご自身の責任においてご利用いただきますようお願いいたします。

商標について

本記事に掲載されている商品またはサービスなどの名称は、各社の商標または登録商標です。

Author

GitHub/AoiSaya
Twitter ID @La_zlo

4
1
AoiSayaのアイコン画像
こころの赴くままに豆をまきます。投稿内容は趣味と煩悩に基づいており、無保証です。また、所属団体を代表するものではありません。
  • AoiSaya さんが 2020/04/19 に 編集 をしました。 (メッセージ: 初版)
  • AoiSaya さんが 2020/04/19 に 編集 をしました。
  • AoiSaya さんが 2020/04/19 に 編集 をしました。
  • AoiSaya さんが 2020/04/19 に 編集 をしました。 (メッセージ: 電源供給に関する文言を追加)
  • AoiSaya さんが 2020/06/11 に 編集 をしました。 (メッセージ: スケッチをGitHubに公開した告知)
  • AoiSaya さんが 2021/02/09 に 編集 をしました。 (メッセージ: M5Stackでの使い方を併記しました。)
  • AoiSaya さんが 2021/02/09 に 編集 をしました。
  • AoiSaya さんが 2021/02/23 に 編集 をしました。 (メッセージ: 設計データの貼りつけ方を簡素化)
  • AoiSaya さんが 2021/02/27 に 編集 をしました。 (メッセージ: Dialog社のHPへのリンク切れを修正)
  • AoiSaya さんが 2021/09/19 に 編集 をしました。 (メッセージ: プルアップ抵抗について記載。)
  • AoiSaya さんが 2021/12/11 に 編集 をしました。 (メッセージ: 分類およびライセンスを追加)
ログインしてコメントを投稿する