あーさん日記

https://akkera102.sakura.ne.jp/gbadev/ の中の人

Arduboy 実験35

フレームバッファを一切使わないで描画できるか調べてみました。
結論からいうと条件付きでできるものの、かなり微妙です。


簡単な擬似コードを書くと以下のようになります(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ドット単位づつの描画を許容するならいいですけど・・・。


あんまり役に立たない情報でした。