このモードは、2台のユニット間の通信に使用します。
転送速度は、256Kbps と 2Mbps が選択できますが、高速の2Mbpsは、GBAのリンクポートに直接接続される、つまりGBAと拡張ハードウェアの間にケーブルを介さないような特殊な拡張ハードウェアにのみ使用されます。
通常の場合は、安定した結果が得られる256Kbpsの転送速度を使用してください。
転送サイズは8bitと32bitがあり、8bitモードはDMG/CGBゲームボーイと同じですが、「GBAのカートリッジをGBAに装着した場合」と「DMG/CGBのカートリッジをDMG/CGB/GBAに装着した場合」では電圧が異なり、DMG/CGBのゲームとGBAのゲームは通信できません。
SIOCNTのbit13-12と合わせて、転送モードを設定するのに利用します。
使われているのはbit15だけです。
ビット | 内容 |
---|---|
0-3 | 未定義 (current SC,SD,SI,SO state, as for General Purpose mode) |
4-8 | 不使用 (常に0が望ましいが1を書き込むこともできる) |
9-13 | 不使用 (常に0,読み取り専用) |
14 | 不使用 (常に0が望ましいが1を書き込むこともできる) |
15 | 0 (モードをノーマル/マルチプレイ/UARTにしたい場合) |
ビット | 内容 |
---|---|
0 | シフトクロック (0=外部クロック, 1=内部クロック) |
1 | 内部シフトクロックの転送レート (0=256KHz, 1=2MHz) |
2 | SI (Serial Input) (0=Low, 1=High/None) --- (Read Only) |
3 | SO during inactivity (0=Low, 1=High) (applied ONLY when Bit7=0) |
4-6 | 不使用 (常に0,読み取り専用) |
7 | スタートビット (0=Inactive/Ready, 1=Start/Active) |
8-11 | 不使用 (常に0が望ましいが1を書き込むこともできる) |
12 | 転送サイズ (0=8bit, 1=32bit) |
13 | 0 (通常モードでは必ず0) |
14 | IRQビット(0=無効, 1=転送完了時にIRQをリクエスト) |
15 | 不使用 (常に0,読み取り専用) |
スタートビット(bit7)は、転送が完了すると自動的にリセットされます。
IRQビット(bit14)がセットされている場合、8bitまたは32bitすべての転送が完了すると、その時点でIRQが生成されます。
転送サイズが8bitで、転送モードが通常モードのときのためのレジスタです。
8bitのデータが格納されています。(下位8bitのみ使用)
送信データは、転送を開始する前にこのレジスタに書き込む必要があります。
転送中、MSBからシフトアウトされたビットが送信され、同時にこのレジスタに受信したビットがシフトインされます。
転送が完了すると,このレジスタには受信した8bitの値が格納されます。
o7 o6 o5 o4 o3 o2 o1 o0
o6 o5 o4 o3 o2 o1 o0 i7
o5 o4 o3 o2 o1 o0 i7 i6
o4 o3 o2 o1 o0 i7 i6 i5
o3 o2 o1 o0 i7 i6 i5 i4
o2 o1 o0 i7 i6 i5 i4 i3
o1 o0 i7 i6 i5 i4 i3 i2
o0 i7 i6 i5 i4 i3 i2 i1
i7 i6 i5 i4 i3 i2 i1 i0
内容は大きさが32bitレジスタになった以外、SIODATA8と同じです。転送サイズが32bit用のときに使われます。
SIODATA32に書き込み始める前に、必ずSIOCNTとRCNTを32bitの通常転送モードに設定する必要があります。
-
まず、RCNTレジスタを初期化します。
-
次に、スタートビット(SIOCNT.7)をクリアした状態で、SIOCNTのモード/クロックビットを設定します。
マスターの場合:内部クロック(SIOCNT.0=1)を選択し、転送レート(SIOCNT.1)として256KHzを指定します。
スレーブの場合:外部クロック(SIOCNT.0=0)を選択します。ローカルの転送レート(SIOCNT.1)の選択結果は無視され、転送レートはリモートのGBA(またはカスタム転送レートを供給する他のコンピュータ)から供給されます。
- 最後に、モード/クロックビットを変更せずに、SIOCNTのスタートビットをセットします。
- マスター側に送る予定のデータを初期化
- スタートビットとSOをクリア
- スタートビットとSOをセット
- SOをクリアしてマスター側に転送準備ができたことを知らせる
- IRQが起きる、またはスタートビットが0になるのを待つ
- 受信したデータを処理する
- 送りたいデータがまだ存在する場合はこの手順を1から繰り返す
- スレーブ側に送る予定のデータを初期化
- SI(SIOCNTのbit2)が0になる、つまりスレーブ側の準備が整うのを待つ(タイムアウトを設けることを推奨)
- スタートビットをセット
- IRQが起きる、またはスタートビットが0になるのを待つ
- 受信したデータを処理する
- 送りたいデータがまだ存在する場合はこの手順を1から繰り返す
転送がアクティブで無い場合には、シフトクロック(SC)はHighになります。送信(SO)と受信(SI)のデータ線は、上述のように手動で制御することができます。
マスターがSC=LOW
を送ると、マスターとスレーブはそれぞれ次に送り出すデータビットをSOに出力しなければなりません。
マスターがSC=HIGH
を送ると、各マスターとスレーブはSIから相手のデータビットを読み出す必要があります。これを8ビットまたは32ビットごとに繰り返し、完了するとSCは再びHighになります。
SCは転送速度として、256KHz または 2MHz のどちらかを選択でき、1秒間に最大で32KB(256Kbit)または128KB(2Mbit)のデータを転送できます。ただし、8bitまたは32bitの転送データをソフトウェアで個別に処理する必要があるため、実際の転送速度はデータ単位の処理にかかる時間分だけ低下します。
GBA同士の通信など、ほとんどの場合は256KHzでないと安定した結果が得られません。2MHzは、特殊な拡張ハードウェア(配線が非常に短いもの)のみを想定しています。
マルチプレイケーブルでノーマルモードを使用する場合、通常のように最初のGBAと2番目のGBAの間でデータが交換されません。
その代わりに、リレーのようにGBA間をデータが移動していきます。
The first GBA receives zero, because master SI is shortcut to GND
この挙動は、マスターGBAから他のすべてのGBAへの一方向の高速データ転送に使用できます。例えばGBAが3つ繋がっている場合は次のようにデータが転送されます。
Step Sender 1st Recipient 2nd Recipient
Transfer 1: DATA #0 --> UNDEF --> UNDEF -->
Transfer 2: DATA #1 --> DATA #0 --> UNDEF -->
Transfer 3: DATA #2 --> DATA #1 --> DATA #0 -->
Transfer 4: DATA #3 --> DATA #2 --> DATA #1 -->
受信者は自分のデータを送信しようとしてはいけません。次の転送時に前に受信したデータを次の受信者に転送してください。受信したデータをデータレジスタに変更せずに残しておくだけです
遅延転送のため、2番目の受信者は最初の受信データ(上の例ではTransfer 1のUNDEF
)を無視する必要があります。
最後の転送の後、送信者は1つ(または複数)のダミーデータユニットを送信し、最後のデータ(上の例ではTransfer 3のDATA #3
)が2番目(またはそれ以降)の受信者に転送されるようにしなければなりません。