AT32UC3BのPDCA(読んでみただけ)

今回はAT32UC3BのPDCA(Peripheral DMA Controller)を読んでみる。
ドキュメント「AT32UC3B Series Preliminary」の「19. Peripheral DMA Controller」部分。



19.1 Features

  • USARTとSSC、SPIのような周辺モジュールとの間で転送を起動する。
  • チャンネル当たり2つのアドレス・ポインタ/カウンタがダブル・バッファリングを可能にする。



19.2 Overview
Peripheral DMAコントローラ(PDCA)はチップの上のUSART、SPI、SSCなどの周辺モジュールとチップ内外のメモリの間でデータを転送する。PDCAの使用はデータ転送のためにCPUの介入を避け、マイクロコントローラの性能を改善する。PDCAはメモリから周辺機器へ、あるいは周辺機器からメモリへデータを転送することが出来る。
PDCAは多くのDMAチャネルから成り立つ。各チャンネルは以下を持つ。

  • 32bitメモリ・ポインタ
  • 16bit転送カウンタ
  • 32bitメモリ・ポインタ・リロード値
  • 16bit転送カウンタ・リロード値

PDCAは多くのハンドシェーク・インタフェースを通じて周辺モジュールと通信する。周辺モジュールが受信あるいは送信データの準備ができているとき、周辺モジュールはPDCAに合図する。転送が始まったときPDCAは要求に応答する。
ハンドシェーク・インタフェースの数はDMAチャネルの数より大きいかもしれない。
送信バッファが空のとき、あるいは受信バッファが満杯のとき、割込要求が送られる(訳注:割込要求元はPDCA。ここでバッファとは周辺モジュールのではなく、メモリ側である)。



19.3 Block Diagram
訳注:ブロック図はドキュメントを参照。この図と「3. Blockdiagram」の全体ブロック図を見比べると以下のことが解る。

  • 「PERIPHERAL DMA CONTROLLER」から各周辺モジュールにのびる網掛けの太線は「Handshake interfaces」であり、別のバスがある訳ではない。データの転送は白抜き矢印の「PB(Peripheral Bus)」で実施される。
  • 全体ブロック図では周辺モジュールに「PDC」という思わせぶりなブロックがあるが、大したものではないようだ。決してバス・マスターが各周辺モジュールに付いている訳ではない。
  • 両図には矛盾がある。PDCAのブロック図ではPDCAがPBに直結している。一方、全体ブロック図では直結していない。HMatrix(Bus Matrix)において、PDCAはマスターで、HSB-PB BRIDGE A(HSB to PB Bridge)はスレーブであり、Figure 9-1の通り接続している。従ってPDCAはHMatrix→HSB to PB Bridge経由で周辺モジュールにアクセスすると考えられる(モジュール単体の仕様ではPBに接続可能なのかもしれない)。



19.4 Functional Description


19.4.1 Configuration
PDCAの各チャンネルは1セットの構成レジスタがある。これらには共通してMAR(Memory Address Register)、PSR(Peripheral Select Register)、およびTCR(Transfer Counter Register)がある。32ビットのMemory Address Registerはメモリ・バッファの開始アドレスをプログラムしなければならない。各転送後、メモリの次の位置を示すために自動的レジスタは更新される。目的とする周辺モジュール/ハンドシェイク・インタフェースが選択されるようにPeripheral Select Registerをプログラムしなければならない。Transfer Counter Registerは、転送されるデータ項目数を決める。カウンタは転送されたデータ項目毎に1つ減少する。
転送の進捗をチェックするため、Memory Address RegisterとTransfer Counter Registerの両方をいつでも読むことができる。
また、各チャンネルには、Memory Address RegisterとTransfer Counter Registerのためのリロード・レジスタがあります。TCRがゼロに達するとき、リロード・レジスタの値はMARとTCRにロードされる。このように、PDCAは各チャンネルあたり2つのバッファを作動させることができます。

19.4.2 Memory Pointer
各チャンネルは32bitのMemory Pointer Register(MAR)(訳注:「Pointer」は「Address」の誤記)を持っている。このレジスタは、次の転送を実行するメモリ・アドレスを保持する。各転送の後に自動的に本レジスタは更新される。アドレスはDMA転送サイズ(バイト、ハーフ・ワードまたはワード)に依存する1、2または4と増加する。転送の間、Memory Address Registerをいつでも読むことができる。

19.4.3 Transfer Counter
各チャンネルは16bitのTransfer Counter Register(TCR)を持っている。本レジスタに転送数をプログラムしなければならない。TCRは転送サイズにかかわらず転送すべきデータ項目数を格納する。転送残数を確認するため、転送中にTransfer Counter Registerをいつでも読むことができる。

19.4.4 Reload Registers
Memory Address RegisterとTransfer Counter Registerの両レジスタには、それぞれリロード・レジスタのMemory Address Reload Register(MARR)、およびTransfer Counter Reload Register(TCRR)がある。これらのレジスタPDCAが各チャンネルあたり2つのメモリ・バッファ動作の可能性を提供する。1つのバッファが完了したとき、値がMARRとTCRRにある値で、MARとTCRはリロードされる。TCRRが非ゼロの値を保持する間、もしTCRがゼロに達すると、リロード・ロジックはいつも有効とされトリガするだろう。(訳注:TCRRがゼロならリロードされない)

19.4.5 Peripheral Selection
Peripheral Select Register(PSR)は、どの周辺モジュールがPDCAチャンネルに接続されるか決定する。PSRの設定は転送方向(メモリから周辺モジュールへ、あるいは周辺モジュールからメモリ)と、ハンドシェイク・インタフェースの使用、そして周辺モジュールのアドレス保持レジスタを選択することを命ずる。

19.4.6 Transfer Size
転送サイズは個別に各チャンネルへバイト、ハーフ・ワードかワード(それぞれ 8bit,16bitまたは32bit)のいずれかを設定できる。転送サイズは、Mode Register(MR)のSIZEフィールドをプログラムすることによって設定される。

19.4.7 Enabling and Disabling
各DMAチャネルは、Control Register(CR)に'1'を書くことによりTransfer Enableビット(TEN)に可能にされて、'1'を書くことによって、Transfer Disableビット(TDIS)に無効にされる。