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)に無効にされる。