Nokia6100液晶はソフトウェアSPIで通信しています。どのくらい速度が出ているのかオシロで見てみました。
上の赤がCSで、下の黄色がSCKです。1us per DIV(横方向は1マス1us)です。9つのパルスが見えるので9ビットなことが分かります。最初だけちょっと狭くて後の8つがちょっと広いです。広い方は0.75usです。1.33Mbpsですね。AVRは8MHzの内蔵クロックを使っているので6クロックで1ビット送信していることになります。このあたりは8bitとはいえ、さすがRISCといったところでしょうか。
ちなみにどんなコードだったかというと以下になります。
本来ならPORTDのMSBだけを変化させるようなコードを書くべきなのですが、8bit全部書いているのでPORTDを他の用途に使うことはできません(入力は可?)。PORTDを犠牲にして速度をかせいでいることになります。
それにしても、ソフトだけなのに結構出るもんなんですね。
上の赤がCSで、下の黄色がSCKです。1us per DIV(横方向は1マス1us)です。9つのパルスが見えるので9ビットなことが分かります。最初だけちょっと狭くて後の8つがちょっと広いです。広い方は0.75usです。1.33Mbpsですね。AVRは8MHzの内蔵クロックを使っているので6クロックで1ビット送信していることになります。このあたりは8bitとはいえ、さすがRISCといったところでしょうか。
ちなみにどんなコードだったかというと以下になります。
// マクロ #define sck() do { PORTB |= _BV(SCK); PORTB &= ~_BV(SCK); } while(0) #define cs1() PORTB |= _BV(CS) #define cs0() PORTB &= ~_BV(CS) // S1D15G10にデータを送る void lcd_data(uint8_t c) { register uint8_t t = c; cs0(); PORTD = _BV(MOSI); sck(); // 1 PORTD = t; sck(); t <<= 1; // bit7 PORTD = t; sck(); t <<= 1; // bit6 PORTD = t; sck(); t <<= 1; // bit5 PORTD = t; sck(); t <<= 1; // bit4 PORTD = t; sck(); t <<= 1; // bit3 PORTD = t; sck(); t <<= 1; // bit2 PORTD = t; sck(); t <<= 1; // bit1 PORTD = t; sck(); // bit0 cs1(); }
本来ならPORTDのMSBだけを変化させるようなコードを書くべきなのですが、8bit全部書いているのでPORTDを他の用途に使うことはできません(入力は可?)。PORTDを犠牲にして速度をかせいでいることになります。
それにしても、ソフトだけなのに結構出るもんなんですね。
※コメント投稿者のブログIDはブログ作成者のみに通知されます