LAN8720A モジュールの試用

FreeRTOS でネットワーク関係を実験したくて、中華製のLAN8720 モジュールを試してみた。

モジュールは、アマゾンで購入した。

本当は、RX65N Envition kit で未実装のPHYチップやトランスなどを実装して、実験するつもりで部品を買っていたが、QFNパッケージのハンダ付けが難しく(1個失敗した)、また、本体を壊してしまうのではと思い、工具も無いので、ストールしていた。

LAN8720A はマイクロチップの 10/100 イーサネット PHY で、安価で入手しやすく、比較的良く使われているデバイスだ。
※GR-KAEDE にも使われている。

QFNパッケージで、裏が全面 GND、DIY ではユニバーサル基板で製作しにくい。
※QFN のユニバーサル基板が割高で入手しにくいのも要因

モジュールは安く送料も無料だが、船便なので、注文してから10日程かかる、基板が届いて早速開封、ネットで回路などを探す。
「LAN8720 ETH Board」

このモジュールは、50MHz の OSC が乗っていて、一般的な25MHz クリスタルとは異なっている。

LAN8720Aは、リセット時のピン状態を読み込んで、基本的な設定を自動で行う「Configuration Straps」と呼ばれる機能がある。

50MHz 外部クロックを使う場合、「LED2/nINTSEL(2)」をオープンかプルアップしておく必要がある。
※ボードはLEDが接続されており「オープン状態なので」50MHz外部クロックモードになっていると思われる。
同時に LED のドライブはアクティブ LOW となる。(吸い込み)

最初に試すソフトは、以前に実験した、ルネサスの T4 ライブラリなので、GR-KAEDE などと同等にしておく必要がある。

RX マイコンの仕様なのかもしれないが、PHY デバイスとの通信で使う「MDC、MDIO」は参考回路ではプルアップしてあるので、同じようにプルアップしておく。
※以前に、プルアップが無い場合にPHY通信が失敗した事があった。
※回路図を見ると、MDIOはプルアップしてあるので、MDCのみ適当な抵抗(3.9K)でプルアップしておいた。

このボードで、問題なのは、RX_ER 端子がプルアップされて、外部コネクタに出ていない。
また、この端子は、「 Configuration Straps 」における、PHYアドレスを設定するピンでもある、チップ抵抗を外して、直接ラインを接続した。
※ボードは、写真のように、ピンヘッダーを外して、直接ボードに取りつけてある。
※このような組み方を良くする、やってみると簡単で確実。

RX_ER 端子を直接接続

今回実験に使ったRXマイコンは、RX71Mで、169ピンタイプ。

イーサーネットは、チャネル0を使った。
各ピンの接続は以下のようになっている。
RX71M: P83/RMMI0_CRS_DV(74) —> CRS_DV(7)
RX71M: P82/RMMI0_TXD1(79) —> TXD1(14)
RX71M: P81/RMMI0_TXD0(80) —> TXD0(11)
RX71M: P80/RMMI0_TXD_EN(81) —> TXD_EN(12)
RX71M: P77/RMMI0_RX_ER(84) —> LAN8720 (10) 直接続
RX71M: P76/REF50CK0(85) —> RX_CLK(8)
RX71M: P75/RMMI0_RXD0(87) —> RXD0(10)
RX71M: P71/RMMI0_RXD1(88) —> RXD1(9)
RX71M: P72/ET0_MDC(101) —> MDC(5)
RX71M: P71/ET0_MDIO(102) —> MDIO(6)
RX71M: Vcc(3.3V) —> VCC(1, 2)
RX71M: Vss(GND) —> GND(3, 4)

接続の様子:

Start RX71M http sample
Link no proccess (0)
Link no proccess (1)
Link no proccess (2)
Link no proccess (3)
Link no proccess (4)
Get DHCP: 192.168.0.4

RXマイコン、FreeRTOS、FatFs でオーディオ再生

前回、マルチスレッドとは言え、シンプルな物で、動作検証を行った。

そこで、今回はもう少し複雑となる、MP3、WAV、のコーデックを動かして、実用的な実験を行った。

詳細は「RXマイコン、FreeRTOS、FatFs、で MP3、WAV の再生」に投稿した。

プログラムは、
・自作 RX64M
・GR-KAEDE
・RX65N Envition kit
などで行った。

FreeRTOS は使える~

元は、シングルタスク用に作ったもので、それを別タスクで動かし、コーデックのデコードをやっている。

タスク間は、ファイル名の受け渡しを行っている。

音楽再生中に、SDカードのディレクトリーを取るなど、平行動作させても、音楽の再生は途切れずに鳴り続ける。

