フレームバッファを一切使わないで描画できるか調べてみました。
結論からいうと条件付きでできるものの、かなり微妙です。
簡単な擬似コードを書くと以下のようになります(SSD1306.pdf p34)。
void OledDrawDot(u8 x, u8 y) { // set page Addressing Mode // 中略 // command mode *pCs |= csMask; *pDc &= ~dcMask; *pCs &= ~csMask; SPI.transfer(0xB0 | (y / 8)); // page start address SPI.transfer(0x00 | (x % 16)); // lower start column address SPI.transfer(0x10 | (x / 16)); // upper start column address // write mode *pCs |= csMask; *pDc |= dcMask; *pCs &= ~csMask; u8 s = これから書き込む縦8ドット分の現在の情報; // ※注 SPI.transfer((1 << (y % 8)) | s); }
1回の書き込みは縦8ドット単位。問題は、変数sを用意できないことです。
SPI通信の場合、SSD1306のGDDRAMへ読み込みができません。
8.1.3 MCU Serial Interface (4-wire SPI) Under serial mode, only write operations are allowed. 8.1.4 MCU Serial Interface (3-wire SPI) Under serial mode, only write operations are allowed.
Arduboyの接続が4か3かわからなかったので両方転記しました。どちらにしてもダメ。
たとえば
OledDrawDot(0, 0); OledDrawDot(0, 3);
という順番で処理をすると、前に描画した0, 0のドットが消えます。
んー、8ドット単位づつの描画を許容するならいいですけど・・・。
あんまり役に立たない情報でした。