Arduinoで漢字表示(3)
前回の予告に従い、漢字フォントデーターをI2C EEPROMより大容量のSPI Data Flash Memoryに格納してみました。
使用したメモリ
ATMEL社のAT45DB161Dをスイッチサイエンスさんから購入。容量は2MBとSDメモリーカードに比べると小さいですが、漢字フォントを格納するためには十分です。お値段も購入時点で360円でしたのでお安いです。
Arduinoとの接続
回路図を以下に示します。
AT45DB161DとArduinoはSPIで接続します。
AT45DB161Dの動作電圧は2.7V~3.6Vですので、Arduinoの3.3V電源出力を使用して駆動しました。SI, SCK, CS, REST入力は5V許容のため、Arduinoと直結です。SO信号はHighレベルの出力が3.1V~3.3Vとなり、5Vで動作するAVRがHレベルを認識できる下限値(0.6*VCC = 3.0V)ぎりぎりの値となります。直結でも動作しましたが、レベルシフターを入れてあります。レベルシフターもスイッチサイエンスさんで購入しました。
文字列をFlash Memoryに書き込んで読み出しを行う試験をした際に、最初は不定期に文字化けが発生する現象に悩まされました。パスコンの位置を変えると文字化けの出方が変わるのですが解消はしてくれません。最終的にAT45DB161DのGNDを最短距離で配線することで解決しました(当初は、ブレッドボードのグランドラインを使用したためグランド配線が長めに引き回されていました)。SPIのクロックが4MHz(システムクロックの1/4)の設定になっているため、これまで自作した回路の中では一番ノイズの影響を受けやすいのだと思います。オシロスコープがあれば波形を観測してノイズの影響など調べるとおもしろそう。オシロスコープ欲しいです。この機種あたりなら、手が届くのですが、、、
AT45DB161Dのライブラリ
Arduino用のライブラリが見つかりました。大抵のライブラリはArduinoコミュニティーから調達できるため便利です。
Arduino playgroundに掲載されている、dataflashライブラリも動作しましたが、AT45DB161Dで使用しているSPIコマンドが一部未サポートです。dataflashライブラリはAT45DB041BなどのB version(型番末尾のアルファベットがバージョンを示します)をターゲットにしているためCバージョン以降で追加されたコマンドが未サポートのようです。
Webを漁ると、BlockoSさんのblogにAT45DB161D用のライブラリがありました。丁寧なドキュメントもあります。私が試した範囲では、ComparePageToBuffer()関数にバグがありました。オリジナルのコードは比較を行った後にstatusレジスタBit6が1の場合正常の判定を行っていますが、0が正常値です。そのため、以下のようにコードを修正しました(青字が修正部分)。
int8_t ATD45DB161D::ComparePageToBuffer(uint16_t page, uint8_t bufferNum)
{
uint8_t status;
DF_CS_inactive; /* Make sure to toggle CS signal in order */
DF_CS_active; /* to reset Dataflash command decoder */
/* Send opcode */
spi_transfer((bufferNum == 1) ? AT45DB161D_COMPARE_PAGE_TO_BUFFER_1 :
AT45DB161D_COMPARE_PAGE_TO_BUFFER_2);
/* Page address */
spi_transfer((uint8_t)(page >> 6));
spi_transfer((uint8_t)(page << 2));
spi_transfer(0x00);
DF_CS_inactive; /* Start comparaison */
DF_CS_active;
/* Wait for the end of the comparaison and get the result */
while(!((status = ReadStatusRegister()) & READY_BUSY))
{}
if ( status & COMPARE )
return 0; /* If (COMPARE bit = 1) then Error */
else
return 1;
}
動作試験
前回掲載したJIS配列の漢字フォントをAT45DB161Dに書き込んで動作試験を行いました。
AT45DB161Dは書き込みはページ単位、読み出しはページ番号+オフセットを指定して行います。ページサイズはデフォルトで528byteとなっています。512byte/pageに変更できますが、一度変更すると528byteには戻せないとデーターシートに記載があります。2のべき乗でないと使いづらそうなので512byte/pageに変えてやろうかと思ったのですが、ライブラリは528byte/pageを前提に作ってあります。
よく考えてみると、漢字フォントのデーターサイズは24byte(全角)or 12byte(半角)のため、1 pageにぴったり収容できます(全角22文字がぴったり入る)。そのため、528byte/pageのままで使用しました。フォトンデーターの読み出しは、ContinuousArrayRead()関数を使って、指定したページ + オフセット位置から24byte分のデーターを読み出すようにしています。
前回同様のJISコード順に漢字を表示するだけのテストプログラムですが、以下の通り動作させることが出来ました。
正確な測定はしていませんが、I2CインタフェースのEEPROMより表示が早くなったように思います。SPIクロックが4MHzのため、I2Cより高速動作ができているようです。
次の目標は、Unicode(UCS-2)版のフォントデーターを作成して表示を行うことです。あと、そろそろユニバーサル基板にGLCD,メモリーなどを搭載して、GLCDシールドに移行したいと思っています。















最近のコメント