RX24TでSDカードの読み書き

RX24TにもSDカードを接続してみた。

ほとんどは、RL78のリソースを使ったものの、FatFS を ff12b と最新の
実装を使った。
また、なるべく、固有のハードウェアー設定を追い出して、ハードの依存を
少なくする仕組みを整えた。

RX24Tには、専用のSPIチャネル(RSPI0)が1つだけあるので、
SDカードに割り当てた。
SDカードを扱うと、このチャネルはほぼ占有されてしまうと思うので、他
とのシェアをあまり考えなくてもも良いと思うが、一応、それも可能に出来る
ようにはしてある。

img_0855s

新規に作成した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」に対して、「=」で、値を設定、
「()」で読み出す事が出来る。

RX24T SD カードアクセスサンプル