FreeRTOS で FatFs を使う

FatFs 0.13c には、スレッドセーフで動かす為の機能が用意されている。

そこで、FreeRTOS で異なるタスクから、ファイル操作を行う実験を行い、その設定などをまとめ Qiita に投稿した。

RXマイコンを使って、FatFs を FreeRTOS で運用する

GR-KAEDE(RX64M)、自作のRX64Mボード、RX65N Envition Kit などで動作を確認した。
※RX66T、RX71M でも動作するだろうが、SDカードのインターフェースを付けていないので確認できない・・

RX24Tではメモリが少なく、動作を確認出来なかった・・

RX24Tは、RAMが16Kしか無いので、タスク別にスタックを確保する必要があるので、どうしても無理があるのかもしれない。
多分、32Kあれば、動くと思える。

FreeRTOS で FatFs を使う場合、現在のバージョンでは、多少、FatFs のソースコードを修正する必要がある。

FatFs をバージョンアップ

FreeRTOS を本格的に運用する目処がたったので、まず、FatFs を最新版にした。

以前は、「ff12b」を使っていた。

今回「ff13c」に移行した。

意外と大きく変更になっている。

・ファイル名やパスが整理された。
・ヘッダー定義名やマクロ名などが、吟味され、より良くなった。
※マクロ名など、他のシステムと「当たらない」ように修正されたようだ。
・ファイルパスの文字コードがより洗練されて扱いやすくなった。
※ファイルのパスコードで、以前は、CP932 か、UTF-16 しか選べなかったが、UTF-8 も使えるようになった。
・排他制御用をやりやすいように変更があったようだ。
※lock、unlock などの関数コールが追加され、FreeRTOSと親和性が高い。
・一部、API が廃止になり、新しい API になった。
※日本だけなら、コードページ932だけで良いが、世界中で使っているので、その辺りを柔軟に改良したようだ。

などなど、細かく色々修正されている。

えるむ/ChaN さんのこのプロジェクトは世界中の人が使っている。
本当に素晴らしく、高機能なもので、今でも、少しづつ改良されているのには驚くばかりで、本当に頭が下がる。

FreeRTOS のような RTOS では、複数のタスクから、ファイル操作が出来ないとならないので、ドライバーの出来は、性能に直接影響するので、現在のソフト転送は改良する必要性がある。

ただ、難しい部分でもあり、性能を上げるのは簡単ではなさそうだ・・・

—–

とりあえず、github の FatFs を使っているアプリを全て修正し、master ブランチにマージしてある。

FreeRTOS、Rxv2 と、他デバイス対応

現在自分が扱う RX マイコンはどれも、RXv2 コアなので、GCC/RX600v2 のコードを使いたい。
しかしながら、gcc-6.4.0 は「RXv2」に対応していない。

rx-elf-as は、RXv2 に対応している。

% rx-elf-as -v --help
GNU assembler version 2.28 (rx-elf) using BFD version (GNU Binutils) 2.28
Usage: ./rx-elf-as [option...] [asmfile...]
Options:

.....
.....
.....

  --mcpu=<rx100|rx200|rx600|rx610|rxv2>
  --mno-allow-string-insns
Report bugs to <http://www.sourceware.org/bugzilla/>

そこで、RXv2 依存のアセンブリコードを使った関数を、アセンブラソースに分離して、対応する事にした。

多少の問題としては、「FreeRTOSConfig.h」の設定を使っている部分で(割り込みの優先順位)なのだが、まぁこれはあまり変更する事が無いと思うので、とりあえず、直接値を代入しておいた。

これで、リンクして、無事実行ファイルが出来、動作を確認したのだけど、そーいえば、コンパイラからアセンブラにオプションを渡せないのかな?

調べたら、あったー・・・

-Wa,option
option をアセンブラに対するオプションとして渡します。

なんだー、これだー、とゆー事で、Makefile を少し修正して、ソースコードはそのままで、「RXv2」に対応する事が出来たー
非常にスマートに対応出来た。

下記のようにコンパイラオプションを追加する事で、内部動作は、コンパイル後にアセンブラを起動する場合に、以下のオプションが追加される。

-Wa,-mcpu=rxv2

続いて、他のCPUについても、ICU 関係のクラスに「SWINT」関係を追加して、Makefile を作成して、実行ファイルを各マイコンに書き込んで試してみた。
とりあえず、問題なく動作するようだ。

これで、

RX24T
RX64M
RX71M
RX65N
RX66T

に対応する事が出来た、次は、よく使うドライバークラスをマルチタスク対応にして、ネットスタックの実験に進みたい。

ソースコードは、github の master ブランチにマージ済みとなっている。