概要
前回はブラウザ操作の実験をしましたが、今回はデータシートを確認して、I2Cアドレスの変更方法を確認してみました。
GreenPAKのI2Cアドレスについて
コントロールコード | Registers0 | Registers1 | NVM | EEPROM |
0 | 0 | 1 | 2 | 3 |
1 | 8 | 9 | 10 | 11 |
2 | 16 | 17 | 18 | 19 |
3 | 24 | 25 | 26 | 27 |
4 | 32 | 33 | 34 | 35 |
5 | 40 | 41 | 42 | 43 |
6 | 48 | 49 | 50 | 51 |
7 | 56 | 57 | 58 | 59 |
8 | 64 | 65 | 66 | 67 |
9 | 72 | 73 | 74 | 75 |
10 | 80 | 81 | 82 | 83 |
11 | 88 | 89 | 90 | 91 |
12 | 96 | 97 | 98 | 99 |
13 | 104 | 105 | 106 | 107 |
14 | 112 | 113 | 114 | 115 |
15 | 120 | 121 | 122 | 123 |
GreenPAKはコントロールコードと呼ばれる0から15までの番号でI2Cアドレスが制御されています。Registers0とRegisters1は実際には同じ物で、レジスタにアクセスする場合に利用します。NVMは回路データのフラッシュが入っています。起動時にNVMからレジスタに回路データをコピーして起動をしています。EEPROMは2Kのメモリとして利用できますが、ESP32とかで使う限りはあまり必要ないかな。
選択方法
事前設定
I2Cのマクロセルを選択すると、上記の場所で設定できます。コントロールコードのプルダウンから0(0000)から15(1111)までを選択可能です。
基本的に回路に書き込んだ場合に事前に設定をしておく設定になります。レジスタやNVMの該当部分を直接書き換えることで変更することができます。
IO選択
同じ設定項目でPIN番号が書かれている項目があります。ここをクリックするとグレーになり選択することができます。初期設定だとRegの直値がグレーになっているので、IOの状態で変更したいビットのPINをグレーにして選択します。
上記は4つとも選択していますが、個別に選択が可能です。動的に変更したいPINのみ選択することができます。
回路の書き込み
:1000000000000000000000000000000000000000F0
:1000100000000000000000000000000000000000E0
:1000200000000000000000000000000000000000D0
:1000300000000000000000000000000000000000C0
:1000400000000000000000000000000000000000B0
:1000500000000000000000000000000000000000A0
:100060000030300030303030000030303000303080
:1000700030303030000000000000000000000000C0
:1000800000000000001422300C00000000000000FE
:100090000000000000000000000000000000000060
:1000A0000000002000010000000201000002000129
:1000B0000000020100000200010000020100000235
:1000C00000010000020001000000F101000000003A
:1000D0000000000000000000000000000000000020
:1000E0000000000000000000000000000000000010
:1000F000000000000000000000000000000000A55B
:00000001FF
起動直後からI2Cアドレスの選択を4つのPINに変更した回路データになります。この回路を使ってどのような動きになるのか確認してみます。
こんな動作確認は実験ボードが便利ですね。
#3 | #2 | #1 | #0 |
PIN7 | PIN6 | PIN5 | PIN4 |
IO5 | IO4 | IO3 | IO2 |
アプリケーション上ではPIN番号で書いてありますが、実際のIOですと上記になります。よくボードをみると、IO2にはSLA_0と書いてあります。これってSlave Addressの略でした。
さて、動作確認したところリアルタイムにアドレスが変更されました。最初は起動時のIOなのかと思っていましたが、IOの信号レベルを変更すると即反映されていました。
まとめ
よくあるI2Cデバイスのアドレス選択ピンがかんたんに実現できるんですね。複数のGreenPAKをI2Cで接続する可能性がある場合には、レジスタで事前に書き換えるのもいいんですが、2PINぐらい割り当てて、4アドレスを選択できるようにするとかの方が直感的でいいのかもしれません。
コメント