SIO通信6

f:id:akkera102:20141209201305p:plain
前回のRPC版から少し修正してようやく変数の双方向ができました。
NO.111 rpc



ただ今回はとても大変でした・・・。
ハマり加減が半端なく、次から次へと奈落の底へ。。
あまりのハマりっぷりにネタにしようかと思います。。
とりあえず2点だけ。


1、gba側をspi通信のマスターにすることはできません


ええ、当たり前の話です。
マルチブートすることを前提とした場合、必ずmbed側がマスターになります。
mosi、misoのピンはmbedを基準に固定されるわけでGBAではないです。


間違ってもGBA側をマスターにしたコードを書いて、
ピンを動かそうとした時に気がついた、とか無いようにしてください。orz


ちなみにその時のGBAのコードは以下のような感じでした。

	REG_SIODATA32 = 適当なu32の値;
	REG_SIOCNT    = SIO_CLK_INT | SIO_32BIT | SIO_START;

割り込み関数も要らないのでとてもシンプルです。カードリッジ起動には有効ですね。
僕だけかもしれませんけれど、このI/Oマップのレジスタ、綺麗だなあと思いました。


2、mbedのrpc。ターミナルソフトに気をつけよう


前回、変数のreadコマンドがうまくいかないと書きましたけれど
原因がわかりました。入力の時、/var/readの後に改行コードが入っていた為、
値が拾えなかったというオチです。

	strcpy(buf, "/var/read");
	RPC::call(buf, outbuf);

とやったらうまくいきました。


間違っても変数の値を取り出す自作関数を作った後、発覚するような
アホなことは避けましょう。。泣く泣く下記のような方法に修正。

	int var = atoi(outbuf);

まーライブラリの勉強になったからいいんですけど。。


あとエラー処理、再送処理まったく作っていません。
前回のdumpプログラムの所感で、
8MBのromを20回ぐらい吸い出した感じでは一回もcrcチェックで
引っかかったことはありませんでした。
通信速度(初期設定)が早すぎて値がおかしくなるってのは
ありましたけれど。


sdカードのspi通信仕様書でもcrcチェックを省略しているようですし
要らないことにしています。