# MI_DmaSend*

## 構文

  `#include <nitro/mi.h>`
  `void MI_DmaSend32( u32 dmaNo,
  const void* src,
  volatile void* dest,
  u32 size );
  `
  `void MI_DmaSend32_SetUp( u32 dmaNo,
  const void* src,
  volatile void* dest,
  u32 size );
  `
  `void MI_DmaSend16( u32 dmaNo,
  const void* src,
  volatile void* dest,
  u32 size );`
  `void MI_DmaSend16_SetUp( u32 dmaNo,
  const void* src,
  volatile void* dest,
  u32 size );`
  `void MI_DmaSend32Async( u32 dmaNo,
  const void* src,
  volatile void* dest,
  u32 size,
  MIDmaCallback callback,
  void* arg );`
  `void MI_DmaSend32Async_SetUp( u32 dmaNo,
  const void* src,
  volatile void* dest,
  u32 size,
  MIDmaCallback callback,
  void* arg );`
  `void MI_DmaSend16Async( u32 dmaNo,
  const void* src,
  volatile void* dest,
  u32 size,
  MIDmaCallback callback,
  void* arg );`
  `void MI_DmaSend16Async_SetUp( u32 dmaNo,
  const void* src,
  volatile void* dest,
  u32 size,
  MIDmaCallback callback,
  void* arg );`

## 引数

dmaNo | 使用DMAチャンネル
src | 転送元アドレス
dest | 転送先アドレス
size | 転送サイズ
callback | DMA終了時のコールバック
arg | DMA終了時のコールバック引数

## 返り値

なし。

## 説明

DMAを用いて同じアドレスにデータを送り込みます。
転送先アドレスを変えず、転送元アドレスだけをインクリメントし、連続領域のデータを次々と同じアドレスに送ります。

`*_SetUp()` は実際にはDMAを行なわず、その設定のみを行います。実際のDMA開始は `MI_DmaRestart()` を呼んで下さい。

`MI_DmaSend16*()` は 16ビット単位で転送します。転送元アドレス、転送先アドレスは2バイトアラインメントする必要があります。
`MI_DmaSend32*()` は 32ビット単位で転送します。転送元アドレス、転送先アドレスは4バイトアラインメントする必要があります。

`MI_DmaSend16()`, `MI_DmaSend32()` はDMAの終了を関数内で待ちます。
`MI_DmaSend16Async()`, `MI_DmaSend32Async()` は、DMA終了時にコールバック callback を呼びます。コールバックは MIDmaCallback 型 ( void* 引数1つを取る void 型関数 ) です。callback は システムのDMA割り込みハンドラ内から呼び出されますので、割り込み禁止状態で呼び出されます。

Async 型の API の機能を引き出すにはその使用法を十分に理解する必要があります。 これについては、`MI_DmaCopy()` を参照してください。

###
DMAコントローラの不具合

`MI_DmaCopy()` のリファレンス中の「DMAコントローラの不具合」を参照してください。

## 内部動作

IOレジスタのDMAnソースレジスタ(0x40000B0 + 12n)、DMAnデスティネーションレジスタ(0x40000B4 + 12n)、DMAnコントロールレジスタ(0x40000B8 + 12n)を使用します。( n は 使用するDMAチャンネルです。)

## 参照

`MI_DmaCopy*, MI_DmaFill*, MI_DmaClear*, MI_DmaRecv*, MI_CpuSend*, MI_DmaRestart
`

## 履歴

2009/11/20 DMAコントローラの不具合について追記
2007/10/31 `_SetUp()` 追加
2005/03/08 用語統一 [割込み] → [割り込み]
2004/12/22 callback の呼び出しについての記述を追加
2004/01/30 初版