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製でした。
コントローラの見分け方が「やってみるしかない」みたいでちょっと苦労しました。


