相手側に伝わるマイク音にノイズが載ってしまう問題について調べたところ、W-SIMとUSBとのクロック速度の違いに起因するものであることがわかりました。
W-SIMとUSBは独立したインタフェースであり、それぞれのクロックは独立しており、同期していません。そのため、W-SIMとUSBへの送受に際してはバッファを設けています。また、両者の間ではu-Lawと線形PCMと音声フォーマットも違うので、下図に示したように、バッファ間でのデータ転送をおこなう際にフォーマットの変換を行う仕組みにしています。
W-SIMとの音声データ送受は8000Hzの周期で発生しますが、8000Hzで割り込み処理をしているとシンドイので、AT91SAM7SのDMA機能を使って64オクテット(8ms相当)で割り込みを発生させることにしています。一方、USB電話機とのデータ送受はIsochronous転送であるため、1ms毎に発生し、一度に8オクテット分のuLawデータに相当する16バイト分のデータを送受する必要があります。
W-SIMとUSBのクロックで同期がとれていれば、両者のバッファ間での転送処理はスムーズに進みます。しかし、実際のクロック速度に違いがあれば、一方の処理が他方よりも早く進む結果、バッファーのオーバフローやアンダーフローが発生することになります。
W-SIMの出す8000Hz周期はTDMAであるPHS網のクロックに基づくものでしょうから、かなり正確であると考えられます。一方、USBホストであるMAX3421Eが使用しているクロック(12MHz)は、AT91SAM7S256がPLLによって作成した96MHzを分周して作成しています。もとの水晶が18.432MHzであるため、PLLでも正確に96.0MHzは生成できず、実際には95.846MHz程度になっています。このようにMAX3421Eの使用しているクロックは遅くなってしまっているので、MAX3421Eの生成するUSBの1ms FRAME周期は、実際にはちょっと長めになってしまいます。結果として、USB側のバッファ処理はW-SIM側よりもゆっくり進むので、W-SIM側での受信処理ではバッファーオバーフローが、送信処理ではアンダーフローが発生することになります。
W-SIMのバッファー処理においては、オーバフロー時にはデータは読み捨てられ、その分の音声は実際にはUSB側には送信されないのですが、ほとんど気になりません。一方、アンダーフロー時にはW-SIMに送るデータが無くなるとAT91SAM7のSSC送信部を止めるようになっていました。送信部動作を止めるのは、送信可能割り込みの生成を抑止するためだったのですが、この際にノイズ音が発生していました。
対策として送信バッファーが空になっている場合には、W-SIMに対しては直前の64ms分と同じ音声データを送信してやることにしました。その結果、ノイズは気にならなくなりました。