先日着手したNUCLEO-F767ZIのオンボードイーサネットをMicroPythonで動かすためのドライバですが、ようやく動きました。
少しコードを整理したら公開する予定です。
途中で少しデバッグに苦労しましたが、基本的には自分のミスや知識不足が原因で、終わってみればあまり厄介なポイントは無かったように思います。
技術資料としてはUM1974が必須です。この資料のP28-29にEthernet周りのI/Oが記載されています。
CPUにはMAC層は内蔵されていますがPHYチップは外付けで、ドライバはCPUとPHYチップの結線およびPHYチップの仕様に従わなければなりません。もっとも、そのコード自体はSTM32CubeMXに付属するサンプルに含まれています(といってもサンプルは一つしか入っていないのですが)。今回もそのコードを参照しました。
また、TCP/IPとしてLwIPを使っていますので、その資料としてUM1713が有用です。LwIPそのものについての解説も付属しています。
この資料にあるとおり、LwIPにはRaw、NetConn、Socketという3種のAPIがあり、Raw以外の2つはスレッド機能を持つOSが必要となります。MicroPythonはLwIPをRaw APIで使用しています。(上記のSTM32CubeMX付属のサンプルはNetConnを使っています。)
LwIPをEthernetと接続するには、パケットが到着したかどうかをポーリングし、届いたパケットをLwIPに渡す処理を定期的に行う必要がありますが、このあたりは既にWIZNet用ドライバのお手本があります。
ですので、結局は初期化とパケットの読み書きを、STM32CubeMXのサンプルを参考に書くだけです。
・・・という見通しは実は初期段階から見えていたのですが、実際に着手してみると、ちゃんと動くようになるまで何日もかかりました。
やはりマイコンはデバッグがなかなかしんどいなあとあらためて思いました。
コメント