PSoC5LP Prototyping Kit (4) --- SPDIF_Tx と DMA (3)

PSoC5LP の DMA で使用する TD (Transaction Descriptor) には、

  • ソース・アドレスの下位 16 ビット
  • デスティネーション・アドレスの下位 16 ビット
  • 転送バイト数 (Transfer Count)
  • 各種フラグ・ビット (Property)
  • 次の TD 番号 (Next TD)

の情報が含まれています。
ソース/デスティネーション・アドレスは、チャネル・コンフィグ内の上位 16 ビットと TD 内の下位 16 ビットとを合わせて 32 ビット幅フルのアドレスとします。
「転送バイト数」のフィールドは 12 ビット幅で、最大値 4095 (4096 ではない) に限られています。
1 回の DMAで転送すべきメモリ領域がひとつで、TD ひとつで記述可能な場合でも、転送バイト数が 4096 バイト以上になる場合には、複数の TD を使う必要が生じます。
前回示したダブル・バッファの場合の図を再掲します。

「各種フラグ・ビット」の中で主なものを示すと、

  • ソース・アドレス・インクリメント
  • デスティネーション・アドレス・インクリメント
  • DMA 完了信号生成
  • DMA 中止入力イネーブル

などがあります。
「DMA 完了信号生成」については、ハードウェアの機能としては TD ごとに TERMOUT0 と TERMOUT1 という 2 系統ある割り込み信号のどちらを生成するかを選択できます。 それぞれ違う割り込みベクタが割り当てられているので、別々の割り込みハンドラが起動されます。
ただし、PSoC Creator では TERMOUT0 側の系統しかサポートされていないようです。
「DMA 中止入力イネーブル」は、DMA 転送を中止させるハードウェア入力を有効にするかどうかを指定します。 PSoC Creator の DMA コンポーネントのデフォルトでは無効になっています。
「次の TD 番号」のフィールドは 8 ビット幅で、128 個ある TD 番号のどれでも指定できます。
その値が 0xFE あるいは 0xFF の場合には、この TD が最後の TD で、次に読み込むべき TD はないことを示します。 両者の違いは、0xFE の場合には転送終了後に自動的に DMA が停止し、0xFF の場合には転送終了後も DMA はアクティブなままになります。
「Next TD」フィールドは次に読み込むべき TD の番号をひとつだけ示し、「分岐」するわけではないので、基本的には「TD チェイン」は直線の鎖状になります。
最後の TD の Next TD フィールドが 0xFE や 0xFF ではなく、TD チェイン上に存在するどこかの TD を指していると「循環リスト」となります。 チェイン上の TD をいくらたぐっていっても決して終端には達しないので、途中で強制的に止めない限りは、循環する TD のループを永久に回り続けることになります。
上の図では、ダブル・バッファに対応する 2 つの TD が循環リストとなっているので、いったん DMA を開始したなら、
TD[0] → TD[1] → TD[0] → TD[1] …
と、TD[0] と TD[1] とのパラメタを交互に使って DMA が継続することになります。
使用中でない方の TD については、パラメタをダイナミックに書き換えることが可能なので、ダブル・バッファのバッファ・アドレスやバッファ・サイズを「オン・ザ・フライ」で変更することも可能です。
循環リストを利用する場合には、チャネル・コンフィグの「TD 保存」フラグは「1」にしておく必要があります。 そうでないと、TD ループの 1 周目の実行で、各 TD の転送バイト数のパラメタが「0」に書き換えられてしまい、2 周目以降の実行で DMA 転送が行なわれなくなってしまいます。