SPI通信を使ったカラーディスプレイ表示
fuRo
f-paletteでArduino用のカラーLCDシールドを動かしてみました。
先日のMake展でのカラーLCDモジュールの展示に影響されて
“f-paletteでもカラーLCD使いたい!”って欲望と
“Arduino用のシールドって使えるの?”って疑問と
“f-paletteのSPI使ったサンプルがほしー”って要望がうまくかみ合って作ってみた次第でございます。
秋葉原で購入したカラーディスプレイ(sparkfun Color LCD Shield)を接続
このLCDシールドの特徴。
- nokia製6100LCDを搭載
- SPI接続(write only)
- EPSON社製描画コントローラとPHILIPS社製描画コントローラのどちらかが使用されている
- 電源5V駆動
SPIの設定について主に気にしなきゃいけないところ。
- マスターorスレーブ
- クロック極性・位相
- 通信ボーレート
- 転送データビット幅
今回のLCDではそれぞれ
- マスター(f-palette) スレーブ(LCD)
- output falling edge / normal phase
- 6MHz程度
- 9-bit
となるので、f-palette側のSPIの設定と送受信部分をプログラムで書くと
おおよそ以下のようになります。
... volatile struct SPI_REGS *s_pRegSpi = &SpiaRegs;// 今回はSPIレジスタAを使う volatile struct SPI_REGS *getSpi(void){return s_pRegSpi;} ... void spi_init() { getSpi()->SPICCR.bit.SPISWRESET=0;// reset SPI getSpi()->SPICTL.all =0x0006; // Enable master mode, normal phase, // enable talk, and SPI int disabled. getSpi()->SPICCR.all =0x0048; // falling edge, 9-bit char bits getSpi()->SPIBRR =0x0000; // Baud rate: LSPCLK / 4 (30MHz / 4) LSPCLKはシステム側で設定 getSpi()->SPIPRI.all=0x0000; // Set so breakpoints don't disturb xmission getSpi()->SPIPRI.bit.FREE=1; // あってもなくても getSpi()->SPICCR.bit.SPISWRESET=1;// Enable SPI } void spi_fifo_init() { // Initialize SPI FIFO registers getSpi()->SPIFFTX.all=0xE040; getSpi()->SPIFFRX.all=0x2044; getSpi()->SPIFFCT.all=0x0; } void spi_xmit() { // 左詰めで送信バッファにセットする getSpi()->SPITXBUF=(data<<(16-9));// sizeof(SPITXBUF) - 9bit } void main() { ... spi_fifo_init(); spi_init(); ... for(;;){ Uint16 dummy; .... spi_xmit(data);// 送信セット while(getSpi()->SPIFFRX.bit.RXFFST !=1) { } // ダミーでも受信しないといけない dummy=getSpi()->SPIRXBUF; } }
*今回のデモで実際に使用したコードは「ここ→demoLCD」に置いておきます。
* LSPCLKが標準では15MHzのため、同じことをする場合はSystem設定部分でLSPCLK設定箇所を修正してください。
それでは実演。
簡単なゲームぐらい作れちゃいますね。
おまけ
下のモジュールも同じnokia6100を使っているのですが
コントローラがEpsonのもの。上のシールドはPhilips製でした。
コントローラの見分け方が「やってみるしかない」みたいでちょっと苦労しました。