スポンサーサイト

.-- -- スポンサー広告 comment(-) trackback(-)
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ACK来た!?

.20 2010 AVR-USB comment(0) trackback(0)
昨日あたりから風邪が治ってきたのでAVR-USB、再開です。
AVR-USBの現状:
USBコネクタを繋いだとき、LEDに表示されるステータスはこんな感じ:
  1. SETUP受信-ACK受信
  2. SETUP受信-しばらくしてACK受信
  3. SETUP受信-しばらくして良く分からない点灯パターン
  4. SETUPすら受信していない状態でDown
他にも発振子がたまに正常に起動しないこともありますがだいたいこんな感じ。
想定どおりに動いていれば必ず1のパターンになるはずなのですが、実際に1のパターンで動くのは5回に1回くらい。
まずは4のパターンに落ちる原因を考えます。

---------- 思考中 -----------

SYNC終了パターンの認識を少し変えただけでかなりの確率で1のパターンで受信できるようになりました!
(50回連続で抜き差しして1回だけ2のパターンになったがそれでもちゃんとACKは返ってきている。)

変更点メモ:
find_doubleK:
	sbic	USB_PIN, 0
	rjmp	find_doubleK
	sbic	USB_PIN, 0
	rjmp	find_doubleK
	sbic	USB_PIN, 0
	rjmp	find_doubleK
	sbic	USB_PIN, 0
	rjmp	find_doubleK
	sbic	USB_PIN, 0		;{8-11}clk after falling edge of D-
	rjmp	find_doubleK
	; 次の2行を追加
	sbic	USB_PIN, 0		;{10-13}clk after falling edge of D-
	rjmp	find_doubleK
	; 以下、受信ループへの入り口
単純に到達時刻の計算を間違えていました。修正前は10行目に到達する時刻を間違えて{10-13}と見積もっていました。
実際にはK状態に入って8CLK(1bit time)でここに到達する可能性もあるのでidle-K-J-K-J-K-J-K-Kの最後のKKの前にこの部分を通過してしまって予期せぬ動作をしていたわけです。

たったこれだけのために風邪引いたとは悔しい限り。

# 現状整理だけして記事を終わりにしようと思っていたら結局うまく動くところまで行ってしまいました。めでたしめでたし。
# 現状整理は大切ですね。

追記:10行目の到達時刻が8になりうる理由の考察
K状態が8clk分なら、2行目にK状態になっていたとすると10行目に到達するときはすでにJ状態に変わっているはず…と思っていたのですが、 USBのD+, D-は3.3V, AVR側は5VなのでD-がduty比50%で変化しているとしても、AVRにはLとして認識される時間の方が長くなります。
したがって2行目に入る直前にK状態になったとすると、10行目直後にJ状態に遷移することになり、8clk分のK状態でも上の部分を通過することができたと考えられます。
関連記事

  • comment
  • secret
  • 管理者にだけ表示を許可する

trackbackURL:http://yuranos.blog11.fc2.com/tb.php/51-7fbc31b7
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。