V850付録基板から鈴商液晶を使ってみようと思いました。ソフトだけでやると間に合わないっぽいので、DWM付録基板のFPGAを使うことにしました。FPGAへの出力はSPIにします。長くなりそうなので、V850側からはじめます
V850は3線式のシリアル通信機能をもっているので、そのまま使います(ユーザーズマニュアル16章)。コマンドを送っているのかデータを送っているのかを区別するための信号(RS)を追加します。
V850付録基板のpin配置
RS P5.3 (CN3 5pin) 0:コマンド 1:データ
CS P5.2 (CN3 4pin) 1:disable 0:enable
SCK SCKB2 (CN3 3pin) SPI送信クロック (CSIB2)
MOSI SOB2 (CN3 2pin) SPI送信データ (CSIB2)
データは横8dotを1byteにすると384x192dotは48x192byteになります。FPGA側にRAMを持たせて0000番地~23ff番地の9k byteに左上のdotから並んでいることにしました。アドレスは自動的にインクリメントされるのでデータを送ってやれば左上から順に描画されます。コマンドはアドレスを変更するのに使います。アドレスは14bitあるので、2回に分けて送ってやる必要があります。
転送先アドレス変更コマンドの概要
RS = 0
1byte目 0x80 + アドレス上位6bit
2byte目 アドレス下位8bit
appliletを使って雛形を作ります。
- システムは、ウォッチドックタイマーを使用しない、オンチップデバッグを使用する。
- ポートは、P52とP53を出力にする
- シリアルは、CSIB2を使用する
- CSIB2の設定は、受信許可なし、送信許可あり、コールバックは送信完了にして他はデフォルトのままにします。
デフォルトだとデータ長8bit、MSBから送信、1Mbps、データ位相はタイプ1になっています。データ位相は立上り/立下り、正パルス/負パルスの組み合わせで4種類あります。詳しくはユーザーズマニュアルの16章に載っています。
mainはこんな感じです
#define CS P5.2
#define RS P5.3
#define CMD 0
#define DATA 1
UCHAR vram[48*192];
// SPI送信
void send(UCHAR rsel, UCHAR *p, USHORT size)
{
extern volatile UCHAR done;
RS = rsel; // 0:コマンド 1:データ
done = 0;
CSIB2_SendData(p, size); // 送信
while(!done) ; // 送信完了まで待つ
}
void main( void )
{
UCHAR cmd[2] = {0x80, 0x00};
// ここでvramに何か描く
CS = 0;
send(CMD, cmd, 2); // コマンド送信
send(DATA, vram, sizeof(vram)); // データ送信
while (1) ; // 無限ループ
}
コマンドで転送先を0番地にしてから、vramの内容を一気に送っています。SPIへの送信はポーリングで完了待ちしています。
送信完了のコールバック(SERIAL_user.c)はこんな感じです。
volatile UCHAR done;
void CALL_CSIB2_Send( void )
{
done = 1;
}
volatileな変数doneを使って完了通知をします。
CSIB2の設定で、転送モードを単発転送モードでなく連続転送モードにすることもできます。いまいち違いがよく分かっていませんが、連続にすると送信に割り込みを使うようです。V850のDMAは転送先をポートにしたり、転送のトリガーを完了割り込みにしたりできるので、DMAでSPIにデータを転送することもできるみたいです。