あーさん日記

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

SIO通信1

■単純なecho

// MBED側のコード
r = 0;
	for(;;)
	{
		writeSPI32(r, "echo");
		r++;
		wait(1);
	}
// GBA側のコード
IWRAM_CODE void IrqSerial(void)
{
	// EMPTY
}
・結果
GBA        MBED
0x00000000 0x00000000  ; echo
0x00000000 0x00000001  ; echo ※1
0x00000001 0x00000002  ; echo ※2
0x00000002 0x00000003  ; echo
0x00000003 0x00000004  ; echo

※1
MBED側から「1」を送る

GBA側は何もしない。REG_SIODATA32は「1」となる

SIO通信による同時交換の為、
MBED側の帰りは「1」ではなく「0」


※2
MBED側から「2」を送る

REG_SIODATA32は「2」となる

SIO通信による同時交換の為、
MBED側の帰りは「2」ではなく「1」


GBA側よりecho

// MBED側のコード
r = 0;
	for(;;)
	{
		r = writeSPI32(r, "echo");
		wait(1);
	}
// GBA側のコード
IWRAM_CODE void IrqSerial(void)
{
	u32 t = REG_SIODATA32;

	REG_SIODATA32 = t + 1;
	REG_SIOCNT = SIO_IRQ | SIO_32BIT | SIO_START;
}
・結果
GBA        MBED
0x00000000 0x00000000  ; echo
0x00000001 0x00000000  ; echo
0x00000001 0x00000001  ; echo
0x00000002 0x00000001  ; echo
0x00000002 0x00000002  ; echo
0x00000003 0x00000002  ; echo

バトンリレーのようにカウントアップしていくと思ったら
予想外に違っていました。

各端末の保持している値を手書きしたところ問題なく、
SIO通信の「いっせーのせー」で交換すると、こういう挙動になるようです。