Sim's blog

電子工作はじめてみました

ソフトSPIの実力

2008-10-19 14:23:52 | AVR
Nokia6100液晶はソフトウェアSPIで通信しています。どのくらい速度が出ているのかオシロで見てみました。



上の赤が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を犠牲にして速度をかせいでいることになります。

それにしても、ソフトだけなのに結構出るもんなんですね。

最新の画像もっと見る

コメントを投稿