「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



arduinoでTWI接続をする実験の続きです。

1バイト毎に区切って送信すれば上手く行くという
ことに気を良くしていたのですが、もう少し処理の
タイミングをシビアに行ってみようと思い、
送信側のスケッチを見直してみました。

送信側スケッチの処理中に、UARTでモニタ宛への
出力を行っていて、これが送信タイミングを少し
遅めていることに気付いたので、モニタ宛への表示
をコメントアウトしてみました。

すると、受信側がデータの取りこぼしをしてしまう
ことに!

受信側では、1回の受信ごとに時間稼ぎ(60μ秒
程度)のから回しをしているのですが、
この時間稼ぎのことを送信側にうまく伝えられて
いないようです。

60μ秒というのはそれほど大きな意味があるわけ
ではなく、スレーブ側の処理が忙しい時にデータが
たくさん送られてきた場合、「忙しくてデータが
受け取れませんよ」、ということを送信側も検知
できるようにしたいだけなのですが…

送信側CPUが無尽蔵にデータを垂れ流している
状態で受信側がデータの取りこぼしをするようだと、
通信処理にはかなりの制約が生じてしまうので
なんとか上手いタイミング制御が出来ないかを
画策しているのですが…

現状でも1ミリ秒に1回程度の受信なら何の問題
も無いのですが…
1ミリ秒ではNTSCの1フィールド表示の間
(約1/60秒)に16バイトしか送信できない
ことになります。

実際はさらに速い速度でも取りこぼしは起りませんが、
いずれにしても気に入らないのは送信側の送信処理で
時間稼ぎを都度行わないとならないという制約。

希望としては、マスター側からTWI本来の通信
プロトコルでデータを延々と送りつけて、それを
上手く入力してくれないと使い勝手が…

処理上、なにか上手い具合にタイミングを調整することが
出来ればよいのですが…

1バイト送るごとに、リターンコードを返してもらう
っていうのは上手く行くかのかな?

確かTWIではクロックもマスター側で生成していたと
思うんですが、スレーブ側からクロックストレッチを
おこなう(スレーブ側の処理時間の都合でクロックを
引き延ばす)ことができるのかどうか…

gccにしてもarduinoにしても、PICのCCS-Cに
しても、いずれの高級言語でもTWI(I2C)を
使うこと自体は簡単なのですが、やはりアセンブラで
TWIを込み入った事情まで考慮してコントロール
し尽くすのはなかなか難儀です。

そういえば、1回のSTART~STOPで複数バイトのデータを
送信するのもうまく行ってないしなぁ…。

SPIなら処理はもっと簡単に済むんだけど、通信速度が
TWIよりもさらに速いので、NTSC走査線1本で
1バイトの送受信となると、やはり送信側でフロー制御を
しないとならなくなるのでイマイチ。

いずれにしても、もう少しTWIの中身のお勉強を
しないと、太刀打ちできそうに無いなぁ…。



コメント ( 0 )




arduinoを2台使ってTWI通信の実験をしてみました。



右側はreduino-nano、左側は自作のシリアル版
arduinoです。

シリアル版の方はreduino-nanoのVccとGNDから電源
を取って動いてます。2台持っていれば、ブレッドボード
上でこんなことも簡単にできちゃいますね。

白い線と黄色い線がTWIの信号線です。
信号線のプルアップ用抵抗(4.7kΩ)は
ブレッドボード上に置かれてます。

reduino-nanoの方はarduino-IDEでスケッチを
作ってアップロードしたもの。

シリアル版arduinoの方にはAVR-studio上で作った
アセンブラプログラムを書き込んで使いました。
(AVR-ISPmkⅡでの書き込みが必要です)

arduinoのスケッチのお勉強というより、TWIを
アセンブラでアクセスするためのお勉強です。

この間描いた↓このスキームの確認が目的です。


マスター側をarduino-IDEで、スレーブ側を
アセンブラで組んでいます。

マスター側に何バイトかのデータを用意しておいて、
これを1バイトずつ区切って送信します。
(START→SLA+W→DATA→STOP をデータ数の分
 繰り返し送りつづけるという形に区切って送信)

スレーブ側は、自アドレス宛のデータを1バイト分
受信するたびに、それをシリアル送信で出力し
PCのシリアルソフト(tera termを使いました)で
受信して表示。

マスターから送ったものと比較して、抜けや化けが
無いことを確認してみました。

どうやら、上手い具合に動いています。(≧v≦)σ
ここまでは想定どおりにサクッと動きました。
よかった、よかった。


心配していたのは、スレーブ側の処理時間を長く
取った時に「クロックストレッチ」がきちんと
働くのかどうか。
もう少しきちんと確認してみないとなんとも
いえないのですが、幾つかのバリエーションで
実験してみた範囲ではクロックストレッチが
上手く働いているように見えます。


一方、1回の送信で複数バイトのデータを送ろうと
すると、なんとなく上手く行ってないような…

複数バイトというのは、START→SLA+W→DATA
DATA→DATA→…→DATA→STOPといった流れで
データを送る場合です。

何が原因で通信が止まっちゃうのかが目下不明。
こういうときにシリアルアナライザがあると
いいんだけどなぁ…

というわけで秋月さん、ぜひpic-kitシリアル
アナライザ、仕入れてくださーーーーい!

実験に使ったスケッチとアセンブラソースは、
近いうちにarduinoの別館サイトの方にアップして
おきます。



コメント ( 0 )