そろそろ、RXマイコンも何とかしないとー、と思い、とりあえず、SDカードを接続してみた。
ネットで探すと、AKI-RX62にSDカードを繋ぐ記事は少ないようなので、同じような事を考えている人は参考になると思う。
※コンパイラは gcc を使っているが、コンパイラの依存をなるべく少なくなるようにしているので、ルネサスのIDEでもコンパイル出来ると思う。
まず、SDカードの前に、シリアルコミュニケーションを何とかしないと駄目だーー
それで、とりあえず、SCI0だけ使える、モジュールを作った。
シリアルは、以下のピンを使う。
P20(TxD0)
P21(RxD0)
※FTDIの変換モジュールを使ってUSB接続
rx62x_sci.h、rx62x_sci.c
「ポーリング」、又は、「割り込み」のどちらかで、初期化すれば、後は、ある程度適当にやってくれる。
※「ポーリング」はあまりちゃんとテストしていないので、あしからず・・・
※処理負荷も低いし、「割り込み」モードで問題無いハズだ、バッファの大きさを変えたい場合は、ソースコードで define されてるので、好きな大きさに変えられる。
※割り込みレベルも変更できるようにしてある。
自分が使っている gcc では、ビットフィールドを使ってデバイスを操作すると、まともに動作するコードが出来ない為、とりあえず直接ビットパターンを書き込むようなコードとなっている。
※そのうち、この問題は解決しなければならないのだが・・・
そもそも、ビットフィールドの操作は、コンパイラ依存の部分が多いし、エンディアンの違いなども関係する為、使わない方向で考えている。
最終的には、処理系や、エンディアンなどに依存しない実装を考えないと駄目な感じ。(これはそのうち・・)
※ルネサスのサンプルは、標準的にビットフィールドを使ってるみたいなので、何とかしないと・・・
SCIが動くようになったので、早速SDカード、まず、FatFsをダウンロードする。
※サンプルプロジェクトには、RX マイコン用の物もあるので、「mmc_rspi.c」を参考にAKI-RX62用に改修させてもらった。
※define マクロは、inline 関数に変更してある、define マクロは、罠にはまりやすく、可読性を悪くし、良い事は殆ど無い、速度も特別速くならない、それなのに未だに良く使われているのは不思議で滑稽だ。
※このソースでは、RSPI0を使って、パラレル/シリアル変換をハードで行っているので、かなり高速に通信できるようだ。
SDカードとの接続は、以下のピンで行っている。
PC7(MISOA-A) SDO
PC6(MOSIA-A) SDI
PC5(RSPCKA-A) CLK
PC4 /CS
PC3 /WP(ライトプロテクト)
PC2 /CD(カードディテクト)
GND GND
VCC 3V3
※VCCの電源ラインは、カードが接続された場合に大きな電流が流れて、電源が不安定になるので、フェライトビーズを入れる。
※ソースコードにはコメントを沢山入れているので、自分のシステムに合うように容易に改修できると思う。
※パスコンは適当に入れておく事。
SDカードのソケットは、ヒロセSDカードコネクタが最高だと思ってるのだけど、ピンが狭い部分があり、ユニバーサル基板に取り付けるのは厳しいと思い、SDカードソケットモジュールを使う事にした。
前に「安かった」ので買っていたのだが、いざ、基板に付けてみると、「ライトプロテクト」が無いじゃん~・・・、まぁいいかー、試作だしー、と思ったのだが、SDカードを入れたり出したりしてみると、??
このCD(CardDetected)って、WriteProtectなのでは!?、
じゃぁ、CDは???、Google 先生に聞いて、このカードソケットの図面を探してみたー、あったー、まさしく、このソケットに違いない~、で、「CD」は?、うーーんGNDに接続されてるし・・・、しかた無いので、パターンをカットして、CDを取り出してみた。
ちなみに、マイクロSDは、小さくて良いのだが、小さすぎて無くしそうな感じなので、イマイチ好きになれない・・・www
それにしても、ELMさん(ChaN)のFatFsは、本当に良く出来ている、こんなに簡単に組み込めるのは、高品質なソースコードの所以であると思う。
文字コードをどうするか?
FatFs は、「ffconf.h」の設定で、デフォルトの文字コードを選ぶ事が出来ます。
そこで、利便性を色々考えて・・・
#define _LFN_UNICODE 1 /* 0:ANSI/OEM or 1:Unicode */
とします、こうすると、ファイル名の扱いが、全て WCHAR 型(unsigned short)になりますが、色々と一番扱いが楽だと思います。
しかし、シリアル出力などは、8ビットなので、UTF8などに変換が必要です、UTF8とUTF16は、論理的な相互変換が出来るので、比較的楽です。
さて、SDカードが読めて、シリアルコンソールが繋がると、もっと本格的にソフトの実装が出来ないと利便性がありません・・
そこで、syscalls の実装を行いました。
これは、以前にSH2Aで実装したリソースの再利用なのですが、一応実装されただけで、まだテストは出来ていません・・
syscalls の実装を行う事で、printf やファイルのオープン(fopen)など、POSIX の関数が普通に使えるようになります。
※SDカードは自動的にマウントするようになっています。(刺してから1秒くらい待ちます)
このプログラムを書き込んで、起動すると、「SD Monitor」なる物が起動します。
コマンドは、「ls」(ファイルのディレクトリーリスト)のみです。www
STL も普通に使えるみたいです、これから詳細な検証。
※リンク時に、気になる警告が出ますが、問題無いようです・・・
あと、リアルタイムクロックを乗せないと駄目な感じです、RXマイコンにもRTCは付いてますが、バッテリーバックアップが出来ないので、全く使い物になりません。