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の中身のお勉強を
しないと、太刀打ちできそうに無いなぁ…。
|