SNSへはこちら

GreenPAKでお手軽ハードウェア設計(4) - NVMを使わずにLED制御

続いて GreekPAK のレジスタ書き込みについて理解するために、GreekPAK Designer という IDE を使わずに制御を行います。一部、あおいさやさんにアドバイスを頂きました。いつもありがとうございます。

まだ IO 以外のマクロは使っていないので、ただのLチカだけになりますが。

まずはレジスタの確認

まず低レイヤの沼に落ちるために、IO の仕組みをデータシートで調べましょう。

IOピン

基本的に Input, Output 両方お好みで設定できますが、IO6 と IO7 のみ Output 専用ピンなので注意が必要です。

Connection Matrix

ピン接続ですが、基本的に入力を制御してあげます
ここがマイコンと違うところなのですが、「入力ピンとしたいところを GPIO の入力につなげるかペリフェラルにつなげるか」ではありません。入力をどこのマクロセルにつなげるかということを制御します。
例えばマクロセルの出力もそうです。これこれのマクロセル出力をここに入力してあげてねと指示するのが Connection Matrix の設定です。ちょっとややこしいかな。

例えば設定してみましょう。ここでは IO12 の入力ロジック値を IO13 にそのまま反映する 回路を考えてみます。
当然 IO13 の出力を IO12 とするので、IO12 の設定レジスタ情報はこんな感じになるはずです。

  • IO13 は出力イネーブル(OE)
    • マクロセル中の OE 端子は High で有効
  • IO13 の出力値は IO12 の値

当たり前かと思いますが、この辺をはっきりとさせておくことが(初心者のうちは)重要です。このあとのビット操作が面倒ですから。では実際に考えてみましょう。

Matrix Input Tableと打ち込み先

ひとまず必要なピンに値を入れればいいとわかりましたね。じゃあどこにその情報を入れるかというと、データシートをよく読むと書いてあります。

まず出力イネーブル(OE) について考えてみましょう。マクロセル中のこのピンへの入力を決めるレジスタはどこかというと、Register Definitions によると 0x42 の上位2ビットと 0x43 の下位4ビット だということがわかります。このビットに High を入力すると、IO12 は出力ピンとして有効化されます。
ではどの値をいれればいいか整理しましょう。

  • OE には High (VDD) を入れて常時出力を有効化すればいい
  • 出力値は IO12 の入力値と直結すればいい

以上とデータシートの値を加味して、以下の値とすれば良いとわかります。

設定値が各バイト境界をオーバーラップしていて分かりづらいですが、このような値を入れれば良いわけです。

以上の設定をNVMを使わずに直接書くプログラム

以上から、マイコンで値を書き込むプログラムを作成しました。

void gp_blink_by_input(void) {
    // IO13(#2): Output
    // IO12(#3): Input
    uint8_t data[3];

    // Initialize (Output Enable)
    data[0] = 0x42;
    data[1] = 0xC0 | 11; // Output == IO12
    data[2] = 0x0F; // Connect Output Enable to VDD
    i2c_send((0x01 << 4) | 0x02, data, 3, 20); // Write

    while(1) {
    }
}

こうすることで実現できます。i2c_send では、Control Code 込のスレーブアドレス (0x01 << 4) | 0x02 に対して data という一連の配列データを 3Bytes 分送出し、1Byte 書き込むごとに 20msec のウェイトを入れる設定にしてあります。これはデータシートの特性表に書いてありました。

NVM も レジスタ領域も共通なのですが、データを書き込むときにはまずスレーブアドレスの R/W を 0(Write) にした上で、転送データ先頭に書き込みアドレスを指定します。その後にはどんどんデータを送っていけば、自動的にアドレスがインクリメントされていい感じにデータ書き込みがなされます。

動作

回路は入力ピンにプルアップ抵抗を繋げています。
動画のようにジャンパ線を GND にすると LED は消灯し、オープンにすると点灯することが分かると思います。ちゃんと所望の動作ができているようですね。

ということで、ひとまず GreenPAK のメモリ構成と Matrix になんの値を入力すればいいかを理解しました。
レジスタは正直ビットフィールドがバイト境界を跨いでいるのでわかりにくいですが、それ以外の点では基本的な IO の理解は済んだと思います。

次回以降はその他のマクロセルを使ってみます。まだ全然理解していないので先になるかと思いますが、データシートを読んで構造を把握するように努めたいと思います。