Sample Programs

SPI通信を使ったカラーディスプレイ表示

fuRo

f-paletteでArduino用のカラーLCDシールドを動かしてみました。
先日のMake展でのカラーLCDモジュールの展示に影響されて
“f-paletteでもカラーLCD使いたい!”って欲望と
“Arduino用のシールドって使えるの?”って疑問と
“f-paletteのSPI使ったサンプルがほしー”って要望がうまくかみ合って作ってみた次第でございます。

SPI通信

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

Follow Me!
  • Twitter