フレームバッファを一切使わないで描画できるか調べてみました。
結論からいうと条件付きでできるものの、かなり微妙です。
簡単な擬似コードを書くと以下のようになります(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ドット単位づつの描画を許容するならいいですけど・・・。
あんまり役に立たない情報でした。