carcon999のブログ

12年間Y!ブログの記載を移行しました。電子工作関連の記事が多いです。

漢字フォントROM(GT20L16J1Y)

先日、スイッチサイエンスさんから届いた漢字フォントROM(GT20L16J1Y)を試食してみました。

イメージ 1

このチップは、SPIでアドレスを指定すると漢字の16x16ビットマップ(32バイト)を返してくれます。
液晶や、ドットLCDにこれらを表示することが可能になります。
※仕様書には、16x15とあり1ライン分は区切りラインを意味しますが、まあ16x16でいいでしょう。

直ぐに使う予定はありませんが、とりあえず動作させることができたので次回使うときに忘れないように備忘録としてメモしておくことにします。

■データシート
いろんなデータシートがあり、情報が不足している簡易版だったりするので、いろいろ探していたららフルで情報がのっているPDFを見つけることができました。
ここ(PDF) にありました。
使うときは、目を通して置くのが良いでしょう。(中文ですが・・・)

■ハードウェア
このチップは、3.3VのSPI通信します。手元にあるGR-KURUMIを利用してアクセスすることにしました。
丁度、3.3VだしSPIもこなれた感じなのでブレッドボードで結線しました。
特に外付け部品はなく、ダイレクトに配線しています。

イメージ 2


イメージ 3

※写真と線の色は異なります。

■プログラム

mbed用のプログラムを参考にさせていただきました。
こちら 私はWeb上では参照できないのでダウンロードして確認しました。

肝は、ROMのアドレス変換にあります。
データシートには、変換アルゴリズム(中文)が記載されています。(笑)
それが、上記のプログラムにも同じように記載されていますのでその変換に従います。

変換した24bitアドレスを以下のような制御で送信し、32BYTEリードすればデータを読み込むことができます。

イメージ 4

★プログラム的には以下な感じです。

uint32_t Address = get_font_rom_addr(code);

// SSをLOWにする
digitalWrite(PIN_SPI_SS, LOW);

// アドレスを送信する。
SPI.transfer(0x03);
SPI.transfer(Address >> 16 & 0xff);
SPI.transfer(Address >> 8 & 0xff);
SPI.transfer(Address & 0xff);

// ダミーデータを送ってデータを32バイト分読み込む
for(int i=0; i<32; i++)
{
data[i]=SPI.transfer(0x00);
}

// SSをHIにする
digitalWrite(PIN_SPI_SS, HIGH);

★あと、GR-KURUMIの場合、SPIの初期設定は以下になります。

// SPI通信設定
SPI.begin();
SPI.setBitOrder(MSBFIRST); // MSB First
SPI.setClockDivider(SPI_CLOCK_DIV2); // DIV2 8MHz 最大
SPI.setDataMode(SPI_MODE3); // アイドル時のクロックがHigh、立ち下がりでサンプリング

※全部貼ってもいいのですが、mbedサンプル参考にしているので全部は止めておきますね。

■表示

あとはご自由にお好きなディスプレイに表示すればOK.
とりあえず、コンソールで出力してみました。

イメージ 5

液晶、LCDだけでなく、家にあるサーマルプリンタに出力しても良いと思ってます。

■追記(2014/2/9 11:00)
もう一点注意箇所がありました。

受信した32BYTEのデータの表示データ構造が以下のようになっています。
※データシートには記載がありますが・・・
なので、受信したビットマップをシーケンシャルに表示しても何のデータか良く分からない可能性があります。
表示するデバイスに応じてビット列を変換する必要があると思います。
私はこれが一番はまったかも。

イメージ 6