AN52705 PSoC® 3 および PSoC 5LP - DMA 入門 著者: Anu M D、Lakshmi Natarajan 関連プロジェクト: あり 関連製品ファミリ: すべての PSoC ® 3 および PSoC 5LP 製品 ソフトウェア バージョン: PSoC® Creator ™ 3.0 SP1 以降 関連アプリケーション ノート: AN61102、AN84810 概要 AN52705 は PSoC® 3 と PSoC 5LP のダイレクト メモリ アクセス (DMA) の概要を説明します。PSoC DMA は CPU 介入なし で、オンチップ ペリフェラルとメモリ間でデータを転送することができます。アプリケーション ノートでは、サンプルプロジェクトを使 用して、ペリフェラルとメモリ間、メモリとペリフェラル間、ペリフェラル間、メモリ間での簡単なデータ転送のために DMA をコンフィ ギュレーションする方法を示します。 目次 はじめに .............................................................................1 著者について ................................................................... 18 DMA の基本的な概念 .........................................................2 付録 A: DMA コンフィギュレーション手順 ........................... 19 DMA コンフィギュレーション .................................................4 その他の重要な DMA API 関数 ................................... 21 チャネル コンフィギュレーション .......................................4 付録 B: DMA ウィザードによるコンフィギュレーション .......... 21 TD コンフィギュレーション ...............................................4 付録 C: DMA チャネルの優先順位の設定 ......................... 23 DMA コンポーネントの概要 .................................................6 付録 D: サンプル プロジェクト – テスト セットアップ ............. 24 DMA コンポーネントのハードウェア接続..........................6 例 1: ペリフェラル間の転送 – Eg1_ADC_DMA_DAC ... 24 DMA のファームウェア コンフィギュレーション .......................7 例 2: ペリフェラルからメモリへの転送 – Eg2_ADC_DMA_Mem ............................................... 24 例 3: メモリからペリフェラルへの転送 – Eg3_Mem_DMA_DAC ............................................... 25 例 4: メモリ間の転送 – Eg4_Mem_DMA_Mem ............ 25 例 1: ペリフェラル間の転送 .................................................8 例 1 の DMA コンフィギュレーション ................................9 例 1 のプロジェクト ファイル ............................................9 例 1 の DMA のコンフィギュレーション コード ................. 10 例 2: ペリフェラルからメモリへの転送 ................................ 11 例 2 の DMA のコンフィギュレーション ........................... 12 例 5: TD チェーン化 – Eg5_TD_Chaining .................... 26 付録 E: よくある質問 ......................................................... 27 例 2 のプロジェクト ファイル .......................................... 12 例 3: メモリからペリフェラルへの転送 ................................ 13 例 3 の DMA コンフィギュレーション .............................. 14 例 3 のプロジェクト ファイル .......................................... 14 例 4: メモリ間の転送 ......................................................... 15 例 4 の DMA コンフィギュレーション .............................. 16 例 4 のプロジェクト ファイル .......................................... 16 例 5: TD チェーン化 .......................................................... 17 例 5 の DMA コンフィギュレーション .............................. 18 例 5 のプロジェクト ファイル .......................................... 18 まとめ ............................................................................... 18 www.cypress.com はじめに PSoC 3 と PSoC 5LP の DMA コントローラー (DMAC) は CPU 介入なしで転送元から転送先にデータを転送することが できます。これにより、DMA がデータ転送を行っている間、 CPU が他のタスクを処理することが可能になります。よって、 「マルチプロセッシング」の環境を実現できます。 PSoC の DMA コントローラー (DMAC) は非常に柔軟です。 ADC、DAC、フィルター、USB、UART、および SPI などのオン チップ ペリフェラルとメモリ間でデータをシームレスに転送する ことができます。24 の独立した DMA チャネルがあります。 文書番号: 001-75652 Rev. *A 1 PSoC® 3 および PSoC 5LP - DMA 入門 本アプリケーション ノートでは、単純なデータ転送のために DMA をコンフィギュレーションする方法について説明します。 以下のように異なるタイプの DMA 転送を示すプロジェクトを含 みます。 本アプリケーション ノートは、ユーザーが PSoC 3 または PSoC 5LP の PSoC Creator を使ったアプリケーションの開発 に 精 通 し て い る こ と を 前 提 とし て い ま す 。 PSoC 3 ま た は PSoC 5LP の初心者である場合、「AN54181 - PSoC 3 入門」 および「AN77759 - PSoC 5 入門」を参照してください。DMA の高度なトピックは「AN84810」に記載されています。PSoC Creator の初心者である場合、「PSoC Creator のホームペー ジ」を参照してください。 ペリフェラルからメモリへ メモリからペリフェラルへ ペリフェラル間 メモリ間 DMA の基本的な概念 PSoC 3 および PSoC 5LP の DMAC は図 1 に示すように、オンチップ ペリフェラル間の接続をするペリフェラル HUB (PHUB) と呼ば れる中央ハブの一部です。DMAC は 2 つの PHUB バス マスターの 1 つです。 図 1. ペリフェラル ハブ (PHUB) USB Spoke 4 System resources 32 bit 32 bit Spoke Arbitration www.cypress.com 16 bit IO Interface ADCs External memory interface (EMIF) DACs 32 bit Digital filter block (DFB) Spoke 7 16 bit Spoke 3 Spoke 1 DMAC 16 bit 16 bit PHUB Spoke 5 CPU Spoke 0 SRAM Univarsal Digital Blocks (UDB) Spoke 6 EEPROM Spoke 2 CAN Fixed Function I2C Fixed Function Timers 16 bit Univarsal Digital Blocks (UDB) Other Analog Peripherals 文書番号: 001-75652 Rev. *A 2 PSoC® 3 および PSoC 5LP - DMA 入門 PHUB はスポークと呼ばれる 8 つのデータ バスを持っていま す。各スポークは、CPU と DMAC を 1 つまたは複数のペリフ ェラルに接続します。スポークの幅は、16 ビットまたは 32 ビッ トのどちらかです。スポークに接続するペリフェラルの幅は、8 ビット、16 ビット、または 32 ビットです。 通常、ペリフェラルのデータ幅は、ペリフェラルが接続している スポークのデータ幅と等しい、またはそれ以下です。ペリフェラ ルのデータ幅が接続するスポークのデータ幅よりも大きい場 合、PHUB はスポークの幅でペリフェラルとのトランザクション を行うことができます。 PHUB には CPU と DMAC という 2 つのバス マスターがあり ます。CPU と DMAC は、同時に異なる PHUB スポークにアク セスすることができます。CPU と DMAC が同時に同じスポー クにアクセスしようとすると、バス アービトレーションが発生し ます。詳細については、「PSoC 3、PSoC 5LP テクニカル リフ ァレンス マニュアル」を参照してください。 24 の DMA チャネルのそれぞれは、独立してデータを転送す ることができます。各チャネルは、図 2 に示すように、トランザ クション ディスクリプタ (TD) のチェーンを持っています。TD に は、ソース アドレス、宛先アドレス、転送回数、およびチェーン 内の次の TD などの情報が含まれています。TD は最大 128 個あります。チャネルと TD の組み合わせにより、完全な DMA 転送が定義されます。 図 2 DMA チャネル DMA Channel Source DMA Request Signal Read Write DRQ NRQ Destination DMA done signal typically tied to interrupt TD Pointer TD0 Source Destination TD1 Transfer Count Next TD それぞれの DMA チャネルは、トランザクションを開始する個 別の DMA 要求入力を有しています。DMA 要求は、CPU また はペリフェラルのいずれかにより起動されます。DMA 要求が www.cypress.com Source Destination Transfer Count Next TD 受信されると、DMAC は、転送元と転送先に接続するスポー クにアクセスし、チャネルと関連 TD で構成された通りにデータ を移動します。 文書番号: 001-75652 Rev. *A 3 PSoC® 3 および PSoC 5LP - DMA 入門 DMA コンフィギュレーション DMA データ転送を完了するために複数のバースト転送 が必要な場合、このビットはバーストの特性を決定します。 DMA 転送は、チャネルと TD コンフィギュレーション レジスタを 使用しコンフィギュレーションされます。図 3 は、チャネルおよ び TD コンフィギュレーション パラメーターを示しています。 0: 最初のバーストに後続するすべてのバーストは個別の DMA 要求なしで自動的に転送される。最初のバースト転 送だけは、DMA 要求が必要。 図 3. DMA コンフィギュレーション Channel Configuration TD Configuration Source Address (Upper 16 bits) Source Address (Lower 16 bits) Destination Address (Upper 16 bits) Destination Address (Lower 16 bits) Burst Count (1-127) Transfer Count ( 0 to 4095) Request per Burst (TRUE or FALSE) TD Property First TD of Channel Next TD バーストごとの要求 (0 または 1) 1: すべてのバースト転送は、個別の DMA 要求が必要。 最初の TD チャネルと関連付けられている最初の TD を定義します。 最初の TD へのポインタは、チャネル コンフィギュレーショ ン メモリに格納されます。後続の TD ポインタが連結リス トと同じように TD コンフィギュレーション メモリに格納され ます。 TD の保存 (0 または 1) 次回の DMA 転送に再利用するために元の TD コンフィ ギュレーションを保存するかどうかを定義します。通常、 TD コンフィギュレーションが保持されます。 0: TD コンフィギュレーションを保持しない。 1: TD コンフィギュレーションを保持する。 TD が保存された場合、チャネルは (チャネル番号に対応 する) 個別の TD メモリを使用して進行中のトランザクショ ンを追跡します。別の方法として、元の TD コンフィギュレ ーション レジスタが、進行中のトランザクションを追跡する ためにアクティブなレジスタとして使用されます。 Preserve TD (TRUE or FALSE) チャネル コンフィギュレーション DMA チャネル コンフィギュレーション パラメーターを以下に説 明します。 上位のソース アドレス (16 ビット) TD コンフィギュレーション パラメーターを以下に説明します。 32 ビットのソース アドレスの上位 16 ビットは、チャネル コンフィギュレーション レジスタでコンフィギュレーションさ れます。 バースト カウント (1~127) 下位の宛先アドレス (16 ビット) 32 ビットの宛先アドレスの下位 16 ビットです。 転送カウント (0~4095 バイト) 転送元から転送先に転送する総バイト数です。 スポークを開放する前に、DMA チャネルがソースから転 送先に送信しなければならないバイト数を定義します。 DMAC は、スポークを取得し、ソースから転送先へ指定さ れたバイト数を転送した後、スポークを開放します。次の バースト転送のためには、スポークを再び取得します。 内部スポークの DMA 転送のバースト カウントを 16 以下 に制限します。 下位のソース アドレス (16 ビット) 32 ビットのソース アドレスの上位 16 ビットは、TD コンフィ ギュレーション レジスタでコンフィギュレーションされてい ます。 上位の宛先アドレス (16 ビット) 32 ビットの宛先アドレスの上位 16 ビットは、このチャネル コンフィギュレーション レジスタでコンフィギュレーションさ れています。 TD コンフィギュレーション 転送カウントは、バースト カウント パラメーターと共に使 用されます。例えば、16 ビットペリフェラルからメモリ バッ ファに 2 バイトのデータ ワードを 50 個移動する場合、バ ースト カウントは 2 に設定され、転送カウントは 100 に設 定されます。 次の TD 連結リストと同様な次の TD です。 www.cypress.com 文書番号: 001-75652 Rev. *A 4 PSoC® 3 および PSoC 5LP - DMA 入門 TD のプロパティ 表 1 は、TD プロパティ コンフィギュレーション レジスタのビット フィールドで定義された TD プロパティを示します。 表 1. TD のプロパティ プロパティ 説明 (ソース アドレスのインクリメント) このビットが設定された場合、ソース アドレスは、DMA トランザクションが進行するにつれてインクリ メントされる Increment Destination Address (宛先アドレスのインクリメント) このビットが設定された場合、宛先アドレスは、DMA トランザクションが進行するにつれてインクリメ ントされる Swap Enable 設定された場合、DMA は転送元から転送先にデータを転送する間、データ バイトをスワップする Increment Source Address (スワップ イネーブル) Swap Size (スワップ サイズ) スワップ イネーブルが設定された場合、実行されるスワップのサイズを定義する 0: DMA 転送中に 2 バイトごとにエンディアン変換される 1: DMA 転送中に 4 バイトごとにエンディアン変換される Auto Execute Next TD 0: チェーン内の次の TD は、次の DMA 要求が発行された後にのみ実行される (次の TD の自動実行) 1: チェーン内の次の TD は、現在の TD 転送が完了すると自動的に実行される DMA Completion Event (DMA 完了イベント) 設定された場合、データ転送が完了した後に DMA「完了信号」を生成する。これは通常、転送が完 了した後に割り込みを生成するために使用される Enable TD termination 設定された場合、ハードウェアの信号を使用して進行中のトランザクションを中止することができる (TD 中止のイネーブル) PSoC 3 Keil コンパイラは、16 ビットおよび 32 ビットの変数を格納するためにビッグ エンディアン形式を使用しています。しかし PSoC 3 ペリフェラルのレジスタはリトル エンディアン形式を使用しています。このため、DMA は、PSoC 3 内のペリフェラル レジスタと メモリ間でマルチバイトのデータを転送する時にバイトをスワップするように設定される必要があります。PSoC 5LP の場合、ペリフェラ ルとメモリの両方が同じエンディアン形式を使用しているため、バイトスワップの設定は不要です。 PSoC Creator を使用して DMA をコンフィギュレーションする方法を見てみましょう。 www.cypress.com 文書番号: 001-75652 Rev. *A 5 PSoC® 3 および PSoC 5LP - DMA 入門 DMA コンポーネントのハードウェア接続 DMA コンポーネントの概要 図 4 は、PSoC Creator 内の DMA チャネルのコンポーネント を示しています。このコンポーネントは、Component Catalog 内の「Systems」タブの下にあります。 図 5 に示すように、コンポーネントのコンフィギュレーション ウ ィンドウで、次のパラメーターを設定することができます。 図 5. DMA コンポーネント コンフィギュレーション 図 4. DMA チャネル コンポーネント Optional Terminals DMA チャネル コンポーネントと関連する API は、データ転送 を目的として DMA をコンフィギュレーションするために使用さ れます。 Hardware Request (ハードウェア リクエスト) (drq) : この設 定は、DMA チャネルをトリガーするために使用される信号の 種類 (立ち上がりエッジ/レベル) を定義します。「Disabled」 を除き、このパラメーターを選択すると、drq 端子がコンポーネ ントに加えられます。drq は、DMA チャネルをトリガーするため に、任意のハードウェア信号に接続することができます。 drq 端子がない場合、DMA トランザクションをトリガーできるの は CPU のみとなります。 このパラメーターは、「derived」に設定された場合、DMA トリ ガーの種類 (エッジ/レベル) は、DMA のトリガー ソースから 判定されます。詳細情報については、「DMA コンポーネント デ ータシート」を参照してください。 Hardware Termination (ハードウェア ターミネー ション ) (trq): このオプションを「true」に設定した場合、コンポーネント ではもう 1 つの入力端子 (trq) が表示されます。TD の中止を 有効にした場合、この端子上の立ち上がりエッジは、進行中の DMA トランザクションを停止します。trq は、進行中の DMA バ ースト トランザクションがある場合にのみ、TD チェーンを中止 することに注意してください。詳細については、コンポーネント のデータシートを参照してください。 Transfer complete (転送完了) (nrq): DMA 転送が完了した ことを示すために、転送が終了する DMA チャネルの NRQ 端 子で 2 バス クロックのパルス幅を生成するように TD をコンフ ィギュレーションすることができます。その後の動作のために、 nrq 端子を割り込み、または別のコンポーネントに接続するこ とができます。 nrq 端子で信号を生成するかどうかを、そして trq を使用して TD の中止を有効にするかどうかを定義するために、TD プロ パティを設定します。 www.cypress.com 文書番号: 001-75652 Rev. *A 6 PSoC® 3 および PSoC 5LP - DMA 入門 DMA のファームウェア コンフィギュレーション DMA コンポーネントは、プロジェクトのビルド プロセス中に各 DMA インスタンスのソース ファイルと対応するヘッダ ファイルを生成しま す 。 デ ザ イ ン に DMA_1 と い う 名 前 を 持 つ DMA コ ン ポ ー ネ ン ト イ ン ス タ ン ス が 存 在 し て い る 場 合 、 「 DMA_1_dma.c 」 と 「DMA_1_dma.h」というファイルがビルド プロセス中に作成されます。これらのファイルは、DMA チャネルを初期化するために使用す る「DmaInitialize」API を含みます。他のチャネルおよび TD コンフィギュレーション機能は、「Generated Source」フォルダ内の 「CyDmac.c」と「CyDmac.h」ファイルに含まれています。 DMA のファームウェア コンフィギュレーションの手順は次の通りです。 1. DMA チャネルを開始 Channel_Handle = DMA_DmaInitialize(DMA_BYTES_PER_BURST, DMA_REQUEST_PER_BURST, HI16(Source Address), HI16(Destination Address)) 2. TD のインスタンスを作成 TD_Handle = CyDmaTdAllocate(); 3. TD コンフィギュレーションを設定 CyDmaTdSetConfiguration(TD_Handle,Transfer_Count,Next_TD,TD_Property); 4. TD アドレスを設定 CyDmaTdSetAddress(TD_Handle, LO16(Source Address), LO16(Destination Address)) 5. チャネルの初期 TD を設定 CyDmaChSetInitialTd(Channel_Handle, TD_Handle) 6. DMA チャネルを有効化 CyDmaChEnable(Channel_Handle, preserve_TD) 上記のファームウェアの手順は、19 ページの「付録 A: DMA コンフィギュレーション手順」で詳しく説明されます。DMA ウィザードを使用 して DMA チャネルをコンフィギュレーションするコードを自動的に生成することができます。詳細については、21 ページの「付録 B: DMA ウィザードによるコンフィギュレーション」を参照してください。 DMA ウィザードは PSoC の限られたペリフェラルでの DMA トランザクションのみをサポートしていることに注意してください。DMA ウィ ザードがペリフェラルをサポートしない場合、付録 A で詳しく説明する機能を使用して、手動で DMA チャネルをコンフィギュレーションす る必要があります。 以下は、メモリとペリフェラル間の DMA 転送を行う方法を詳細に説明する 4 つの例です。5 番目の例では、複数 TD のチェーンを作成 する方法を説明します。 www.cypress.com 文書番号: 001-75652 Rev. *A 7 PSoC® 3 および PSoC 5LP - DMA 入門 例 1: ペリフェラル間の転送 この例では、DMA を使用してペリフェラル間の転送、つまり図 6 のような ADC データ出力レジスタから DAC データ入力レジスタへの 転送を行う方法を示しています。 図 6. ペリフェラル間の転送のブロック図 Source – ADC Destination – DAC DMA Channel ADC 1 Byte Read Write 1Byte DAC EoC DMA Request (DRQ) TD Pointer DMA Done (NRQ) TD[0] Source Destination Transfer Count Next TD TD Property: None 図 7 に示すように、ADC は、シングルエンドの 8 ビット電圧 DAC である VDAC のデータ形式に一致するように、シングル エンド で機能する 8 ビット構成のものとしてコンフィギュレーシ ョンされます。ADC の結果が出ると、ADC がデータ転送の要 求を発行することができるように、DMA チャネルのハードウェ ア要求 (DRQ) が有効化され、ADC の EoC 信号に接続され ます。 この要求を受信した後、DMA チャネルは ADC の出力レジス タから 1 データ バイトを読み出して DAC データ レジスタに書 き込みます。 図 7. ペリフェラル間の転送のトップ デザイン www.cypress.com 文書番号: 001-75652 Rev. *A 8 PSoC® 3 および PSoC 5LP - DMA 入門 例 1 の DMA コンフィギュレーション このプロジェクトの DMA チャネルおよび TD のコンフィギュレ ーションは表 2 および表 4 に示します。 TD は、連鎖された TD のアレイとして考えることができます。 この例の場合、1 つの単一要素のアレイ TD[0]のみが必要で す。 表 4. TD[0] コンフィギュレーション設定 表 2. チャネル コンフィギュレーション設定 パラメーター プロジェクト設定 ソース アドレスの上位 HI16(CYDEV_PERIPH_BASE) 宛先アドレスの上位 HI16(CYDEV_PERIPH_BASE) バースト カウント 1 (1 バイト) バーストごとに要求 1 (True) 最初の TD TD[0] TD の保存 1 (True) チャネル コンフィギュレーションは、ソース アドレスと宛先アド レスの両方の 32 ビット アドレスには、上位 16 ビットがありま す。 PSoC Creator の自動生成されたファイル cydevice.h に定義 された CYDEV_PERIPH_BASE は、ADC と DAC を含むす べての PSoC ペリフェラルのベース アドレスを定義します。 HI16 は 32 ビット値の上位 16 ビットを返す PSoC Creator の マクロです。このマクロは、ソース アドレスと宛先アドレスの上 位 16 ビットを取得するために使用されます。 別の方法として、表 3 に示すように、コンポーネントのレジスタ に対応するソース アドレスと宛先アドレスの上位アドレスを割 り当てることができます。アドレスの定義はそれぞれ、 「ADC_DelSig.h」、と「VDAC8.h」のコンポーネント ファイルに あります。 表 3. 代替の上位アドレス パラメーター プロジェクト設定 ソース アドレス の上位 HI16(ADC_Delsig_DEC_OUTSAMP_PTR) 宛先アドレス の上位 HI16(VDAC8_DATA_PTR) www.cypress.com パラメーター プロジェクト設定 ソースアドレス の下位 LO16(ADC_Delsig_DEC_OUTSAMP_PTR) 宛先アドレス の下位 LO16(VDAC8_DATA_PTR) 転送カウント 1 (1 バイト) TD プロパティ なし(0) 次の TD TD[0] (同じ TD にループバック) LO16 マクロは、32 ビット値の下位 16 ビットを返します。 DMA チャネルは各 DMA 要求に対して 1 バイトを移動する必 要があるため、バースト カウントが 1 バイトに設定され、バー ストごとの要求が「True」に設定されます。 次に実行される TD が (ループされた) 同じ TD に設定される ため、同じトランザクションが各 DMA 要求に応じて繰り返され ます。TD の保存パラメーターが「True」に設定されます。 例 1 のプロジェクト ファイル 本アプリケーション ノートに添付する AN52705.zip ファイル内 の Eg1_ADC_DMA_DAC プロジェクトはこの例をデモします。 このプロジェクトのテスト方法の詳細については、「付録 D: サ ンプル プロジェクト – テスト セットアップ」を参照してください。 この例の DMA コンフィギュレーション コードを以下に記載しま す。DMA ウィザードを使用してこのコンフィギュレーション コー ドを生成する方法の詳細については、「付録 B: DMA ウィザー ドによるコンフィギュレーション」を参照してください。 文書番号: 001-75652 Rev. *A 9 PSoC® 3 および PSoC 5LP - DMA 入門 例 1 の DMA のコンフィギュレーション コード /* Define for DMA Configuration */ #define DMA_BYTES_PER_BURST 1 #define DMA_REQUEST_PER_BURST 1 #define DMA_SRC_BASE (CYDEV_PERIPH_BASE) #define DMA_DST_BASE (CYDEV_PERIPH_BASE) /* Variable declarations for the * DMA_Chan is used to store the uint8 DMA_Chan; /* DMA_TD array is used to store * Since there is only one TD in uint8 DMA_TD[1]; DMA channel. DMA channel */ all of the TDs associated with the channel this example, DMA_TD array contains only one element */ /* DMA Configuration steps */ /* Step 1 */ /* DMA Initializations done for both the DMA Channels * Burst count = 1, (8 bit data transferred to VDAC one at a time) * Request per burst = 1 (transfer burst only on new request) * High byte of source address = Upper 16 bits of ADC data register * High byte of destination address = Upper bytes of the VDAC8 data register * DMA_Chan holds the channel handle returned by the ‘DmaInitialize’ function. This is * used for all further references of the channel */ DMA_Chan = DMA_DmaInitialize(DMA_BYTES_PER_BURST, DMA_REQUEST_PER_BURST, HI16(DMA_SRC_BASE), HI16(DMA_DST_BASE)); /* Step 2 */ /* Allocate TD for DMA Channel * DMA_TD[0] is a variable that holds the TD handle returned by the TD allocate function. * This is used for all further references of the TD */ DMA_TD[0] = CyDmaTdAllocate(); /* Step 3 */ /* Configure TD[0] * Transfer count = 1 (total number of bytes to transfer from the ADC to DAC) * Next Td = DMA_TD[0]. The same td has to repeat itself for every ADC EoC. * Configuration = No special TD configurations required */ CyDmaTdSetConfiguration(DMA_TD[0], 1, DMA_TD[0], 0); /* Step 4 */ /* Configure the td address * Source address = Lower 16 bits of ADC data register * Destination address = Lower 16 bits of VDAC8 data register */ CyDmaTdSetAddress(DMA_TD[0], LO16((uint32)ADC_DelSig_DEC_SAMP_PTR), LO16((uint32)VDAC8_Data_PTR)); /* Step 5 */ /* Map the TD to the DMA Channel */ CyDmaChSetInitialTd(DMA_Chan, DMA_TD[0]); /* Step 6 */ /* Enable the channel * The Channel is enabled with Preserve TD parameter set to 1. This preserves the * original TD configuration and reload it after the transfer is complete so that the TD * can be repeated */ CyDmaChEnable(DMA_Chan, 1); www.cypress.com 文書番号: 001-75652 Rev. *A 10 PSoC® 3 および PSoC 5LP - DMA 入門 例 2: ペリフェラルからメモリへの転送 この例では、図 8 に示すように、ADC データ出力レジスタから 16 ビットのメモリ アレイへのペリフェラル-メモリ間の転送を実行する方 法を示します。 図 8. ペリフェラルからメモリへの転送のブロック図 Destination : RAM Buffer (adc_sampleArray) 16 bit Source : ADC ADC 2 Bytes Sample 1 1 rst Bu t2 s r u B DMA Channel Sample 2 Write Read ... EoC Bu rs DMA DMA Request Done (DRQ) (NRQ) Increment Destination Address ... t‘ N’ …. Interrupt (ISR) Sample ‘N’ DMA Transaction complete TD Pointer TD[0] Source Destination Transfer Count Next TD DMA_DISABLE_TD TD Properties : Increment Destination address, : Generate transaction complete signal 図 9 は、プロジェクトのトップ デザインを示します。Pin_Switch を押す度に、ISR_Switch がトリガーされ、DMA チャネルを有 効にするためにフラグが isr に設定されます。DMA チャネルが 有効になると、ADC からの EoC 信号が DMA チャネル要求を アクティブにします。 各 DMA 要求に応じて、DMA は、転送元 (ADC 出力レジスタ) から 2 バイトを読み出し、転送先の RAM バッファに書き込み、 宛先アドレスを 2 ずつインクリメントします。転送カウントは、各 バースト転送後 2 つずつデクリメントされます。これは、転送カ ウントが 0 になるまで繰り返します。転送カウントが 0 になると、 ISR_DMA_Done 割り込みをアクティブにする、DMA コンポー ネントの NRQ 端子でのトランザクション完了信号が生成され ます。 割込みサービス ルーチンでは、トランザクションが完了したこ とを示すためにフラグが設定されます。トランザクションが完了 すると DMA チャネルは無効になり、スイッチが再び押された 時に有効になります。 図 9. ペリフェラルからメモリへの転送のトップ デザイン www.cypress.com 文書番号: 001-75652 Rev. *A 11 PSoC® 3 および PSoC 5LP - DMA 入門 表 6. TD[0]コンフィギュレーション設定 例 2 の DMA のコンフィギュレーション このプロジェクトの DMA チャネルおよび TD のコンフィギュレ ーションは、表 5 および表 6 に示します。 パラメーター プロジェクト設定 表 5. チャネル コンフィギュレーション設定 ソースアドレス の下位 LO16(ADC_Delsig_DEC_OUTSAMP_PTR) 宛先アドレスの 下位 LO16(&adc_sampleArray) パラメーター プロジェクト設定 ソース アドレスの上位 HI16(CYDEV_PERIPH_BASE) 宛先アドレスの上位 HI16(CYDEV_SRAM_BASE) バースト カウント 2 (2 バイト) Increment Destination Address バーストごとに要求 1 (True) (転送先アドレスのインクリメント)、 最初の TD TD[0] TD の保存 1 (True) 転送カウント (サンプル数 × サンプル当たりのバイト数) Generate DMA done event (DMA 完了イベントの生成)、 TD プロパティ チャネル コンフィギュレーションは、ソース アドレスと宛先アド レスの両方の 32 ビット アドレスには、上位 16 ビットがありま す。ソース アドレスは、例 1 と同様です。 PSoC Creator の自動生成ファイル cydevice.h に定義された CYDEV_PERIPH_BASE は、SRAM のベース アドレスを定 義します。これは、宛先アドレスの上位 16 ビットを指定するた めに使用されます。 別の方法として、RAM アレイ ポインタを HI16 マクロと併用し て PSoC 5LP のソース アドレスの上位 16 ビットを指定するこ とができます。この方法は PSoC 3 では使用できません。これ は、PSoC 3 では、RAM 変数の上位 16 アドレス ビットがゼロ ですが、Keil コンパイラは、Keil 固有の情報を変数アドレスの 上位 16 ビットに格納するためです。このため、PSoC3 の Keil コンパイラが併用される場合、HI16 (&adc_sampleArray) は 不正なアドレスを返します。 この例では、各 DMA 要求に応じて 2 バイトの ADC 結果を ADC から RAM に転送する必要があるため、バースト カウン トは 2 に設定され、バーストごとの要求は「true」に設定されま す。 「TD の保存」は、元の TD 設定、すなわちソース アドレス、宛 先アドレスおよび転送カウントが保存され、トランザクションを 繰り返すことができるように、1 (TRUE) に設定されます。 表 6 に示すように、ソース アドレスと宛先アドレスの下位 16 ビ ットは、トランザクション ディスクリプタ (TD[0]) のコンフィギュレ ーションで指定されます。 www.cypress.com 200 x 2 「スワップ イネーブル」は PSoC 3 の場合にの み必要 (TD_INC_DST_PTR | DMA__TD_TERMOUT_EN | TD_SWAP_EN) 次の TD DMA_DISABLE_TD 転送カウントは、「バッファリングするサンプル数×サンプル当 たりのバイト数」に等しい「400」に設定されます。 TD プロパティは、各バースト転送後に宛先アドレスをインクリ メントし、指定されたサンプル数がバッファリングされると、トラ ンザクション完了信号を生成するように設定されます。PSoC 3 プロジェクトでは、TD は、TD プロパティ セクションで説明した ように、ADC からメモリにデータを転送中にバイトをスワップす るように構成されます。TD プロパティのそれぞれに対応する ビットは、PSoC Creator により自動生成された CyDmac.h フ ァイルで定義されます。TD プロパティを設定するために、必要 なプロパティ ビット フィールドは論理和されます。 指定されたサンプル数をバッファリングした後に DMA 転送を 停止するために、TD[0]は、「 DMA_DISABLE_TD 」と連鎖さ れ、よって DMA チャネルは無効になります。 例 2 のプロジェクト ファイル 本アプリケーション ノートに添付する「AN52705.zip」ファイル 内の Eg2_ADC_DMA_Mem プロジェクトはこの例をデモしま す。この例の DMA コンフィギュレーション コードは例 1 と同じ です。関数に渡される引数は、上記のチャネルおよび TD コン フィギュレーション表に記載されています。このプロジェクトの テスト方法の詳細については、「付録 D: サンプル プロジェクト – テスト セットアップ」を参照してください。 文書番号: 001-75652 Rev. *A 12 PSoC® 3 および PSoC 5LP - DMA 入門 例 3: メモリからペリフェラルへの転送 この例では、DMA を使用してメモリからペリフェラルへのデータ転送を行う方法を示します。この例では、図 10 に示すように、DAC を 使用して、波を発生させる方法をデモしています。 図 10. メモリからペリフェラルへの転送のブロック図 Source : Memory Look up table 8 Bit Destination : DAC Location 1 Location 2 Increment Source Address DMA Channel Burst1 Burst2 Read ... Write 1 Byte DAC ... …. rst Bu N Location ‘N’ DMA Done (NRQ) DMA Request (DRQ) DMA Trigger Clock TD Pointer TD[0] Source Destination Transfer Count Next TD Loop back to same TD TD Property : Increment Source address 128 点の正弦ルックアップ テーブルがフラッシュ メモリに格納 されます。正弦波を生成するために、これらの値は DMA を使 用して順次に DAC に送信されます。図 11 は、プロジェクトの トップ デザインを示します。 定期的に DMA 要求 (drq) を生成するためにクロックコンポー ネントを使用します。この要求を受信した後、DMA チャネルは ルックアップ テーブルから 1 データ バイトを取得し、DAC デー タ レジスタに書き込みます。宛先アドレスは 1 つずつインクリメ ントされ、転送カウントは各バースト転送後に 1 つずつデクリメ ントされます。これはテーブル内のすべての値が DAC に送信 されることが完了するまで継続します。 TD コンフィギュレーションが保存され、連続的な正弦波を生成 するように転送の終了時に再びロードされます。正弦波の周 波数は、ルックアップ テーブル内のポイント数で分周される DMA トリガー クロック周波数に等しいです。 図 11. メモリからペリフェラルへの転送のトップ デザイン www.cypress.com 文書番号: 001-75652 Rev. *A 13 PSoC® 3 および PSoC 5LP - DMA 入門 例 3 の DMA コンフィギュレーション このプロジェクトの DMA チャネルおよび TD のコンフィギュレ ーションは表 7 と表 8 に示します。 表 7. チャネル コンフィギュレーション パラメーター ソース アドレスの上 位 宛先アドレスの上位 表 8. TD[0]コンフィギュレーション パラメーター プロジェクト設定 プロジェクト設定 ソースアドレスの下位 LO16 (&sineTable) PSoC 3 の場合は HI16(CYDEV_FLS_BASE) 宛先アドレスの下位 LO16(VDAC8_DATA_PTR) PSoC 5LP の場合は HI16 (&sineTable) 転送カウント 128 (正弦ルックアップ テーブル内の バイト数) TD プロパティ ソース アドレスのインクリメント (TD_INC_SRC_ADR) 次の TD TD[0] - 同じ TD に再びループバック HI16(CYDEV_PERIPH_BASE) バースト カウント 1 (1 バイト) バーストごとに要求 1 (True) 最初の TD TD[0] TD の保存 1 (True) 転送カウントは、正弦ルックアップ テーブル内のバイト総数に 設定されます。 DMA 転送元は、フラッシュ メモリに保存された正弦テーブル アレイです。PSoC5LP では HI16(&sineTable) がソース アド レ スの 上 位 16 ビ ットを 設定す るの に対 し、 PSoC 3 で は HI16(CYDEV_FLS_BASE) が、前の例で述べた理由のため、 ソース アドレスの上位 16 ビットを識別するために使用されま す。 DMA チャネルは、各 DMA 要求に際してルックアップ テーブ ルのアレイから DAC に 1 バイトを転送する必要があります。 そのため、バースト カウントは 1 バイトに設定され、バーストご との要求は「true」に設定されます。 元の TD コンフィギュレーションは、再利用のために保存され ます。 www.cypress.com 表 8 に示すように、ソース アドレスと宛先アドレスの下位 16 ビ ットは LO16 マクロを使用して設定されます。 TD は、各バースト転送後にソース アドレス、すなわちルックア ップ テーブル ポインタをインクリメントするようにコンフィギュレ ーションされます。 転送完了時に、正弦波の 1 つの完了サイクルが DAC 出力で 生成されます。TD は保存され、連続波を生成するように自己 にループバックされます。 例 3 のプロジェクト ファイル 本アプリケーション ノートに添付する AN52705.zip ファイル内 の Eg3_Mem_DMA_DAC プロジェクトはこの例をデモします。 この例の DMA コンフィギュレーション コードは例 1 と同じです。 関数に渡される引数は、上記のチャネルおよび TD コンフィギ ュレーション表に記載されています。このプロジェクトのテスト 方法の詳細については、「付録 D: サンプル プロジェクト – テ スト セットアップ」を参照してください。 文書番号: 001-75652 Rev. *A 14 PSoC® 3 および PSoC 5LP - DMA 入門 例 4: メモリ間の転送 この例では、DMA を使用してメモリ間のデータ転送を行う方法を示します。また、CPU を使用して DMA チャネルをトリガーする方法も 示します。この例では、図 12 に示すように、8 バイトのフラッシュ アレイが、CPU 要求に応じて 8 バイトの RAM アレイにコピーされま す。 図 12. メモリ間の転送時のブロック図 Source – 8 bit flash array Destination – 8 bit RAM array 8 Bit 8 Bit DMA Channel 1 byte SrcArray[0] Increment Source Address 1 byte SrcArray[1] Read DestArray[0] DestArray[1] Write ... ... ... …. … … ... … … …. SrcArray[N-1] Increment Destination Address DestArray[N-1] DMA Request CPU Request DMA transaction complete DMA Done (NRQ) Interrupt (ISR) TD Pointer TD[0] Source Destination Transfer Count Next TD DMA_DISABLE_TD TD Properies : Increment Source address, : Increment Destination address, : Generate transaction complete signal 図 13 は、プロジェクトのトップ デザインを示します。 CyDmaChSetRequest 関数はデバイスへ電源投入した約 1 秒後 DMA 転送をアクティブにするために使用されます。 CPU から要求を受信すると、DMA はチャネルと TD コンフィギ ュレーション レジスタでコンフィギュレーションされたようにフラ ッシュ アレイから RAM アレイに 8 バイトを転送します。TD の ソース アドレスと宛先アドレスは、転送の進行と共にインクリメ ントされます。 転送が完了すると、パルスが DMA の nrq 信号端子で生成さ れます。これは、転送が完了したことを示すフラグを設定する ISR_DMADone 割り込みをアクティブにします。RAM の新規 内容は、その後 LCD に表示されます。 図 13. メモリ間の転送のトップ デザイン www.cypress.com 文書番号: 001-75652 Rev. *A 15 PSoC® 3 および PSoC 5LP - DMA 入門 表 10. TD[0] コンフィギュレーション 例 4 の DMA コンフィギュレーション このプロジェクトの DMA チャネルおよび TD のコンフィギュレ ーションは表 9 と表 10 に示します。 表 9. チャネル コンフィギュレーション パラメーター ソース アドレスの上位 プロジェクト設定 パラメーター プロジェクト設定 ソース アドレス LO16(&sourceArray) 宛先アドレス LO16(&destinationArray) 転送カウント 8 (バイト) PSoC 3 の場合は、 HI16(CYDEV_FLS_BASE) Increment Source Address (ソース アドレスのインクリメント) PSoC 5LP の場合は、 HI16(&sourceArray) Increment Destination Address (宛先アドレスのインクリメント) 宛先アドレスの上位 HI16(CYDEV_SRAM_BASE) バースト カウント 1 (1 バイト) バーストごとに要求 0 (False) 最初の TD TD[0] TD の保存 0 (False) TD プロパティ Generate DMA done signal (DMA 完了信号の生成) (TD_INC_SRC_ADR | TD_INC_DST_ADR | DMA__TD_TERMOUT_EN) 次の TD DMA 転送元は、フラッシュ メモリで定義された「sourceArray」 です。宛先は RAM 内の「destinationArray」です。前の例で説 明したようにフラッシュの宛先アドレスの上位 16 ビットは、 PSoC 5LP では HI16(&sourceArray) で、PSoC 3 では HI16(CYDEV_FLS_BASE) で設定されます。同様に、SRAM 内の転送先アドレスの上位 16 ビットは、マクロ HI16(CYDEV_SRAM_BASE) を使用して設定されます。 DMA_DISABLE_TD (0xFE) ソース アドレスの下位 16 ビットと TD コンフィギュレーション用 の宛先アドレスは、LO16 マクロによって識別されます。 総数 8 バイトがソース アドレスから宛先アドレスへ転送される ように、転送回数が「8」に設定されます。 DMA がフラッシュから 1 バイトごとに読み出し、RAM アレイに 書き込むように、バースト カウントが 1 バイトに設定されます。 データ転送を加速するためにバースト カウントを 8 バイトに設 定することもできます。ただし、通常、他の DMA チャネルもス ポークを共用することが可能になるように、バースト カウントを 低い値に設定する必要があります。 TD は、各バースト転送後に、ソース アドレス、すなわちフラッ シュ アレイ ポインタ、および宛先アドレス、すなわち RAM の アレイ ポインタをインクリメントするようにコンフィギュレーショ ンされます。8 バイト全てがフラッシュから RAM アレイに転送 された後、nrq ラインで TERMOUT パルスを送信するように TD がコンフィギュレーションされます。このパルスは、転送が 完了したことを示すための ISR をトリガーするために使用され ます。次の TD は、転送が終了した後に DMA チャネルを無効 にするために DMA_DISABLE_TD (0xFE) に設定されます。 各バースト転送に個別の要求が必要ないように、「バーストご との要求」パラメーターは「false」に設定されます。 トランザクションが一度のみ起こるため、TD コンフィギュレーシ ョンが保存される必要はありません。 例 4 のプロジェクト ファイル 本アプリケーション ノートに添付する AN52705.zip ファイル内 の Eg4_Mem_DMA_Mem プロジェクトはこの例をデモします。 この例の DMA コンフィギュレーション コードは例 1 と同じです。 関数に渡される引数は、上記のチャネルおよび TD コンフィギ ュレーション表に記載されています。このプロジェクトのテスト 方法の詳細については、「付録 D: サンプル プロジェクト – テ スト セットアップ」を参照してください。 www.cypress.com 文書番号: 001-75652 Rev. *A 16 PSoC® 3 および PSoC 5LP - DMA 入門 例 5: TD のチェーン化 このサンプル プロジェクトは、単一のチャネルで複数の TD を 使用し、TD 同士を連鎖する方法を示します。この例では、単 一の DMA チャネルと 2 つの TD を使用して、ADC データを 2 つの独立した RAM バッファへ交互に送信します。 これらの 2 つのトランザクションは、 TD[0]と TD[1]という 2 つ の独立したトランザクション ディスクリプタを使ってコンフィギュ レーションされ、図 14 に示すように、DMA の TD 連鎖機能に よりチェーン化されます。 DMA チャネルは、2 つのトランザクションを行うためにコンフィ ギュレーションされます。 トランザクション 1: ADC から RAM バッファ 1 へ トランザクション 2: ADC から RAM バッファ 2 へ 図 14. TD チェーン化時のブロック図 Destination1 : RAM Buffer1 16 bit Sample 1 Sample 2 1 rst t2 Bu Burs Source : ADC ... ... DMA Channel …. ADC 2 Bytes Write Read Burst N1 Bur st ( N1+ 1) EoC r Bu (N TD0àTD1 TD1àTD0 16 bit Increment Destination Address Sample 2 N2 1+ ... ) Interrupt (ISR) Destination2 : RAM Buffer2 Sample 1 st DMA DMA Request Done (DRQ) (NRQ) Sample N1 ... DMA Transaction complete signal …. TD Pointer Sample N2 TD[1] TD[0] Source Destination Transfer Count Source Next TD TD0 Property : Increment Destination address Destination Transfer Count Next TD TD1 Properties : Increment Destination address, : Generate transaction complete signal この TD コンフィギュレーションの形態は、単一の TD の最大転送カウント (単一の DMA チャネルの場合は 4096 バイト) の最上限を 超えるために使用することができます。チェーン内のすべての TD のソース アドレスと宛先アドレスの上位 16 ビットは同一でなければ ならないことに注意してください。 プロジェクトのトップ デザインは、例 2 と同様です。 www.cypress.com 文書番号: 001-75652 Rev. *A 17 PSoC® 3 および PSoC 5LP - DMA 入門 表 13. TD[1] コンフィギュレーション 例 5 の DMA コンフィギュレーション このプロジェクトの DMA チャネルおよび TD のコンフィギ ュレーションは、表 11、表 12、および表 13 に示します。 表 11. チャネル コンフィギュレーション パラメーター 設定 パラメーター プロジェクト設定 ソースアドレスの 下位 LO16(ADC_Delsig_DEC_OUTSAMP_P TR) 宛先アドレスの下 位 LO16(adc_sampleArray2) ソース アドレスの上位 HI16(CYDEV_PERIPH_BASE) 宛先アドレスの上位 HI16(CYDEV_SRAM_BASE) (サンプル数 × サンプル当たりのバイト数) バースト カウント 2 (2 バイト) 宛先アドレスのインクリメント: TD_INC_DST_ADR バーストごとに要求 1 (True) 最初の TD TD[0] TD の保存 1 (True) TD プロパティ 表 12. TD[0] コンフィギュレーション パラメーター プロジェクト設定 ソースアドレスの 下位 LO16(ADC_Delsig_DEC_OUTSAMP_P TR) 宛先アドレスの下 位 LO16(adc_sampleArray1) (サンプル数 × サンプル当たりのバイト数) DMA 完了イベントの生成: DMA__TD_TERMOUT_EN PSoC 3 に必要なスワップ イネーブル: TD_SWAP_EN 次の TD DMA 完了イベントの生成: DMA__TD_TERMOUT_EN 次の TD TD[0] 例 5 のプロジェクト ファイル このアプリケーション ノートに添付する AN52705.zip ファ イル内の Eg5_TD_Chaining は、TD チェーン化の例を 示しています。この例の DMA コンフィギュレーション コー ドは例 1 と同じです。関数に渡される引数は、上記のチャ ネルおよび TD コンフィギュレーション表に記載されてい ます。このプロジェクトのテスト方法の詳細については、 24 ページの「付録 D: サンプル プロジェクト – テスト セッ トアップ」を参照してください。 まとめ N1×2 宛先アドレスのインクリメント: TD_INC_DST_ADR TD プロパティ N2×2 PSoC 3 に必要なスワップ イネーブル: TD_SWAP_EN チャネルおよび TD のコンフィギュレーションは例 2 と同 様です。トランザクションを連鎖するために TD[0]の「次の TD」パラメーターを TD[1]に設定します。その逆も同じで す。 転送カウント 転送カウント このアプリケーション ノートでは、PSoC 3 と PSoC 5LP の DMA コントローラーについて説明しました。アプリケー ション ノートでは、単純な PSoC Creator のサンプル プロ ジェクトを使用して、各種のデータ転送用 DMA をコンフィ ギュレーションする方法を示しました。詳細情報について は、「PSoC 3 と PSoC 5LP テクニカル リファレンス マニ ュアル」と「PSoC Creator DMA コンポーネント データシ ート」を参照してください。 TD[1] 著者について 氏名: Anu M D 肩書き: シニアアプリケーション エンジニア 経歴: コーチンのモデル工科大学の電子通信工学学士。 連絡先: [email protected] www.cypress.com 文書番号: 001-75652 Rev. *A 18 PSoC® 3 および PSoC 5LP - DMA 入門 付録 A: DMA コンフィギュレーション手順 ステップ 1: DMA チャネルの初期化 ステップ 2: TD の割り当て Channel_Handle = DMA_DmaInitialize( DMA_BYTES_PER_BURST, DMA_REQUEST_PER_BURST, HI16(Source Address), HI16(Destination Address)) TD_Handle = CyDmaTdAllocate(); API 関数の DmaInitialize()は、次のようにいくつかの DMA チャネル パラメーターをコンフィギュレーションしま す。 DMA_BYTES_PER_BURST: 1 つ の バ ー ス ト で DMA チャネルにより読み書きされるバイト数 例えば、8 ビットの ADC データを収集するために DMA を定義する場合、DMA チャネルが各要求に応 じて転送元から転送先へ 1 バイトを転送する必要が あるため、このパラメーターを「1」に設定します。16 ビット ADC データを収集したい場合は、このパラメー ターを「2」に設定します。 DMA_REQUEST_PER_BURST: 各バーストに対 して個別の要求が必要かどうか判定するパラメータ ー 「1」に設定すれば、各バースト転送を個別に要求す る必要があります。0 に設定すれば、最初のバースト 転送に後続するバースト転送は個別の DMA 要求な しで自動的に行われます。(最初のバースト転送だけ は DMA 要求が必要です。) HI16(Source Address): ソース アドレスの上位 16 ビット。HI16 は 32 ビット値またはアドレスの上位 16 ビットを指定するために PSoC Creator により作成さ れるマクロです。 HI16(DestinationAddress): 宛先アドレスの上位 16 ビット。前述の表に記載されているマクロを使用し て、PSoC 3 のソース アドレスと宛先アドレスの上位 16 ビットを識別します。 PSoC 3 の Keil コンパイラは Keil 固有の情報を変 数アドレスの上位 16 ビットに格納します。このため、 表 14 に示す以下の定数を使用します。これらの定 数は、特に DMA 転送の転送元または転送先が RAM またはフラッシュ メモリの場合、PSoC 3 のソー ス アドレスと宛先アドレスの上位 16 ビットをコンフィ ギ ュ レ ー シ ョ ン す る た め に 、 HI16 マ ク ロ と 共 に CyDevice.h で定義されています。 API 関数の CyDmaTdAllocate() は、TD のインスタンス を作成し、その TD へハンドルを返します。他の API は、 TD ハンドルを TD のコンフィギュレーションに使用します。 複数の TD を作成するには、関数を何回も呼び出します。 ステップ 3: TD コンフィギュレーション Channel_Handle = DMA_DmaInitialize( DMA_BYTES_PER_BURST, DMA_REQUEST_PER_BURST, HI16(Source Address), HI16(Destination Address); API 関数の CyDmaTdSetConfiguration() は、次のパラ メーターを使用し TD をコンフィギュレーションします。 TD_Handle: CyDmaTdAllocate() 関数により返さ れるハンドル。 Transfer_Count: 転送元から転送先に転送する総 バイト数です。 Next_TD: TD チェーン内の次の TD のインデックス です。この TD がチェーンの最後になる場合は、 DMA_DISABLE_TD (0xFE)のマクロを使用し、TD の転送が完了した後に DMA チャネルを無効にしま す。 TD_Property: DMA トランザクションのプロパティを 設定するために、20 ページの表 15 に示した TD コ ンフィギュレーション レジスタのフラグを使用します。 TD プロパティをコンフィギュレーションするために、 すべてのフラグを論理和します。例えば、データ転送 中に 4 バイトをスワップするために TD を設定するに は、以下を使用します。 (TD_SWAP_EN | TD_SWAP_SIZE4) 表 14. 上位 16 ビットのアドレス マクロ ソース DMA_SRC_BASE ペリフェラル CYDEV_PERIPH_BASE RAM CYDEV_SRAM_BASE フラッシュ CYDEV_FLS_BASE www.cypress.com 文書番号: 001-75652 Rev. *A 19 PSoC® 3 および PSoC 5LP - DMA 入門 表 15. TD プロパティ コンフィギュレーション フラグ 機能 TD_SWAP_EN エンディアン スワップを行う。転送元から転送先へデータを転送しながらバイトをスワップ TD_SWAP_SIZE4 スワップ サイズを 4 バイトに設定。デフォルトのスワップ サイズは 2 バイト TD_AUTO_EXEC_NEXT 現在の TD が完了すると、チェーンの次の TD が自動的にアクティブになる TD_TERMIN_EN trq 入力ラインでポジティブ エッジが発生すると、この TD を中止。そのポジティブ エッジはバースト中 に発生しなければならない。DMAC がポジティブ エッジを待機するのはこの時だけ DMA__TD_TERMOUT_EN このフラグを使用すれば、TD 転送が完了するとパルスが nrq ライン上で発生する。このフラグは、 DMA コンポーネント インスタンスに固有のもので、コンポーネントのインスタンス ヘッダ ファイルで定 義される。例えば、トップ デザインでは DMA コンポーネント インスタンス名が DMA_1 の場合、イン スタンスの TERMOUT マクロは、「DMA_1_dma.h」に含まれる「DMA_1__TD_TERMOUT_EN」 TD_INC_DST_ADR 各バースト データ トランザクションのサイズに応じて宛先アドレスをインクリメント TD_INC_SRC_ADR 各バースト データ トランザクションのサイズに応じてソース アドレスをインクリメント ステップ 4: TD の転送元と転送先のコンフィギュレーション ステップ 5: チャネルに TD を接続 CyDmaChSetInitialTd(Channel_Handle, TD_Handle) CyDmaTdSetAddress(TD_Handle, LO16(source), LO16(destination)) API 関数の CyDmaTdSetAddress() は、次のパラメータ ーを使用して、TD のソース アドレスと宛先アドレスを設定 します。 TD_Handle: CyDmaTdAllocate() 関数により返さ れたハンドル LO16(source): ソース アドレスの下位 16 ビット LO16(destination): 宛先アドレスの下位 16 ビット PSoC は、高度にプログラム可能です。多くのコンポーネ ントは、プログラム可能なデジタルとアナログ ブロックから 作成され、ペリフェラルの物理位置はデザインに応じて変 更されます。従って、すべてのソース アドレスと宛先アド レスをリストする従来のレジスタ マップを作ることは不可 能です。 その代わりに、各コンポーネントのレジスタは、ビルドのプ ロセス中に PSoC Creator により生成されたコンポーネン ト API ヘッダ ファイルにて定義されています。コンポーネ ントのレジスタ アドレスを識別するために、これらのヘッダ ファイルを確認する必要があります。 www.cypress.com API 関数の CyDmaChSetInitialTD() は DMA チャネル の最初の TD を設定します。 Channel_Handle: DMA_DmaInitialize() 関数によ り返される DMA インスタンスのハンドル TD_Handle: CyDmaTdAllocate() 関数により返さ れたハンドル ステップ 6: DMA チャネルの有効化 CyDmaChEnable(Channel_Handle, Preserve_TD) API 関数の CyDmaChEnable()は DMA チャネルを有効 にします。 Channel_Handle: DMA_DmaInitialize() 関数によ り返される DMA インスタンスのハンドル Preserve_TD: TRUE の場合、DMA チャネルは TD を繰り返すことができるように、TD コンフィギュレーシ ョン (転送元、転送先および転送カウント) を保存 文書番号: 001-75652 Rev. *A 20 PSoC® 3 および PSoC 5LP - DMA 入門 その他の重要な DMA API 関数 CPU からの要求で DMA チャネルを有効にするためには、以下の関数を使用します。 CyDmaChSetRequest(Channel_Handle, CPU_REQ); DMA チャネルを無効にするには、以下の関数を使用します。 CyDmaChDisable(Channel_Handle); 付録 B: DMA ウィザードによるコンフィギュレーション 付録 A で説明した手順の代わりに、DMA ウィザードによ り、簡単に DMA チャネルと TD ファームウェアのコンフィ ギュレーションを定義することができます。ただし、ウィザ ードは、DMA 転送元または転送先として機能しているペ リフェラルを少数のみサポートしています。ペリフェラルが サポートされない場合、付録 A で説明されているコンフィ ギュレーション手順に従ってください。 ステップ 2: グローバル設定を選択 図 16 に示すように、DMA 転送グローバル設定を選択し ます。 図 16. グローバル設定 DMA ウ ィ ザ ー ド を 起 動 す る に は 、 PSoC Creator > Tools>DMA Wizard をクリックしてください。 ステップ 1: DMA チャネル (DMA コンポーネント インスタ ンス) を選択 図 15 に示すようにコンフィギュレーションする DMA チャ ネルを選択します。 図 15. DMA チャネルの選択 このダイアログを使用して DMA チャネル コンフィギュレ ーション パラメーターを選択します。 Source (転送元) と Destination (転送先): ソース アド レスと宛先アドレスの上位 16 ビットです。 Bytes per Burst (バースト当たりのバイト数): 単一のバ ーストで転送するバイト数を決めます。 DMA コンポーネントの インスタンス名 Each Burst Requires a Request (各バーストごとに要 求が必要): 各バーストには個別の要求が必要かどうか 決めます。 次のようにダイアログのパラメーターを選択します。 Project (プロジェクト): PSoC Creator プロジェクト の名前 DMA: プロジェクト内の DMA コンポーネント インスタ ンスの名前 完了したら、「Next」をクリックします。 Number of TDs (TD 数): DMA チャネルに関連するトラ ンザクション ディスクリプタの数 (1~128) を選択します。 Single Chain or Loop (シングル チェーンまたはルー プ): どの「次の TD」がチェーンの最後の TD になるかを 決 め ま す 。 シ ン グ ル チ ェ ー ン の 場 合 、 次 の TD は DMA_DISABLE_TD (0xFE) です。ループの場合、次の TD は最初の TD です。 完了したら、「Next」をクリックします。 www.cypress.com 文書番号: 001-75652 Rev. *A 21 PSoC® 3 および PSoC 5LP - DMA 入門 ステップ 3: チャネル用のトランザクション ディスクリプタの定義 図 17 に示すように、DMA 転送グローバル設定を選択します。表 16 は、各 TD コンフィギュレーション パラメーターについて 説明します。 図 17. トランザクション ディスクリプタの追加 表 16. TD コンフィギュレーションの詳細 フィールド 説明 TD# トランザクション ディスクリプタの論理的番号を表示 Endian 2 または 4 バイト エンディアンの バイト スワッピングを有効にする。これにより、データが転送元から転送先へ移動中 にバイトをスワップすることが可能になる。Bytes per Burst (バースト当たりのバイト数) の設定は選択したエンディア ンの倍数に設定されていなければならない。これは通常、エンディアンの違いのため PSoC 3 のメモリとペリフェラル間 の DMA 転送に使用される Term In TERMIN (trq) 信号の立ち上がりエッジで TD トランザクションを中止することを可能にする Term Out TD が終了すると TERMOUT (nrq) 信号を生成することを可能にする Length TD の転送カウントを バイト単位 (0~4095) で指定する。これは、トランザクションを完了するために DMA が転送す べき総バイト数 Source DMA 転送用ソース アドレスの下位 16 ビット。選択した転送元が (メモリではなく) コンポーネントの場合、ソース アドレ スのドロップダウン リストが DMA ウィザードで提供される。また、手動でソース アドレスを変更したり入力することも可 能 Inc (Source) DMA がトランザクションを行っている間にソース アドレスをインクリメントすることを可能にする。これが有効になってい る場合、DMA が転送元からデータを読み出すたびに、ソース アドレスは DMA が読み出したバイト数でインクリメントさ れる。トランザクション全体 (転送カウント) が終了するまで、DMA はソース アドレスをインクリメントする Destination DMA 転送の転送先アドレスの下位 16 ビット。選択した転送先が (メモリではなく) コンポーネントの場合、宛先アドレス のドロップダウンリストが DMA ウィザードで提供される。また、手動で宛先アドレスを変更したり入力することも可能 Inc(Destination) DMA がトランザクションを行っている間に宛先アドレスをインクリメントすることを可能にする。トランザクション全体 (転 送カウント) が終了するまで、DMA は宛先アドレスをインクリメントする Auto Next 追加の DMA 要求なしで、自動的に次の TD を実行する Next TD TD チェーン内の次の論理的 TD。このチェーンがこの TD で終わる場合、END (終了) に設定 完了したら、「Next」をクリックします。必要なコードが生成されます。 www.cypress.com 文書番号: 001-75652 Rev. *A 22 PSoC® 3 および PSoC 5LP - DMA 入門 ステップ 4: DMA ウィザードで作成されたコードをコピー 図 18. 生成コード DMA チャネルと TD のコンフィギュレーションが完了したら、ウ ィザードが DMA チャネルのためにコードを生成します。このコ ードは、DMA チャネルと TD のコンフィギュレーションを含み、 図 18 に示すように、DMA ウィザード ダイアログ内のウィンド ウで生成されます。コードを使用するには、ウィンドウ内のすべ てのコードを選択し、コピーし、main.c に貼り付けます。 ウィザードの詳細については、「PSoC Creator Help」ファイル を参照してください。 付録 C: DMA チャネルの優先順位の設定 複数の DMA チャネル要求がアクティブになった場合、DMA チャネルは、チャネル優先順位設定に応じて、DMAC により処理されます。 各 DMA チャネルには、8 つの異なる優先レベルの内から 1 つを与えることができます。図 19 に示すように、Design Wide Resources (*.cydwr) > DMA タブをクリックして PSoC Creator で DMA チャネルの優先順位を設定することができます。 図 19. DMA チャネルの優先順位の設定 CPU と DMAC の要求が同時に PHUB 上の同じスポークにアクセスした場合、CPU はデフォルトで優先されます。PHUB は、DMA と CPU 間、および DMA チャネル間のアービトレーションを管理します。詳細については、「PSoC® 3、PSoC® 5LP アーキテクチャ TRM」 を参照してください。 www.cypress.com 文書番号: 001-75652 Rev. *A 23 PSoC® 3 および PSoC 5LP - DMA 入門 付録 D: サンプル プロジェクト – テスト セットアップ 例 1: ペリフェラル間の転送 – Eg1_ADC_DMA_DAC このサンプル プロジェクトでは、ADC のサンプリング周波数 (fs) は 384kHz です。デルタ シグマ ADC は 0.22 fs で-3dB 降下のロー パス特性を持っているため、入力周波数が 84kHz 以下の場合、出力が最適に再構成されます。テスト セットアップを次に示します。 1. ファンクションジェネレータを P0[2]ピン (ADC の入力) に接続します。 2. 100Hz の正弦波を生成するようにファンクションジェネレータを設定します。 3. オシロスコープ プローブを P0[0]ピン (VDAC の出力) に接続します。 4. プロジェクトをビルドし、デバイスをプログラムします。 5. オシロスコープ上の P0[0]ピンからの出力を見てください。入力と同様に、周波数 100Hz の正弦波が生成されているはずです。 例 2: ペリフェラルからメモリへの転送 – Eg2_ADC_DMA_Mem テスト セットアップを次に示します。 1. 入力信号を P0[2]ピン (ADC の入力) に接続します。入力が ADC の範囲内 (VSSA~2.048 V) であることを確認してください。 2. DVK 上のスイッチ (SW1) を P6[1]に接続します。 3. プロジェクトをビルドします。 4. 図 20 に示すように、プログラムをダウンロードし、デバッグを開始するために、F5 キーを押す、またはデバッグのアイコンをクリック します。 図 20. デバッグ ボタン 5. 図 21 に示すように、ウォッチ変数として adc_sampleArray を追加します。 図 21. ウォッチ変数 www.cypress.com 文書番号: 001-75652 Rev. *A 24 PSoC® 3 および PSoC 5LP - DMA 入門 6. 図 22 に示すように、if(DMADone_flag) ループ内にブレークポイントを設定します。 図 22. ブレークポイントの追加 7. F5 キーを押してプログラムを実行します。P6[1]に接続されたスイッチ (SW1) を押して、DMA を有効にし、ADC サンプルのバッフ ァリングを開始します。DMA が指定されたサンプル数を ADC からメモリに転送した後、実行はブレークポイントで停止します。結 果は、図 23 に示すように、ウォッチ ウィンドウで adc_sampleArray を監視することにより確認することができます。 図 23. ウォッチ ウィンドウでの ADC サンプル 例 3: メモリからペリフェラルへの転送 – Eg3_Mem_DMA_DAC テスト セットアップを次に示します。 1. オシロスコープ プローブを P0[0]ピン (VDAC の出力) に接続します。 2. プロジェクトをビルドして、デバイスをプログラムします。 3. オシロスコープで周波数 7.8kHz の正弦波を観察します。 例 4: メモリ間の転送 – Eg4_Mem_DMA_Mem テスト セットアップを次に示します。 1. キャラクタ LCD モジュールを CY8CKIT-001 PSoC の開発キットの P18 ヘッダ (LCD モジュールのポート 2) に接続します。 2. J12 ジャンパが、LCD に電源を供給するために ON の位置にあることを確認します。 3. プロジェクトをビルドして、デバイスをプログラムします。 4. LCD ディスプレイを見ます。最初の行は、宛先アレイの内容を表示します。最初はすべての値がゼロです。1 秒の遅延の後、最初 の 行 は 、 00 ~ 07 を 表 示 し 、 DMA が フ ラ ッ シ ュ か ら RAM に デ ー タ を 正 常 に 転 送 し た こ と を 示 し ま す 。 2 行 目 に は 、 「TRANSFERRED」(転送完了) メッセージが表示されます。図 24 は LCD ディスプレイの例を示します。 図 24. DMA 転送の LCD ディスプレイ 0 0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 T R A N S F E RR E D www.cypress.com 文書番号: 001-75652 Rev. *A 25 PSoC® 3 および PSoC 5LP - DMA 入門 例 5: TD のチェーン化 – Eg5_TD_Chaining このテスト セットアップは、例2のテスト セットアップと同様です。テストのセットアップ手順は次の通りです。 1. 入力信号を P0[2]ピン (ADC の入力)に接続します。入力が ADC の範囲内 (VSSA~2.048V) であることを確認してください。 2. DVK 上のスイッチ (SW1) を P6[1]に接続します。 3. プロジェクトをビルドします。 4. 図 25 に示すように、プログラムをダウンロードし、デバッグを開始するために、F5 キーを押す、またはデバッグのアイコンをクリック します。 図 25. デバッグ ボタン 5. 図 26 に示すように、ウォッチ変数として adc_samplearray1 と adc_samplearray2 を追加します。 図 26. ウォッチ変数 6. 図 27 に示すように、if(DMADone_flag) ループ内にブレークポイントを設定します。 図 27. ブレークポイントの追加 www.cypress.com 文書番号: 001-75652 Rev. *A 26 PSoC® 3 および PSoC 5LP - DMA 入門 7. F5 キーを押してプログラムを実行します。P6[1]に接続されたスイッチ (SW1) を押して、DMA を有効にし、ADC サンプルのバッフ ァリングを開始します。DMA が指定されたサンプル数を ADC からメモリに転送した後、実行はブレークポイントで停止します。結 果を検証するには、図 28 に示すようにウォッチ ウィンドウで adc_sampleArray1 と adc_sampleArray2 を監視します。 図 28. ウォッチ ウィンドウでの ADC サンプル 付録 E: よくある質問 1. DMA を使用してどのように、4095 バイト以上をバッファリングできますか? TD の最大転送カウントは 4095 バイトに制限されます。1 つの DMA チャネルを使って 4095 バイト以上を転送する必要がある場 合、例 5 に示すように、複数の TD を使用し、それらを連鎖します。 2. どのようにして、DMA データ転送のためのペリフェラルのソース アドレスと宛先アドレスを確定できますか? PSoC は、高度にプログラム可能です。多くのコンポーネントは、プログラム可能なデジタルとアナログ ブロックから作成され、ペリ フェラルの物理位置はデザインに応じて変更されます。従って、すべてのソース アドレスと宛先アドレスをリストする従来のレジスタ マップを作ることは不可能です。 その代わりに、各コンポーネントのレジスタは、ビルドのプロセス中に PSoC Creator により生成されたコンポーネント API ヘッダ ファイルにて定義されています。コンポーネントのレジスタ アドレスを識別するために、これらのヘッダ ファイルを確認する必要が あります。 3. どのようにして、DMA を UART、SPI などの通信プロトコルと併用しますか? UART や SPI などの通信プロトコルを DMA と共に使用する場合は、データ転送のために内部割り込みがトリガーされないように、 バッファ サイズを 4 以下に設定します。ハードウェアの FIFO ポインタを DMA の読み出しと書き込みデータ アドレスとして使用し、 FIFO レベルのステータスを割り込みとしてコンフィギュレーションして DMA をトリガーします。DMA チャネルのハードウェア要求を、 FIFO レベルで使用できるように、レベルトリガーに設定します。 4. DMA 転送のタイミングの詳細を教えてください。 DMA 転送のタイミングの詳細は「PSoC 3、PSoC 5LP テクニカル リファレンス マニュアル」を参照してください。DMA のタイミング に関する詳細説明は、このアプリケーション ノートの範囲外です。 www.cypress.com 文書番号: 001-75652 Rev. *A 27 PSoC® 3 および PSoC 5LP - DMA 入門 改訂履歴 文書名: PSoC® 3 および PSoC 5LP - DMA 入門– AN52705 文書番号: 001-75652 版 ECN 番号 変更者 発行日 ** 3497899 NITA 01/20/2012 これは英語版 001-52705 を翻訳し た日本語版 001-75652 Rev. **です。 *A 4716723 HZEN 04/02/2015 これは英語版001-52705 Rev. *Iを翻訳し た日本語版001-75652 Rev. *Aです。 www.cypress.com 変更内容 文書番号: 001-75652 Rev. *A 28 PSoC® 3 および PSoC 5LP - DMA 入門 ワールドワイドな販売と設計サポート サイプレスは、事業所、ソリューション センター、メーカー代理店および販売代理店の世界的なネットワークを保持しています。お客様 の最寄りのオフィスについては、サイプレスのロケーション ページをご覧ください。 PSoC®ソリューション 製品 車載用 cypress.com/go/automotive psoc.cypress.com/solutions クロック&バッファ cypress.com/go/clocks PSoC 1 | PSoC 3 | PSoC 5LP インターフェース cypress.com/go/interface 照明&電源管理 cypress.com/go/powerpsoc cypress.com/go/plc メモリ サイプレス開発者コミュニティ コミュニティ | フォーラム | ブログ | ビデオ | トレーニング cypress.com/go/memory 光学式ナビゲーション センサ ー cypress.com/go/ons PSoC cypress.com/go/psoc タッチ センシング cypress.com/go/touch USB コントローラー cypress.com/go/usb ワイヤレス/RF cypress.com/go/wireless PSoC はサイプレス セミコンダクタ社の登録商標です。本書で言及するその他すべての商標または登録商標は、各社の所有物です。 Cypress Semiconductor 198 Champion Court San Jose, CA 95134-1709 Phone Fax Website : 408-943-2600 : 408-943-4730 : www.cypress.com © Cypress Semiconductor Corporation, 2009-2015. 本文書に記載される情報は予告なく変更される場合があります。Cypress Semiconductor Corporation (サイプレス セミコンダクタ社) は、サイプレス製品に組み込まれた回路以外のいかなる回路を使用することに対して一切の責任を負いません。サイプレス セミコ ンダクタ社は、特許またはその他の権利に基づくライセンスを譲渡することも、または含意することもありません。サイプレス製品は、サイプレスとの書面による合 意に基づくものでない限り、医療、生命維持、救命、重要な管理、または安全の用途のために使用することを保証するものではなく、また使用することを意図したも のでもありません。さらにサイプレスは、誤動作や故障によって使用者に重大な傷害をもたらすことが合理的に予想される生命維持システムの重要なコンポーネ ントとしてサイプレス製品を使用することを許可していません。生命維持システムの用途にサイプレス製品を供することは、製造者がそのような使用におけるあら ゆるリスクを負うことを意味し、その結果サイプレスはあらゆる責任を免除されることを意味します。 このソースコード (ソフトウェアおよび/またはファームウェア) はサイプレス セミコンダクタ社 (以下「サイプレス」) が所有し、全世界の特許権保護 (米国およびそ の他の国)、米国の著作権法ならびに国際協定の条項により保護され、かつそれらに従います。サイプレスが本書面によりライセンシーに付与するライセンスは、 個人的、非独占的かつ譲渡不能のライセンスであり、適用される契約で指定されたサイプレスの集積回路と併用されるライセンシーの製品のみをサポートするカ スタム ソフトウェアおよび/またはカスタム ファームウェアを作成する目的に限って、サイプレスのソース コードの派生著作物をコピー、使用、変更そして作成す るためのライセンス、ならびにサイプレスのソース コードおよび派生著作物をコンパイルするためのライセンスです。上記で指定された場合を除き、サイプレスの 書面による明示的な許可なくして本ソース コードを複製、変更、変換、コンパイル、または表示することはすべて禁止します。 免責条項: サイプレスは、明示的または黙示的を問わず、本資料に関するいかなる種類の保証も行いません。これには、商品性または特定目的への適合性の黙 示的な保証が含まれますが、これに限定されません。サイプレスは、本文書に記載される資料に対して今後予告なく変更を加える権利を留保します。サイプレス は、本文書に記載されるいかなる製品または回路を適用または使用したことによって生ずるいかなる責任も負いません。サイプレスは、誤動作や故障によって使 用者に重大な傷害をもたらすことが合理的に予想される生命維持システムの重要なコンポーネントとしてサイプレス製品を使用することを許可していません。生命 維持システムの用途にサイプレス製品を供することは、製造者がそのような使用におけるあらゆるリスクを負うことを意味し、その結果サイプレスはあらゆる責任 を免除されることを意味します。 ソフトウェアの使用は、適用されるサイプレス ソフトウェア ライセンス契約によって制限され、かつ制約される場合があります。 www.cypress.com 文書番号: 001-75652 Rev. *A 29