RX24TにもSDカードを接続してみた。
ほとんどは、RL78のリソースを使ったものの、FatFS を ff12b と最新の
実装を使った。
また、なるべく、固有のハードウェアー設定を追い出して、ハードの依存を
少なくする仕組みを整えた。
RX24Tには、専用のSPIチャネル(RSPI0)が1つだけあるので、
SDカードに割り当てた。
SDカードを扱うと、このチャネルはほぼ占有されてしまうと思うので、他
とのシェアをあまり考えなくてもも良いと思うが、一応、それも可能に出来る
ようにはしてある。
新規に作成したUSBシリアルコンバーターから、電源を取っているのだけど、
SDカードをマウントすると、USBシリアルデバイスが不安定になる現象が
起こった、これは、SDカードマウント時に大きな電流が流れ、電圧効果が大
きいのだろう、そこで、解消の為、USBシリアルモジュール側に47uFの
コンデンサを追加した、(22uFくらいで十分だと思うが、手持ちが無かっ
た)これで、安定的に動作するようになった。
念のため、RX24T側にも10uFのコンデンサを足した。
簡単なベンチマークを行った。
※サンプルのSDカードは、Transcend の8GB
※RX24Tでは、SPIの最大クロックは20MHzとなっている。
RX24T: SD Speed test start... SD Write test... Write frame: 460 Write: 136770 Bytes/Sec Write: 133 KBytes/Sec SD Read test... Read frame: 133 Read: 473041 Bytes/Sec Read: 461 KBytes/Sec RL78/G13: SD Write test... Write frame: 541 Write: 116293 Bytes/Sec Write: 113 KBytes/Sec SD Speed test start... SD Read test... Read frame: 180 Read: 349525 Bytes/Sec Read: 341 KBytes/Sec
※書き込み速度は、あまり変化は無いが、読み込み速度はかなり改善している。
※RL78では、SPIのクロックは16MHzだったので、その分と、CPU
の処理能力の違いと思える。
-----
ポートを1ビット単位で定義できるようなクラスを実装した、これはRL78
でも同じようなクラスを実装したけど、より汎用的な仕様にした。
定義の仕方は、RL78とほぼ同じだが、ポートの指定は、テンプレートクラス名とした。
typedef device::PORT<device::PORT6, device::bitpos::B5> sdc_select; ///< カード選択信号 typedef device::PORT<device::PORT6, device::bitpos::B4> sdc_power; ///< カード電源制御 typedef device::PORT<device::PORT6, device::bitpos::B3> sdc_detect; ///< カード検出
RXマイコンでは、ポートの出力と、入力は、異なったレジスターを利用する
為、テンプレートクラスは、この対応が非常にやりやすい。
以下は、ポートクラスの一部:
struct port_t { static bit_rw_t<rw8_t<PORTx::base_address_ + 0x20>, bpos> PO; // ポート出力用 static bit_ro_t<ro8_t<PORTx::base_address_ + 0x40>, bpos> PI; // ポート入力用 void operator = (bool val) { PO = val; } bool operator () () { return PI(); } }; static port_t P;
operator をオーバーロードする事で、「P」に対して、「=」で、値を設定、
「()」で読み出す事が出来る。