SPORT受信DMAバッファ上のデータの並びを探る予備実験を行いました。
非ワイドFMモードでは、SPORT各チャンネルにサンプルあたり2ワードのデータが転送されます。そのため、タイミングによってはこれらがABABと受信されたりBABAと受信されたりします。これは想定できることであり、当然ですがプログラムはそれに左右されないように作らなければなりません。
一方で、口伝えで「ADSP-BF533ではSPORTのプライマリ・チャンネルとセカンダリ・チャンネルのデータがバッファ上で反転する」という話を聞いたことがあります。実際、TRX-305のデータは、データの位置に依らずデータを見るだけでプライマリ・チャンネルのデータかセカンダリ・チャンネルのデータなのかを見分けることが出来ます。つまり、両チャンネルのデータがバッファ上で入れ替わるであろうと想定しているわけです。
そこで、SPORT受信開始時のデータを観測して、データの並びを調べてみました。結果として「プライマリ・チャンネルとセカンダリ・チャンネルが判定することはない」という結論に達しました。
DMA受信バッファの中のデータ
最初に、受信開始時のデータの並びを確認することにしました。
正しくはDMAを使ってバッファに取り込むべきですが、最初の実験ですのでDMAを使わず、ポーリングを行いました。SPORTは受信データをFIFOに入れるため、DMAを使わずとも転送開始時の数個のデータを安全に確保することが出来ます。
実験では、最初の4個のデータを取得しました。これは、プライマリとセカンダリの両チャンネルのデータが同じFIFOに出力されること、各チャンネルに2ワードで1サンプルになるためです。つまり、4個のデータを取ったと言うことは、1サンプルのデータがFIFO上にどう並ぶか調べたことになります。実験は4個取得する毎にSPORT受信をディセーブルし、FIFOを空にして行いました。こうして取得したデータを読みやすく加工してシリアル・ポートに出力しています。
結果は以下の通りです(画像クリックで大きくなります)。
見て分かるように、0,3,0,1と0,1,0,3の二種類のパターンがあります。受信データが3種類しか無いのが妙に見えますが、これはデータの下位2bitのみ取り出しているからです。
TRX-305はFPGAからデータを送るときに、下位2ビットに特別な意味を持たせます。
bit0はチャンネルの識別子です。このビットが0であるデータはプライマリ・データにおくべきです。また、このビットが1であるデータはセカンダリ・データに置くべきです。上の絵ではデータはP,S,P,Sの順番に並んでいます。ADSP-BF533のハードウェア・リファレンス・マニュアルによれば、両チャンネルを有効にした場合には必ずプライマリ・チャンネルから受信を開始することになっているため、上記のデータの並びは正しいものになります。
つぎに、プライマリ・チャンネルのbit1はRX-IFデータの種類を示します。このビットが0であるデータは非ワイドFMモードで有り、このビットが12であるデータはワイドFMモードです。上の図をみると、データは非ワイドFMモードであるとわかります。
最後に、セカンダリ・チャンネルのbit1ですが、これは非ワイドFMモード時のRX-IFデータのインデックスを現わします(インデックス)。すでに説明したように、非ワイドFMモードではチャンネルあたり2ワードのデータを受信しますが、受信時に2ワードの頭から受信できるか、途中から受信できるかは運頼みです。そこで、インデックスを参照することで、どちらのデータ化を識別します。bit1が0なら頭のデータ、bit1が1ならば2番目のデータです。
こうして改めて上の図のデータを見ると次の事がはっきりします。
- プライマリ・データとセカンダリ・データの位置が反転することは無い。
- 2ワードの頭から受信している場合と、途中から受信している場合がある。
以上の事は想定通りですので、予備実験としてはまずまずです。
プライマリとセカンダリは本当に反転していないか
上の結果を得て、さらに確信を強くするために試行回数を増やしました。
上記の図では高々10数回の結果だけを表示していますが、プログラムを書き換えて大量の試験を行い、1000回毎にプライマリとセカンダリのチャンネルの位置が反転していないかをレポートさせました。
そのプログラムを使って100万回を超える試行を行いましたが、反転した例はありませんでした。ですので、ここはリファレンス・マニュアル通りに正しく動作していると結論づけます。
まとめ
予備実験として受信SPORTのFIFOを覗いてみました。
FPGAからの信号は正しく受信されているようで、その並びも期待通りでした。