はじめに
前回、チョットした回路を組むのにGreenPAKのSLG46826が便利っていう記事を書きました。
https://elchika.com/article/6ddfba55-fa3e-436b-b603-69478b6b450d/
だけど、デザインファイル(設計データ)を焼くための開発ボードがちょっとお高い。
公式サイトでArduinoで焼く方法が紹介されてるけど、Arduinoを持ってないと使えない。
M5StickCやM5Stackならもってるんだけどなぁという人はきっといるはず。
そこで、Arduino用のスケッチを改造してM5StickCまたはM5StackからI2Cで焼く方法を試してみたので紹介します。
本記事はピン番号の数え方、I2Cの基本的な知識およびM5StickCまたはM5StackのC言語によるプログラミング知識がある方を対象としています。
用意するもの
部材一覧
- SLG46826V-DIP または SLG46826VかSLG46826G搭載の自作基板
- M5StickC または M5StickC Plus もしくは M5Stack
- USB Type-Cケーブル(M5StickCの付属品)
- Grove 4ピンコネクタ - ジャンパーピン変換ケーブル(オスまたはメス)
- ブレッドボード (変換ケーブルがオスの場合に必要)
- プルアップ抵抗(3.3kΩ~10kΩ程度)(2021/9/19追記)
- ジャンパワイヤ やテストクリップなど (2022/7/11追記)
2021/9/19追記
I2C通信時にデータが化けることがありました。GreenPAKのI2C端子(SCL,SDA)と電源(VDD)の間にプルアップ抵抗を入れると改善します。抵抗値は3.3kΩ~10kΩ程度、例えば4.7kΩとするのが適当だと思います。
2022/7/11追記
書き換え時にVDD2に電源を供給しないとI2Cにアクセスできない場合がありました。VDDとVDD2を繋いでください。
ダウンロードするもの
- 公式のArduino用スケッチ&ドキュメント
https://www.dialog-semiconductor.com/sites/default/files/an-cm-255_slg46824_6_mtp_arduino_programming_example.zip
2021/2/9追記
M5StickCおよびM5Stackのどちらでも動作するスケッチをGitHubに公開しました。
https://github.com/AoiSaya/GreenPAK_Burner
このスケッチを使う場合は「5.スケッチの修正方法」をとばして「6.書き込むデータの準備」からお読みください。
M5StickCの開発環境
下記は検証に使用した環境です(ご参考)
- dynabook T351/57CW
- Windows 10 Pro 64bit (1909)
- GreenPAK6 Designer(64bit) Version: 6.21 (Build 005)
- Arduino Software (IDE) 1.8.12
接続方法
SLG46826V-DIP (20pinDIP)の場合
- 変換ケーブルを使って、M5StickCとGreenPAKを繋ぎます。
- オスならブレッドボード経由で、メスなら直接DIPパッケージにつなぎます。
- ●ぽっちが付いている端子が1番ピンです。(写真では左下)
- ブレッドボードに回路を組んでいる場合など、GreenPAKに他から電圧を与えている場合やVDDやVDD2に他のデバイスがつながっている場合は、VDDやVDD2はつながないでください。5Vが供給されるため故障の原因になります。
ピン番号
M5StickC | M5Stack | SLG46826V-DIP | 機能 | 備考 |
---|---|---|---|---|
GND | - | 11 | GND | |
VOUT | + | 1, 14 | VDD, VDD2 | 5V。他から電圧を与えているときはつながない |
G32 | _Г | 9 | SDA | プルアップ抵抗をつけるとよい |
G33 | _Π_ | 8 | SCL | プルアップ抵抗をつけるとよい |
SLG46826V (20pin STQFN)の場合
- 変換ケーブルなどを使って、M5StickCとGreenPAKを繋ぎます。
- 自作基板などでGreenPAKに別途電圧を与えている場合やVDDやVDD2に他のデバイスがつながっている場合は、VDDやVDD2はつながないでください。5Vが供給されるため故障の原因になります。
ピン番号
M5StickC | M5Stack | SLG46826V | 機能 | 備考 |
---|---|---|---|---|
GND | - | 11 | GND | |
VOUT | + | 1, 14 | VDD, VDD2 | 5V。他から電圧を与えているときはつながない |
G32 | _Г | 9 | SDA | プルアップ抵抗をつけるとよい |
G33 | _Π_ | 8 | SCL | プルアップ抵抗をつけるとよい |
SLG46826G (20pin TSSOP)の場合
- 変換ケーブルなどを使って、M5StickCとGreenPAKを繋ぎます。
- SLG46826GはSLG46826Vとピン番号が異なりますのでご注意ください。
- 自作基板などでGreenPAKに別途電圧を与えている場合やVDDやVDD2に他のデバイスがつながっている場合は、VDDやVDD2はつながないでください。5Vが供給されるため故障の原因になります。
ピン番号
M5StickC | M5Stack | SLG46826G | 機能 | 備考 |
---|---|---|---|---|
GND | - | 10 | GND | |
VOUT | + | 20, 7 | VDD, VDD2 | 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.書き込むデータの準備」からお読みください。
- まず、「MTP_Programmer.ino」を「GreenPAK_Burner.ino」に名前を変えて保存します。
- 次に、以下の差分を見ながら修正(コピペ)します。
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()関数の変更
- データのコピー方法を変更します。
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!"));
}
書き込むデータの準備
回路設計
「GreenPAK6 Designer」を使って好きな回路を設計します。
設計が終わったら、セーブしておきましょう。
(フロッピーディスクのアイコンを押すか、[File]-[Save]を選択)
以下の説明では、ダウンロード済みのSLG46824_6 MTP Arduino Programming Example.gp6
を使って説明します。
- 「SLG46824_6 MTP Arduino Programming Example.gp6」を「GreenPAK6 Designer」で開きます。
もし、下記のようなダイアログボックスが表示されたら、[OK]を押してください。
「GreenPAK6 Designer」のアップデートに伴うものですので、デザインには問題ありません。
HEXデータの作成
手順を列挙します。
NVMデータ(設計データ)
- [File]-[Export]-[Export NVM]を選択
- 保存ダイアログが開いたら、「ファイルの種類(T):」で「Intel HEX files (*.HEX)」を選択
- 「ファイル名(N):」に好きな名前を入力
デフォルトでは*.gp6と同じ名前が表示されるので、変更しない場合はそのままでよい - 「保存(S)」をクリックして保存
EEPROMデータ
EEPROMデータがある場合は、EEPROMデータのHEXデータも作成します。
- [File]-[Export]-[Export EEPROM]を選択
- 保存ダイアログが開いたら、「ファイルの種類(T):」で「Intel HEX files (*.HEX)」を選択
- 「ファイル名(N):」に好きな名前を入力
デフォルトでは*.gp6と同じ名前が表示されるので、NVMデータと重複しないようにする - 「保存(S)」をクリックして保存
スクリプトへの埋め込み
- 作成したHEXデータを好きなエディタで開きます。
- 「NVMデータ」を上記で作成したスクリプト「GreenPAK_Burner.ino」の下記の行の間にすべて貼りつけます。
GreenPAK_Burner.ino
const char nvmData[] PROGMEM = R"( )";
- 「EEPROMデータ」があれば、上記で作成したスクリプト「GreenPAK_Burner.ino」の下記の行の間にすべて貼りつけます。
GreenPAK_Burner.ino
const char eepromData[] PROGMEM = R"( )";
- 最終的に下記のようになれば、完成です。
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デバイスを探します。
p
[ENTER]を入力します。- I2Cデバイスが見つかった場合は、
Ping
Pinging! device 0x01 is present
と表示されて最初のMENUに戻ります。
0x01
の部分はみつかったデバイスのI2Cアドレスの上位4bit(以下、上位アドレス)が表示されます。他のコマンドも同様です。
I2Cアドレスの下位3bitが0の時に反応するデバイスをスキャンするので、GreenPAK以外のデバイスのアドレスが表示される場合もあります。
read
データを読みだして表示します。
r
[ENTER]を入力します。- メッセージが表示されて入力待ちになります。
read例
MENU: r = read, e = erase, w = write, p = ping Reading chip! device 0x01 is present Submit slave address, 0-F:
- 書き込むGreenPAKの上位アドレスを入力して[ENTER]。上記例では
1
[ENTER]。止めたいときは、M5StickC(またはM5Stack)の電源を入れなおします。 - メッセージが表示されて入力待ちになります。
read例
MENU: n = NVM, e = EEPROM:
- NVMデータを読むときは
n
[ENTER]、EEPROMデータを読むときはe
[ENTER]を入力します。 - データ読み出しが実行されて最初のMENUに戻ります。
- 一連の実行結果の例を示します。
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
データを消去します。
e
[ENTER]を入力します。- メッセージが表示されて入力待ちになります。
erace例
MENU: r = read, e = erase, w = write, p = ping Erasing Chip! device 0x01 is present Submit slave address, 0-F:
- データを消去するGreenPAKの上位アドレスを入力して[ENTER]。上記例では
1
[ENTER]。止めたいときは、M5StickC(またはM5Stack)の電源を入れなおします。 - メッセージが表示されて入力待ちになります。
erace例
MENU: n = NVM, e = EEPROM:
- NVMデータを消すときは
n
[ENTER]、EEPROMデータを消すときはe
[ENTER]を入力します。 - データ消去後にGreenPAKがリセットされ、最初のMENUに戻ります。
- 一連の実行結果の例を示します。
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
データを書き込み(焼き)ます。
w
[ENTER]を入力する。- メッセージが表示されて入力待ちになります。
write例
MENU: r = read, e = erase, w = write, p = ping Writing Chip! device 0x01 is present Submit slave address, 0-F:
- データを書き込むGreenPAKの上位アドレスを入力して[ENTER]。上記例では
1
[ENTER]。止めたいときは、M5StickC(またはM5Stack)の電源を入れなおします。 - メッセージが表示されて入力待ちになります。
write例
MENU: n = NVM, e = EEPROM:
- NVMデータを消すときは
n
[ENTER]、EEPROMデータを消すときはe
[ENTER]を入力します。 - 最初に
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:
- 「GreenPAK6 Designer」上で設定したGreenPAKの「slave address」(Control codeレジスタ)を上書きできます。
新しく設定するGreenPAKの上位アドレスを入力して[ENTER]。書き込む前と同じ値にするなら1
[ENTER]。 - 書き込みが実行された後に、GreenPAKのリセットと'read'が自動的に実行され、最初のMENUに戻ります。
Verifyは実装されていないので、書き込みデータと'read'結果を目で確認する必要があります。
最後のデータはデバイス情報が読みだされるため、書き込みデータと一致しませんが問題はありません。 - 一連の実行結果の例を示します。
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
投稿者の人気記事
-
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
に
編集
をしました。
(メッセージ: 分類およびライセンスを追加)
Opening
niga
2022/07/03 Opening
AoiSaya
2022/07/11 -
AoiSaya
さんが
2022/07/11
に
編集
をしました。
(メッセージ: VDD2をVDDと繋ぐ様に記載を変更)
Opening
ss
2022/07/17 -
-
AoiSaya
2022/08/02 -
AoiSaya
さんが
2022/08/02
に
編集
をしました。
(メッセージ: M5StickC Plusをサポート)
Opening
niga
2024/01/08
ログインしてコメントを投稿するはじめまして。たいへん有用な情報ありがとうございます。
当方のM5Stack BASICでSLG46826Gに書き込みしてみました。基板実装前にVDDとGND,SCL,SDAをワイヤーで接続し、SCLとSDAは10kΩでプルアップしました。こちらの情報通りに手順を進め、pコマンド、rコマンドに応答があり、wコマンドで消去、書き込みまでは問題なく進行しましたが、書き込み直後からSLG46826Gを認識しなくなりました。pコマンドで無反応です。M5Stackをリセットしてもコンパイルからやり直してもだめで、別のSLG46826Gに交換しても同じ挙動でした。
書き込んだHEXの内容にもよるかも知れませんが、書き込み後はVDD2にも電源を供給しないと駄目みたいです。VDDとVDD2をワイヤーで直結したところpコマンドに応答があり、wで読み取りもできました。
SLG46826のデータシートの「5 IO Pins」に、VDD2に電源を共有しない場合の使い方についての記載がありVDD2を電源につながなくても問題なく使えると考えていましたが、VDD2配下のGPIOを入力もしくはオープンドレイン出力以外としたデータを書き込んだ後の書き換え需要を考慮できていませんでした。
記載を見直させていただきます。ご指摘ありがとうございました。
M5Stack gray で使用してみました。そこで気づいた点を書き出しておきます。
readChip() 関数の戻り値
関数定義は "int" になっていますが、returnでの戻り値の設定がありません。
この影響からか、 関数内のfor文が終了しなくなる現象が起きました。
こちらでは、関数定義で void readChip() として対応しました。
WriteChip()のデータテーブルからのデータ切り出しについて
316行目: memcpy(buffer,&nvmData[i43+9],32)
320行目: memcpy(buffer,&eepromData[i43+9],32);
のデータテーブルの先頭の計算 "i*43 + 9" ですが、
データテーブルの各行の右端にある改行データ分が不足するので、切り出し位置がずれていきます。
NVMにあるプロテクトビットに当ると、書き換えができなくなります。
改行データが1byteなら、 "i449" としないといけません。
また、データテーブルにデータを設定せずに、書き込み指示をすると、データテーブルの後ろにあるデータを取ってしまいます。
このことの対応として、HEXデータの先頭の":"を検出して、そこからの位置でデータ切り出しをしたほうが良いと思います。下記のwebにその方法がありました。
https://lang-ship.com/blog/work/greenpak-i2c-03-hex/
以上です。
ssさん、レポートありがとうございます。
GitHubに登録してあるプログラムをアップデートしました。
ついでにM5StickC Plusで動作確認しました。Atom等は動作未確認です。
ATOM LITEでGreenPAKの書き込みを試してみました。ソースをそのままコンパイルしただけではだめで、setupの内容を少し書き換える必要がありました。
どうもATOMではM5.begin()の引数として、 M5.begin(true, false, true); と記述する必要があるようです。この件については以下の記事が参考になります。
https://qiita.com/penguinprogrammer/items/5abf3e4f9583e41e9cfa
また、ATOMにはLCDが存在しないため、M5.Lcdの行をコメントアウトしないとエラーが出ます。
ATOMを使うと安価にGreenPAKの書き込みができるのがいいですね。