2020年4月27日月曜日

STM32でDCCを作る方向で (5) NUCLEO-F207ZGのUSB HighSpeed modeがdisableである事の回避方法

今回はメチャメチャ重箱の隅の話題である.誰得にもほどがあろうというくらい重箱の隅だ.

2日ぐらい悩んでいた.

INDEXページへ

【やりたいこと】
NUCLEO-F207ZG をtargetとしてDCCを開発したい.
DCCにはUSB HighSpeed mode(480Mbps)が必要である.
しかし、NUCLEO-F207に載っているCPU STM32F207ZGにはHSのPhyが内蔵されていないので、HSのPhyを外付けせにゃいかん.

【問題】
いつも通りSTM32CubeMXでcodeの雛形を生成させる.
その際のtargetは2つ考えられる.
1)NUCLEO-F207ZG をtargetにする方法.これは便利である.なぜならNUCLEO基板の周辺回路のsettingを自動でやってくれるからだ.STLINKの対応も自動でやってくれる.
2)CPU STM32F207ZG単品の剥き出し状態をtargetにする方法.これはやりたくない.せっかくNUCLEO基板を使うのだからスクラッチでperipheralの設定なんかしたくない.

というわけで、targetをNUCLEOにするのは必須ともいえる状況.

しかーし、問題があるのだ.NUCLEO targetを振り出しにすると、このようにUSB HS modeを選択する画面がdisableなのである.HSに設定できないのである.これが問題.(CPU剥き出しなら無問題よ)

赤い部分は「External Phy」「internal FS Phy」と書かれている.意味が通じにくいと思われるのだが、External Phyとは「外付けHS用Phyを使うかどうか」の意味であり、これがdisable固定になっているので結果としてHSが使えない.またinternal FS Phyとは、「CPU内蔵FullSpeed Phyは在るけれどどうする?」の意味であり、これがdisable固定になっていて結果としてUSB IF自体が使えなくなっている.まったくつかえねー

【回避策】
xxx.icoファイルを直接編集などして回避策が徐々にわかってきた.
わかってしまえば回避策は単純なものだった.

まず理解すべき点は、USB HS modeにするべく外部Phy enableにした時点で、固定的に割り当てられるpinがある.これが固定割り当てpinの一覧.外部PhyとのIFは8bit data+制御線なのでこれだけのpinを占有するのである.
ところが、NUCLEO基板では、これらのうち赤丸をつけた2pinが別の用途に割り当てられている.その2pinの別割り当てのせいで、USB HS modeがdisableにされてしまっていたのである.PB0はLED(LD1)のピン、PB13はEthernetのピンに割り当てられている.ゆえに、その2pinを開放してやればいい、これが回避策だ.
←PB0=LED(LD1)に割り当て
←PB13=Ethernetに割り当て
なお、これらの別割り当てpinをクリアする方法は、例えばPB13についてはEthernetをdisableにすれば一蓮托生で割り当てクリアされると思うのが普通であろう.だがそれだとクリアされないっぽいので注意が必要だ.このように明示的にpinを「reset state」にブチこまなくちゃいけないというのがわたしの経験から知り得た法則だっ.

STM32CubeMXで開放してやるだけでなく、hardware的に配線切断せにゃいかんのは言うまでもない.回路図ではどうなっているのか?
PB0=LD1については、何故かLEDなんかに接続されていない.謎だ.MXの軽いbugか?
PB13については、JP7で切断できるようになっている模様.

【結果】
はーい、HSを選択できるようになりました.

めでたしめでたし.オレの貴重な約2日を返してくれ.

かしこ

0 件のコメント:

コメントを投稿