2つのインターフェイス
PS2のコントローラをRoboShellに接続して、DualShock対応まで確認できたことは前回までのブログのとおりである。PS2のコントローラは同期式のシリアル通信が使われている。この同期式のシリアル通信は調歩同期式と並んで、マイコンでは非常にポピュラーな周辺機能である。
当然、LPC2138にもこの機能が装備されている。今まではGPIOをソフトで制御して、この機能を実現してきたわけであるが、折角なのでこの機能を実装することにした。
必要なことは
1.配線の変更
2.ポートの変更
3.SPI化
である。
1.配線の変更
今まではなんとなく、P0.10からのポートを使っていたが、SPIの部分に割り当てる必要がある。今時のマイコンは一つのピンに複数の機能がアサインされている。GPIOは最も基本的なものであるので、特に問題なく変更できた。
2.ポートの変更
ピンが代わるわけであるから、当然ポートにも変更が必要である。これは #define で宣言してあるので、その部分だけを変更すればOKである。ここでも抽象化が役に立っているわけだ。
以上まででGPIOを使ったプログラムは問題なく動作する。
3.SPI化
SPI化に伴う、作業がいくつか発生する。
1.初期設定
各種レジスタの設定
クロックの設定
など
2.プログラムの作成
SPIの書き出し・読み込み
LSB,MSB変換
PS2コントローラはLSBファーストのシリアル通信フォーマットだが、今回利用したSSP(SPI1)ではMSBファーストしかサポートしていない。仕方が無いので、xSBを入れ替えるプログラムを作成した。
以上、を踏まえてSPI化は成功した。SPIにしたメリットは大きい。クロック速度を自由に設定できるし、ソフトで読み取るよりも高速に読み出せる。プログラムが小さいこともメリットだ。ただ、別の機能をSPIで使うときもあると考えられるので、より自由度の高いGPIO方式も残しておくことにした。ヘッダファイルの #define でどちらの機能を使うか選択できるようにした。