昨日の記事で、「着信に応答しないとW-SIMが勝手に切断してしまう」問題について書きましたが、その対策法がわかりました。そもそも問題の認識が間違っていました。正確には、W-SIMが切断しているのではなく、網側から切断されていました。以下がそのログです。
DISCメッセージが切断要求があったことを示しており、切断原因(0x66 = 102)はタイマの満了を示しています。
以前から奇妙に感じていたのですが、W-SIMに対して別の電話機から発信すると、呼出音(RBT: Ring Back Tone)が聞こえないのです。W-SIM側で着信に応答すると、発信側ではダイアル後、呼出音がせずにいきなりつながってしまうのです。この動作について考えてみると、
と推測することができます。網側は着信を知らせるSETUPを打ってから、端末側の着信処理が進んで、適切な応答が返ってくるのを待っています。必要な応答が一定時間内に返ってこない場合には、網側から切断をおこなってきます。切断されるまでの時間がおよそ10秒だったので、NTTのISDN技術参考資料を調べてみるとT310タイマーが10秒に設定されており、ちょうど発生している現象に符合します。このタイマーの停止条件より、網側は、W-SIMからALERTING, CONNECTあるいはDISCが送られてくるのを待っていると考えられます。この仮定が正しければ、W-SIMにはALERTINGを送出するための手段として、なんらかの仕掛けが用意されているのに違いありません。そう考えてWikiのATコマンド一覧を見直してみると、
さっそく着信時処理に小さな修正を加えました。
発信については以前
RING
PROTOCOL=0
ID=
CAUSE=USER REQUEST
DISC
REASON:66
PROGIND:0
NO CARRIER
REASON:66
DISCメッセージが切断要求があったことを示しており、切断原因(0x66 = 102)はタイマの満了を示しています。
以前から奇妙に感じていたのですが、W-SIMに対して別の電話機から発信すると、呼出音(RBT: Ring Back Tone)が聞こえないのです。W-SIM側で着信に応答すると、発信側ではダイアル後、呼出音がせずにいきなりつながってしまうのです。この動作について考えてみると、
「おそらく着信が入ってもW-SIMが網に対してALERTINGメッセージを送出していないのだろう」
と推測することができます。網側は着信を知らせるSETUPを打ってから、端末側の着信処理が進んで、適切な応答が返ってくるのを待っています。必要な応答が一定時間内に返ってこない場合には、網側から切断をおこなってきます。切断されるまでの時間がおよそ10秒だったので、NTTのISDN技術参考資料を調べてみるとT310タイマーが10秒に設定されており、ちょうど発生している現象に符合します。このタイマーの停止条件より、網側は、W-SIMからALERTING, CONNECTあるいはDISCが送られてくるのを待っていると考えられます。この仮定が正しければ、W-SIMにはALERTINGを送出するための手段として、なんらかの仕掛けが用意されているのに違いありません。そう考えてWikiのATコマンド一覧を見直してみると、
AT@CALLEDというコマンドがあるのに気が付きました。説明が無いのですが、如何にも自分が呼び出しを検知したことを通知するかのようなネーミングではありませんか。
さっそく着信時処理に小さな修正を加えました。
RINGを検出した際に
AT@CALLEDを送出するようにしただけです。実際に試してみると ビンゴ!! です。発信側では、呼出音(RBT)が聞こえるようになり、切断されることもなくなりました。着呼時のメッセージの流れは次のようになっていると考えられます。

発信については以前
DTEモードでのCTS信号において「DTR信号をいじってみると良さそうだ」と書きましたが、どうやらBREAK信号の送出も有効なことがわかりました。ただし、どのくらいの期間BREAKを送出すれば良いのかがわかりません。不定なのかもしれません。現在は、ATコマンドの送出に先立ち、CTS信号が出るまでBREAKを送出し続けるようにしていますが、このように対処するようにしてから確実にATDでの発信ができるようになりました。
8KHzで使用してるのですね。
とりあえずデカくてもAT91SAM7Xで検討する事にします。
それにしてもAT91SAM7のUSBがFIFOなのは厳しいです。
MCK=18.432MHz動作時にFDRの192byte Readで500usも掛かってしまいます...
実際には12.288MHz動作が必須で、そうするとSAM-BAが使えなくて...
I2Sを使おうとするとクロック周りの設定が厳しいです orz
W-SIMのような電話用途では、モノラルの8KHzサンプリングにすぎません。そのため16bitで送っても1msあたりのデータ量は16バイトにすぎないのです。
以前別の記事でも書きましたが、AT91SAM7SでのUSBサポートはEPの数といい、サイズといい貧弱ですね。AT91SAM7Xであれば、EP4とEP5が追加されており、256バイトになっているようですから ゆうさんの要求にもマッチするでしょうが128ピンはデカいです。
当方、BestTechnology(http://www.besttechnology.co.jp)のAT91SAM7SのBTC091を、CompilerはYAGARTOを使ってます。
私もsirius506さんと同様にAT91SAM7S256をUSBスピーカーとして使うプログラムを書いているのですがI2Sを使って外部に出力する関係で48KHz/16bit/2chというフォーマットが必須でして、EP1でISO転送を使おうと思っているのです。
ですが、64Byte/1msという転送では速度が間に合わない…、sirius506さんはどのように問題を解決されました?
教えて頂ければ助かります。
DUALバンクを使って1ms毎にもっと大量のデータを受信できるのでしょうか…