小ネタ 2008-008

NintendoDS用I2Cインターフェース

DSのゲームカートリッジのSlot1の端子には、セーブデータのための不揮発メモリ用にSPIバスが出ており、これを使ってカメラを接続したり等の自作周辺機器を作ることができている。他にも似たようなI2Cというバス規格というのがあるのだが、DSではサポートされていない。

SPIバスにI2Cバス用の回路を接続するのを試してみた。

結論を先に書くと、自作したこれらの回路はうまく動いていない。

 
 試しに作ってみた回路 (2種類)


一般的なマイコンだと、SPIとI2Cと両方をサポートしている物が多く、片方だけしか使えないものは見かけない。普通はこんなトリッキーなことをしないでよい。


1. 汎用の74シリーズのICを使って回路を作成する

DSのSPIバスは、ARM-CPUから8ビットのI/Oポートとしてアクセスできる。このポートに8bitのデータを書き込むと、自動的にSPIバスに1ビットずつデータとクロックが送信され、同時に受信も行われる。

I2Cバスと異なる点として以下の2点があり、これらをなんとかしないといけない。

・I2Cでは送信と受信を同じ信号線で行う。SPIでは別になっているので、うまくMIXしないといけない。
・I2Cでは、8bitの送信後に1bitのACK受信を行う。1bitの単位で受信をしないといけないのだが、DSのSPIは8bit単位でしか受信できない。

そこで、74AC161というICを使ってSPIのクロックを8分の1以下に分周してクロックを落とせば、1bit単位での送受信が可能になると考えた。
実際には16分の1で回路を作った。1バイトのデータを送信するたびにクロック信号がH/Lの変化をするようにした。
チップセレクト信号CSを使って分周回路のリセットをする。そのために論理を合わせるため74AC04を使った。

送信と受信のMIXは抵抗器で接続した。ワイヤードOR回路のようなものである。受信をするときには必ず同時に0xFFを送信しておかなければならない。

 

このI2Cインターフェース用のソフトを作ってみたのだが、うまく動かなかった。

信号論理的にはI2Cに合わせたつもりだが、I2Cバス規格の信号タイミングなどの基準を満たしていないのかもしれない。




2. CP2120を使って回路を作成する

Silicon LaboratoryというメーカーのCP2120というSPI-I2CブリッジのICがあり、これを使ってみた。

CP2120のSPIはモード2に対応しており、一般的なモード0では動かない。
DSでSPIのモードを変更できないので、SPIのクロック配線に74AC04という信号論理反転用のインバーターICを入れた。

 

CP2120用のI2C制御ソフトを作ってみたのだが、うまく動かなかった。

CP2120には、汎用I/Oの機能も付いていて、こちらのGPIOの制御は動作している。CP2120の制御用レジスタへの書き込みまでは正しくできているようだ。

CP2120のI2C機能の制御レジスタの使い方に何かミスがあるのかもしれない。




 以前は、DSのGBAカートリッジ用のスロット2にマジコンを入れてソフトを起動していたので、スロット1で周辺機器を作る意味があったが、最近はスロット1用のマジコンが出たので、DSでスロット1で電子工作するのはあまり得策でない。

 これからはスロット2に自作周辺回路を接続するのを試してみたい。