LAN9252
MicrochipのTeherCATスレーブコントローラ
FMMUが3つ
SyncManagergaが4つ
4kBのDPRAM→PDI Dual Port Memoryのことか?
LAN9253,LAN9254もある,機能比較表
Microchip EtherCAT® Product Selection Guide
EtherCATマスタを構成するにはFlashが25kB以上,RAMが32kB以上の容量が必要.これはSOEMを実装する場合の話.
気をつけることメモ
Microchipのフォーラムより
読み書きしたいレジスタのサイズに応じて1,2,4バイトを分けてしまうとレジスタの値がきちんと反映されない.
レジスタを読み書きするはすべて4バイト単位でアクセスしよう.
SOESは読み書きする関数4バイト単位でアクセスするもので下回りは作られているので気にしなくて良さそう.
LAN9252 registers are not responding
上述したように,LAN9252はSIIが正しく書き込まれてないと全く応答しない.
EtherCATの製品を売るにはEtherCATで規定されているテストをすべてクリアする必要がある.また,ETGにライセンスを毎年支払う必要がある.
厄介なのは,ETGへのライセンスのサブスクリプションをやめたとき,市場に出回っている製品をリコールしなければならない.
EtherCAT Microchip LAN9252 Implementation
レジスタ
CSR:制御/ステータスレジスタ
SPIで制御する.
直接アクセスレジスタ,間接アクセスレジスタの2種類.
直接アクセスEtherCATレジスタ:メインシステムCSRに属する.データ/コマンドレジスタとして,間接EtherCATコアレジスタアクセスに使用
間接アクセスEtherCATコアレジスタ:EtherCATコア内部にある.
要は直接アクセスEtherCATレジスタを経由し間接アクセスEtherCATコアレジスタにアクセスする.
間接アクセス可能なEtherCATコアレジスタは0x000~0xFFFに配置
EtherCATコアプロセスデータRAMは0x1000から開始.間接アクセスEtherCATコアレジスタ内部にある?
チップモード:3ポート生やすことも可能,しかしEtherCATスレーブなら2ポートあればいいか.
CHIP_MODE1 | CHIP_MODE0 | モード |
---|---|---|
0 | 0 | 2ポートモード |
0 | 1 | 予約済み |
1 | 0 | 3ポート ダウンストリームモード |
1 | 1 | 3ポート アップストリームモード |
EtherCAT制御,ステータスレジスタ(0x000~0xFFF)はCSRレジスタで間接的にアクセス.
EtherCATプロセスRAM(0x1000~0x1FFF)は16段32bit幅のFIFOで間接的にアクセス.
EtherCAT CSR及びプロセスRAMアクセスレジスタ(直接アドレス指定可能)
アドレス | 記号 | レジスタ名 |
---|---|---|
0x000~0x01C | ECAT_PRAM_RD_DATA | EtherCATプロセスRAM読み出しデータFIFO |
0x020~0x03C | ECAT_PRAM_WR_DATA | EtherCATプロセスRAM書き込みデータFIFO |
0x300 | ECAT_CSR_DATA | EtherCATインターフェースデータレジスタ |
0x304 | ECAT_CSR_CMD | EtherCATインターフェースコマンドレジスタ |
0x308 | ECAT_PRAM_RD_ADDR_LEN | EtherCATプロセスRAM読み出しアドレスおよび長さレジスタ |
0x30C | ECAT_PRAM_RD_CMD | EtherCATプロセスRAM読み出しコマンドレジスタ |
0x310 | ECAT_PRAM_WR_ADDR_LEN | EtherCATプロセスRAM書き込みアドレスおよび長さレジスタ |
0x314 | ECAT_PRAM_WR_CMD | EtherCATプロセスRAM書き込みコマンドレジスタ |
EtherCATコアレジスタやプロセスデータRAMへのアクセス手順
EhterCAT CSRの読み出し
- ECAT_CSR_CMDへ各種ビットやアクセスするレジスタのアドレス,サイズなどを書き込み,読み出しサイクルの開始をLAN9252に伝える.
- ECAT_CSR_CMDを読み出し,CSR_BUSYがクリアされていることを確認する.
- ECAT_CSR_DATAを読み出す.ここに設定したアドレスのデータが入っている.
EhterCAT CSRへの書き込み
- ECAT_CSR_DATAへ目的のデータを書き込む.
- ECAT_CSR_CMDへ各種ビットやアクセスするレジスタのアドレス,サイズなどを書き込み,書き込みサイクルの開始をLAN9252に伝える.
- ECAT_CSR_CMDを読み出し,CSR_BUSYがクリアされていることを確認する.(書き込み完了)
ひとまずAPIのポーティング考えつつ,ベンダIDのアクセスとか試してみるか.
デバイスDREADYの動作
電源管理レジスタもしくはハードウェアコンフィグレーションレジスタから読み出す.
パワーオンリセット,RSTリセット,EtherCATリセット,デジタルリセットのどれかのリセットのあとに,デバイスREADYビットはデバイスのEEPROMを読み出す.
EtherCATリセットが発生するとEhterCATコアは再びEEPROMのを読み出しに行く.
起動時に0x00から16byteのデータをEEPROMから読み出す.
ここにESCの設定とか記述されている.
xmlのConfgDataって所あるけどここが先頭のESCConfigDataでは?
ユーザRAM
128バイトの割当,0xF80~0xFFFに配置
SPIアクセス
SPIでアクセスする.
データバスを複数使用するSQIモードがあるが基本的にはSPIしか使わないだろう.
SPIモードに加えて,高速SPIモードがある.ダミーバイトを挿入することでSPIのクロックを80MHzまで上げることができる.
SOESのLAN9252アクセス関数は高速SPIで読み書きする仕様になっている.
ET1100に比べてアクセス時間がかかるので,DualSPI,QuadSPI,SQIなどが使えるようにピンが引き出されている.
My SPI access time seems much slower on the LAN9252 than the ET1100, what do I need to do to improve this?
## stm32とLAN9252を接続するQSPIの調査
stm32のQuadSPI(以下SQSPI)はコマンドを利用する.
### stm32のQuad SPI
コマンドの種類として
- 命令フェーズ
- アドレスフェーズ
- オルタネートバイトフェーズ
- ダミーサイクルフェーズ
- データフェーズ
がある.
#### アドレスフェーズ
1~4バイトのデータ
LAN9252で使うにはクアッドモードで2byte(16bit)送りたい,つまりデータ線4本で2サイクル分
このあたりの設定はQUADSPI_CCRレジスタのADSIZE,ADMODEで設定
### ダミーサイクルフェーズ
データの送受信関係なく1~31サイクル
### LAN9252の通信周り
LAN9252のQSPIのクワッドアドレス方式はSQADW,SQIORという方式らしい
IO0にインストラクション(@stm32:命令フェーズ)を1byte送り,その後4つのバス全てでデータなどをやり取り
実装メモ
ECAT_CheckTimer()
を実装する1ms周期で呼び出す.
SUNC0,SYNC1は分散クロック(DC)同期に使う.
LAN9252の割り込みタイミングに注意する.
すぐにGPIO割り込みを有効にするのではなく,別途初期化のタイミングで割り込みを有効にする.
1ms周期のタイマも同様に,すぐに有効にはしない.
割り込みの優先度は,1ms用のタイマ及びIRQの割り込みに対して,SYNC0,SYNC1の割り込みを1段階下げておく(CubeMXで設定する数字は1大きくしておく)
EEPROM
LAN9252はリセット後,EEPROMからスレーブの情報を読み出す.
先頭から16バイト(スレーブのIDまで)を読み出す.
なお,読み出しの際にエラーが発生するともう一回読み出し,2回とも失敗するとLAN9252内部のEEPROM通信エラーフラグが上がる.
ここで正しいデータが入っていないとSPIとか何も応答しないので注意.
EtherCATで接続はできるので,LAN9252使ってる既製品のSIIをEtherCATExplorerとかで書き込むのも1つの手である.
SOESを使ってstm32からLAN9252にアクセスしようと思ったが全く反応がなかったのはどうやらこれが原因だった模様.
LAN9252 - SPI issue with indirectly accessible core registers
No response from LAN9252 EtherCAT over SPI
LAN9252: No SPI response
24FC512を使うことにする.
3つのピンでアドレスを変更可能.LAN9252が読み出す時は0x50
先頭2バイトにインクリメンタルライトしたいアドレス,それ以降に書き込みたいデータをセットしてHAL_I2C_Master_Transmit
を読み出せばよい.
作業メモ ~2021-02-28
state が0x01から0x11になってる. どうやらALステータスレジスタを見たけど正しくステートが遷移していない?
EtherCAT Explorerで接続すると0x11になる.
Explorer上ではOperationnal担っているので遷移が上手く言っていない感じのよう.
544 0x220 ALイベント要求レジスタ 2320 0x910 システム時間レジスタ
CoEでコード書くのはいいけど,LAN9252のRAM(EtherCATのコアレジスタか?)とObject Dictionaryの対応はどこでやっているのか? EEPROMにConfigData(最初の16bit)以外に意味のあるデータは入っているのか? 起動してから何かしらでマイコンからLAN9252に設定をしているのであればいいけど,EEPROMのせっていからなにかしているとなると厳しい. しかし,LAN9252のEEPROMを見るとホストマイコンとの通信設定,DIOの設定,DCの設定くらいしかないさそう.であればEEPROMには最低限書けばいいか?
DPRINTを有効にしてデバッグする.stateは0x130の中身をずっと読んでいる.
0x08になればOperationnal状態
0x08以上の数字はステートマシンの遷移が何かで失敗している.
プログラム回し始めてstateがずっと出力されていると通信確立しにくい.
COE_initDefaultValues()は呼び出すとオブジェクトディクショナリ消されるので注意. SOESをサブモジュールとして取り込むなら自分用にフォークしてからのほうがいいかもね.
STM32+HALでやるときSPIのタイムアウトが短すぎると通信がうまく行かない. といってもジャンプワイヤで伸ばしているので生じている問題の可能性はある. ひとまずHALのSPI送受信関数はタイムアウトを100msにしといた.
専用基板設計とかQuadSPIとか試せるようになりたい.
TeraTermのログ
Feb 27 2021,18:03:57 F446RE Chip ID : 9252 Chip Rev: 1 VenderID: 04D8 ProductID: 92520001 Controller: 00C0 Revision: 0002 FMMU: 3 SyncManager: 4 soes: Slave stack init started soes: APP_safeoutput Hello Main # SOESの初期化がされるとここまで出力される # Simple EtherCAT Explorerでスレーブが接続されているポート選択する # stetaが1(Init) -> 2(PreOperational) -> 4(SafeOperational) -> 8(Operatioanl)と遷移すればPDO通信まで確立 soes: state 1 soes: state 1 soes: state 1 soes: state 2 soes: 7000:01 @ 0 soes: 7000:02 @ 8 soes: 6000:01 @ 0 soes: state 4 soes: state 8 # Simple EtherCAT Explorerを終了するとInitに遷移する soes: APP_safeoutput soes: state 1
LAN9253,LAN9252両方に互換ある基板作った. LAN9252で使うためのメモ.
実装する部品
- R13
FXLOSENピンをLowにしておく,これで銅ツイストペアケーブルでの通信モードを選択
実装しない部品
- R8
- R9
- D2
LAN9253ではERRLEDに接続されるが,LAN9252ではFXSDENAに接続されている.R20によってプルダウンされているが,R9があるとプルアップもされてしまうため.
参考文献
LAN9252 SDK Firmware API Guide
STM32F303+LAN9252的EtherCAT实现IO、AD、DA
EtherCAT LAN9252 Library
Microchip謹製のLAN9252のライブラリ,PICなどで通信するサンプルが入っている模様.
STM32与LAN9252构建EtherCAT从站(一):项目简介
SOEM,SOESを使わず,きっちりとEtherCATやるならこの記事が参考になる.
なんとかしてETGに加入して各種情報やツールを手に入れたいところ.