シリコンマイクの配線ができてから、実験のためのソフトウェアを作成して音声入力を試みていたのですが、まったく動かずに悩んでいました。まずは、回路ですが、こんな感じ⬇
マイク入力のデジタル化は、ADCに外部トリガ(ADTRG)をかけてサンプリングとAD変換を実行させます。W-SIMをつないだ時にはこれを8000Hzの周期でおこなうのですが、実験のためにADTRGはタイマ0の出力である TIOA0とつないであります。タイマを8000Hzの周期で走らせてTIOA0からパルスを出力することでW-SIMを使わずに試験できるようにしています。この出力はDACのトリガとしても使っており、DACの試験もおこなえるようにしています。
これで定期的にADCが走るので、その変換結果をDMAで拾おうとしたのですが、全然受信完了しません。調べると、そもそもADTRGがかかっていないようです。ADTRGはGPIOのPA8に割当てられているので、ポートの設定を確認したり、配線を確認したりしましたがトリガがかかりません。さんざん悩んで、もう一度マニュアル見直して、ようやくと原因に気づきました。
ADTRGはPA8を周辺機器のモードBに設定することで機能選択されますが、PA8にはシステム機能として32KHzクリスタルの接続用端子としての機能もあります。自分の書いたコードでは周辺機器Bを選択していたのですが。それ以前に CrossWorksが用意してくれているスタートアップコードがPA8をシステム機能用に初期化していたのでした。この場合、クリスタル用の設定の方が優先されてしまい、後から実施したADTRGとしての割当設定が無効となってしまうようです。自分の書いたコードを何度見直しても悪いところが見つからずに、ずいぶんと時間を無駄にしてしまいました。
ついでに気がついたのですが、DACやADCのトリガとしてはTIOA0出力を選択することができました。上の回路図のようにわざわざTIOA0端子をトリガ端子と接続せずとも内部的に接続してトリガとして利用することができるようになっています。SAM7の時には、このような機能は無く、SAM3で新たに追加された機能です。ADTRG端子を使わなくても済みますので、代わりに32KクリスタルをつないでRTCのクロックとすることができます。
マイク入力のデジタル化は、ADCに外部トリガ(ADTRG)をかけてサンプリングとAD変換を実行させます。W-SIMをつないだ時にはこれを8000Hzの周期でおこなうのですが、実験のためにADTRGはタイマ0の出力である TIOA0とつないであります。タイマを8000Hzの周期で走らせてTIOA0からパルスを出力することでW-SIMを使わずに試験できるようにしています。この出力はDACのトリガとしても使っており、DACの試験もおこなえるようにしています。
これで定期的にADCが走るので、その変換結果をDMAで拾おうとしたのですが、全然受信完了しません。調べると、そもそもADTRGがかかっていないようです。ADTRGはGPIOのPA8に割当てられているので、ポートの設定を確認したり、配線を確認したりしましたがトリガがかかりません。さんざん悩んで、もう一度マニュアル見直して、ようやくと原因に気づきました。
I/O Line | Periheral A | Periheral B | System Function |
---|---|---|---|
PA8 | CTS0 | ADTRG | XOUT32 |
ADTRGはPA8を周辺機器のモードBに設定することで機能選択されますが、PA8にはシステム機能として32KHzクリスタルの接続用端子としての機能もあります。自分の書いたコードでは周辺機器Bを選択していたのですが。それ以前に CrossWorksが用意してくれているスタートアップコードがPA8をシステム機能用に初期化していたのでした。この場合、クリスタル用の設定の方が優先されてしまい、後から実施したADTRGとしての割当設定が無効となってしまうようです。自分の書いたコードを何度見直しても悪いところが見つからずに、ずいぶんと時間を無駄にしてしまいました。
ついでに気がついたのですが、DACやADCのトリガとしてはTIOA0出力を選択することができました。上の回路図のようにわざわざTIOA0端子をトリガ端子と接続せずとも内部的に接続してトリガとして利用することができるようになっています。SAM7の時には、このような機能は無く、SAM3で新たに追加された機能です。ADTRG端子を使わなくても済みますので、代わりに32KクリスタルをつないでRTCのクロックとすることができます。