V850付録基板から鈴商液晶を使ってみようと思いました。ソフトだけでやると間に合わないっぽいので、DWM付録基板のFPGAを使うことにしました。FPGAへの出力はSPIにします。長くなりそうなので、V850側からはじめます
V850は3線式のシリアル通信機能をもっているので、そのまま使います(ユーザーズマニュアル16章)。コマンドを送っているのかデータを送っているのかを区別するための信号(RS)を追加します。
データは横8dotを1byteにすると384x192dotは48x192byteになります。FPGA側にRAMを持たせて0000番地~23ff番地の9k byteに左上のdotから並んでいることにしました。アドレスは自動的にインクリメントされるのでデータを送ってやれば左上から順に描画されます。コマンドはアドレスを変更するのに使います。アドレスは14bitあるので、2回に分けて送ってやる必要があります。
appliletを使って雛形を作ります。
- システムは、ウォッチドックタイマーを使用しない、オンチップデバッグを使用する。
- ポートは、P52とP53を出力にする
- シリアルは、CSIB2を使用する
- CSIB2の設定は、受信許可なし、送信許可あり、コールバックは送信完了にして他はデフォルトのままにします。
デフォルトだとデータ長8bit、MSBから送信、1Mbps、データ位相はタイプ1になっています。データ位相は立上り/立下り、正パルス/負パルスの組み合わせで4種類あります。詳しくはユーザーズマニュアルの16章に載っています。
mainはこんな感じです
コマンドで転送先を0番地にしてから、vramの内容を一気に送っています。SPIへの送信はポーリングで完了待ちしています。
送信完了のコールバック(SERIAL_user.c)はこんな感じです。
volatileな変数doneを使って完了通知をします。
CSIB2の設定で、転送モードを単発転送モードでなく連続転送モードにすることもできます。いまいち違いがよく分かっていませんが、連続にすると送信に割り込みを使うようです。V850のDMAは転送先をポートにしたり、転送のトリガーを完了割り込みにしたりできるので、DMAでSPIにデータを転送することもできるみたいです。
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にデータを転送することもできるみたいです。