■単純な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通信の「いっせーのせー」で交換すると、こういう挙動になるようです。