「オープンソースハードウェアセミナーVol1」レポート Arduino Ether Shield W5100の初期化タイミングを遅らせる [ATmarquino Arduino]
chip1 Stopからいらした方、Arduino関連カテゴリをお試しください。http://hamayan.blog.so-net.ne.jp/archive/c2300498101-1
ハードウエアリセット回路を使用する事で起動の不安定さはそこそこ改善されましたが、まだ不満が残っていました。
ボードに直接改造を行わない範囲では、現状ハードウエア的にはこの位が限度ですので、今度はソフトウエアの起動シーケンスもいじってみます。
setup()の中でソケットの生成を行っていますが、この時初めてArduino側はW5100にアクセスする事を期待して、ソケットを生成する前に1秒間の遅延を入れてみます。
まあこれだけの話なのですけれどね、当社比では更に25パーセント程改善が見られました。
つまり起動失敗は多分20回に1回程度になったのではないかな。
電源の立ち上がり時はリセット周りの回路をちゃんと作っておかないと、どのICが先に起動するか判りません。
問題を起こすのはW5100よりもAVRが先に起動しちゃっている場合です。
W5100が正常に動いていないのにAVRがさっさと起動してW5100に対して初期化を行っても、W5100は起動していないのだから、正常に起動が完了する訳がありません。
W5100は100MのEthernetにも接続可能なので、内部に125MHzのクロックを生成するPLLの類が有る筈です。PLLが安定するには時間が掛かるのが普通ですので、PLLが安定した事を示すレジスタが存在するのかもしれません。
こう言った確認事項をちゃんと行っていれば、もう少し状況はよかったかもしれません。
※ソースコードを見ろ!と言う話か?。やれやれ。
ですが最大の問題は、Arduinoデュ、、、デュラムセモリナボード+Ether Shieldの組み合わせにはPower On
Reset回路が構成されていない点です。
いや、AVRの内部にはそれが有るのでAVRの起動は問題無いのですが、W5100は違います。だって、実質的にプルアップ抵抗が1個有るだけですから。いや本当です、冗談は言っていません。回路図公開されていますので調べてみて下さい。
マイコンと周辺ICとの間の起動シーケンスで悩まない方法があります。このEther Shieldもそれをすれば良かったのにと思うんですけれど。(と言うかそれしか方法は無い。)
ハードウエアリセット回路を使用する事で起動の不安定さはそこそこ改善されましたが、まだ不満が残っていました。
ボードに直接改造を行わない範囲では、現状ハードウエア的にはこの位が限度ですので、今度はソフトウエアの起動シーケンスもいじってみます。
setup()の中でソケットの生成を行っていますが、この時初めてArduino側はW5100にアクセスする事を期待して、ソケットを生成する前に1秒間の遅延を入れてみます。
void setup() { delay( 1000 ); Ethernet.begin(mac, ip); server.begin(); }
まあこれだけの話なのですけれどね、当社比では更に25パーセント程改善が見られました。
つまり起動失敗は多分20回に1回程度になったのではないかな。
電源の立ち上がり時はリセット周りの回路をちゃんと作っておかないと、どのICが先に起動するか判りません。
問題を起こすのはW5100よりもAVRが先に起動しちゃっている場合です。
W5100が正常に動いていないのにAVRがさっさと起動してW5100に対して初期化を行っても、W5100は起動していないのだから、正常に起動が完了する訳がありません。
W5100は100MのEthernetにも接続可能なので、内部に125MHzのクロックを生成するPLLの類が有る筈です。PLLが安定するには時間が掛かるのが普通ですので、PLLが安定した事を示すレジスタが存在するのかもしれません。
こう言った確認事項をちゃんと行っていれば、もう少し状況はよかったかもしれません。
※ソースコードを見ろ!と言う話か?。やれやれ。
ですが最大の問題は、Arduinoデュ、、、デュラムセモリナボード+Ether Shieldの組み合わせにはPower On
Reset回路が構成されていない点です。
いや、AVRの内部にはそれが有るのでAVRの起動は問題無いのですが、W5100は違います。だって、実質的にプルアップ抵抗が1個有るだけですから。いや本当です、冗談は言っていません。回路図公開されていますので調べてみて下さい。
マイコンと周辺ICとの間の起動シーケンスで悩まない方法があります。このEther Shieldもそれをすれば良かったのにと思うんですけれど。(と言うかそれしか方法は無い。)
Making Things Talk -Arduinoで作る「会話」するモノたち
- 作者: Tom Igoe
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/11/17
- メディア: 大型本
アーデュイーノ互換マイコン・ボードを作る (プリント基板付き電子工作解説書シリーズ)
- 作者: 小坂 貴美男
- 出版社/メーカー: CQ出版
- 発売日: 2009/04
- メディア: 単行本
2009-05-18 22:47
nice!(0)
コメント(22)
トラックバック(0)
HC11の頃から、MOTOROLAマイコンのRESET出力は双方向でした。外部からリセットイベントを受け付けることも出来ますが、リセットを受け付けると同時にMCU内部のプルダウン素子が動作して、RESETピンに接続されているペリフェラルを十分な時間リセットすることができます。
これと同じような事がAVRでも用意されていないでしょうか。リセット・リリースのタイミングが自明であれば、ソフトウェアで初期化を行うタイミングを制御できますよね。
あるいは、W5100をリセットする出力端子をAVRに持たせるべきなのだろうか。もったいない。
by noritan (2009-05-18 23:13)
リセット周りのブロック図を見る限り、ATmega168のPower On Resetを外部に引き出す要素は無さそうです。もしかして見えないところでその機能があっ、、、無いなぁ、多分。
> W5100をリセットする出力端子をAVRに持たせるべき
勿体無いけれどそれが一番有効な手段だと思います。
色々な理由でNICは固まる事を想定する必要があります。あの枯れていると言われるRTL8019ASでさえ時には固ま、、、。
HCS08なんかと同じ様に、AVRのRESET入力はポートと兼用ですので、あるいはここをポートに切り替えて、、、ってやってしまうと、それ以降ArduinoのIDEからのプログラム更新が出来なくなってしまうのでやらないのですが。
by hamayan (2009-05-18 23:36)
回路図を見ました。
http://arduino.cc/en/uploads/Main/arduino-duemilanove-schematic.pdf
http://arduino.cc/en/uploads/Main/arduino-ethernet-shield-schematic.pdf
W5100の *RESET 入力(59ピン)は、ATMEGA8のRESET端子とつながっていて、ATMEGA8をリセットするのは、
http://www.switch-science.com/trac/wiki/ArduinoDuemilanove
> DTR信号を有効にすると(LOWレベルにすると)、一定時間の間
> リセット信号線がLOWレベルに維持され、これによってATmega168が
> リセットされます。
ということで、FT232RLがリセットをかける設計になっているようです。
Wiznet ( http://www.wiznet.co.kr/ )のW5100のデータシートによると、*RESETに必要な最小パルス幅は2usecだそうです。DTRの幅が短いとリセットに失敗する可能性があります。ここは、FT232RLが保証してくれるのか、それともデバイスドライバが保証してくれるのか。
内部信号PLOCK(たぶん、PLL-Lock)がアサートされるのは、RESETがネゲートされてから10msec後です。それまでにMCUがSPI通信を仕掛けたらどうなるか、データシートからは見つけられませんでした。
で、FT232RLがリセットをしない場合にどうなるかというと、ATMEGA8のRESET端子が双方向じゃないのだとしたら、W5100にリセットをかける人はどこにもいません。そこで、"ether shield"上の3.3V電源にパワーオンリセットを取り付けて、POWERコネクタのRESET端子にリセットを供給することを提案します。
ちなみに、12.3KΩの抵抗でプルダウンされているRSET_BG(1ピン)は、リセット入力ではありません。"PHY Off-chip resistor"と書いてあって、無条件に12.3kohm1%の抵抗でプルダウンしろと書いてあります。
by noritan (2009-05-19 09:31)
> DTR信号を有効にすると、、、リセットされます。
そうなんです。この仕組みを使ってArduino IDEと言う奴はAVRのブートローダーを起動する事になっています。
> FT232RLがリセットをしない場合にどうなるか
そこですよね。USBに接続されたままなら、別にこのArduinoで微妙なWEBサービスをしなくとも、パソコンでやればよっぽど高機能を簡単にできるじゃん!って事になるので、Arduino単体で使わないなら意味無いです。
> POWERコネクタのRESET端子にリセットを供給することを提案します。
うん、うん、真っ当な設計ならばそうなると思います。
> 無条件に12.3kohm1%の抵抗
これは多分PHYの受信パルスのコンパレートに使う抵抗だと思います。
他のPHYにも同様の精度の抵抗を必要とするものが有ります。
> 10msec後
JUN猫さんが書いていたあれか。
by hamayan (2009-05-19 09:53)
DTRリセットはワンショットになっているので、遅延時間は延ばせそうにないですね。
ソフトで回避するとなると
1)CPU起動後10msウェイト(PLOCK時間)
2)Gateway IP Address Registerに書込み
3)書込みの値が正しければOK
4)違う場合は、ソフトウェアリセットをかけて1へ
みたいな処理が必要となりそうですが、W500内のコントローラがうまく起動してない場合は意味がないかな。
SPIで、クロックがずれてリカバリがきかないっていうのがありますがSS信号でうまく回避できるのでしょうか?
海外の製品でリセットがCRで起動が不安定だっって言ったら「おまえはなにを言ってるんだ。そのためにリセットSWがついているじゃないか」って返事が来ました。
by おる (2009-05-19 10:59)
> SPIで、クロックがずれてリカバリがきかない
I2Cの方ですね、これが発生するの。I2C通信中にCPU側が再起動した場合も同様にI2Cをロックしてしまいます。
なので私はI2C初期化時には100個位クロックをばたつかせています。
SPIはSSのアサートで戻る事になっている、、、筈。
> 海外の製品でリセットがCRで起動が不安定だっって言ったら「おまえ
> はなにを言ってるんだ。そのためにリセットSWがついているじゃない
> か」って返事が来ました。
(笑)、もうなにも言えません。
by hamayan (2009-05-19 11:12)
SPIでクロックがずれて、「ソフトウェア・リセット」がかかったら、リカバリできません。W5100のデータシートには、"32-bit stream"とだけ書いてありますが、ビット数が違った場合の動作についての記述は見つけられませんでした。
MISO信号の処理も疑問です。この信号にはプルアップも何も付いていません。
もし、W5100が、PLOCKがアサートされるまでSPIにまともに返答しない仕様だったとすると、リセット直後のSPI通信では「わけのわからない」結果が受信されると期待されます。その「わけのわからない」結果が、たまたま「正常に動作している」結果と一致してしまったら、ATMEGA8は、正しく通信できたと判定するはずです。そのためには、W5100が働いていない時のMISO信号の論理を確定させるためのプルアップまたはプルダウンが必要になるはずです。
もっとも、受信データの判定さえ行っていないのであれば、これも対策にはなりません。
by noritan (2009-05-19 11:44)
"W3150A+ / W5100 Application Note for SPI"にはっきりと書いてあります。
> You should implement reset circuit or assert from MCU GPIO
> pin. Because the W5100 does not support Power-on-Reset,
> this pin should assert low for at least 2us when power is
> applied to the W5100.
パワーオンリセットなんか入ってないから、電源投入時には、RESETをしっかりと落とせ。と、
こんな記述もありました。
> the MISO output is continuously driven in the W5100
> whether the /SCS is asserted as high or as low.
SEN入力がプルアップされていたら、MISO出力はSCS入力に関わらず常時ドライブになるそうです。通常のSPI規格と違いますね。
この文書にもクロックオーバーラン・アンダーランの記述が無いな。SCSにプルアップが無いので、リセット直後はどうなっちゃうんだろう。
by noritan (2009-05-19 12:09)
ふぐぁ!
このボードが他のSPIデバイスと併用できないと言われていた理由がこれか!。このボード、回路図上はSENはHIGHかLOWを選択できるのだけれど、なんか意味有るのか?。
これ世界中で売っているんでしょう。よく世界中からクレームが付かないなぁ。
USBで接続して、なんか有ったらリセットボタンをポチッとしろって事なのかなぁ?。
味噌(MISO)はAVRの機能でプルアップを掛けようと思えばできますね。
やっているかどうかまでは確認していないけれど。
by hamayan (2009-05-19 12:31)
回路図を見ると、SEN端子には"PROG"と名前の付いたジャンパが装備されています。W5100のオンライン設定でもするのかと思っていたら、「ATMEGA8にプログラムをするために、ISPがつながるSPI端子を開放する機能。」という意味だったようです。
ようやく、理解できました。
by noritan (2009-05-19 12:35)
> SCSにプルアップが無いので、リセット直後はどうなっちゃうんだろう。
そうそう、それも無いんだよね。SPIを使うとすればスレーブセレクト端子を不定にできない事は、普通みんな知っている事だよね。
少なくとも製品として売るならばそれくらい。
by hamayan (2009-05-19 12:37)
> 「ATMEGA8にプログラムをするために、ISPがつながるSPI端子
> を開放する機能。」という意味だったようです。
(笑)、いやいや、普通に上に乗っかっているボードを外した方が良いから。
オンチップデバックと言う訳でもないんだし。
by hamayan (2009-05-19 12:43)
わかった!!
上に「パワーオン・リセット・シールド」を重ねるんだ。
これぞ、Arduino的回答でしょう。
by noritan (2009-05-19 15:56)
了解です!。
その為に上に載せられるようになっていたんですね。
by hamayan (2009-05-19 16:07)
その上には、「SS端子プルアップ・シールド」も載せましょう。
他に必要なシールドはないかな?
by noritan (2009-05-19 16:32)
MRレジスタでW5100をソフトウェアリセットできるので、
それをやったら、さらに起動確率が上がるかも。
自分は、念のため10ms後にソフトウェアリセットかけてから
初期化してます。
ソフトウェアリセットしなかったら、同じ現象が出るのかなぁ。
試してみよっかなぁ。
by JUN猫 (2009-05-19 19:21)
ソースコードにはMRレジスタでのリセットを行っている関数があります。
多分呼んでいると思うけれど、必ずそこを通るか確認はしていません。
ソフトウエアリセットも、正常に動いていない時はそれすらも受け付けられないので、やはりハードウエアリセットを省けるものではないのですけれどね。
by hamayan (2009-05-19 20:39)
ATmegaのRESETピンをポートとして使うにはFuseで設定しないといけないんですね。これだと、汎用性がなくなるので厳しいですね。
確実なのは空きピンをリセットにつないで、Open-DrainでLow出力でしょうか。
Atmegaのリセット最小時間が2.5usとなっているのでW5100のリセット時間は確保できそうな感じです。
FPGAでConfigROMを書き換えて自分でリプログラムするのにやったことがありますが、CPUによっては思い通りにならないことも。
確実なのはCR+Trで遅延させるかリセットICのマニュアルリセット入力ですね。
by おる (2009-05-20 13:14)
そうだ、ATMEGA8の出力ポートXをRESETにジャンパワイヤでつなげばいいんだ。
1. ATMEGA8パワーオンリセット
2. プログラム実行開始。
3. 出力ポートXからLをドライブ。
4. リセットがかかる。
5. 出力ポートXが初期状態になる。
6. #2に戻る
HCS08の System Reset Status (SRS) レジスタみたいに、リセット要因が判別できるようなフラグがあればいいんだけどな。
by noritan (2009-05-20 14:46)
一瞬、無限リセットマシーンかと思いましたよ。
by hamayan (2009-05-20 15:12)
>1. ATMEGA8パワーオンリセット
>2. プログラム実行開始。
>3. 出力ポートXからLをドライブ。
>4. リセットがかかる。
>5. 出力ポートXが初期状態になる。
>6. #2に戻る
2と3の間に、W5100のレジスタ読み書きして、失敗したら3ですね。
回路図までオープンされてるから、みんなで考えてうまくやれってことなんでしょうかね。
>HCS08の System Reset Status (SRS) レジスタみたいに、リセット要因が判別できるようなフラグがあればいいんだけどな。
MCUSR – MCU Status Register
Bit 3 – WDRF: Watchdog System Reset Flag
Bit 2 – BORF: Brown-out Reset Flag
Bit 1 – EXTRF: External Reset Flag
Bit 0 – PORF: Power-on Reset Flag
Bit.1で外部リセットは判定できるみたいなんで、なんとかなりますね。
ただ、リセットSWが押された場合は・・大丈夫か。
by おる (2009-05-20 17:32)
もらいら、こんな俺の為に色々力になってくれて、ありがとんな!。
って、電車男か。
by hamayan (2009-05-20 22:02)