/*************************************************************************************************************
* 文件名: dma.c
* 功能: S3C6410 DMA底層驅動函數
* 作者: [email protected]
* 創建時間: 2013年01月23日21:06
* 最後修改時間:2013年01月23日
* 詳細: DMA控制器底層驅動
*************************************************************************************************************/
#include "system.h"
#include "DMA.h"
/*************************************************************************************************************************
*函數 : void DMA_Init(void)
*功能 : DMA初始化
*參數 : 無
*返回 : 無
*依賴 : 底層
*作者 : [email protected]
*時間 : 20130131
*最後修改時間 : 20130131
*說明 : 無
*************************************************************************************************************************/
void DMA_Init(void)
{
Set_GateClk(HCLK_DMA0, ENABLE);
Set_GateClk(HCLK_DMA1, ENABLE);
}
/*************************************************************************************************************************
*函數 : void DMA_SetConfig(DMA_TypeDef *DMA, DMA_CHX ch, DMA_Config *config)
*功能 : DMA配置
*參數 : DMA:DMA模塊選擇,見DMA_TypeDef;ch:通道選擇,見DMA_CHX;config:配置,見DMA_Config
*返回 : 無
*依賴 : 底層
*作者 : [email protected]
*時間 : 20130131
*最後修改時間 : 20130131
*說明 : 用於設置DMA
*************************************************************************************************************************/
void DMA_SetConfig(DMA_TypeDef *DMA, DMA_CHX ch, DMA_Config *config)
{
DMA_Enable(DMA); //使能DMA模塊
(DMA->CH[ch]).SrcAddr = config->SrcAddr; //設置源地址
(DMA->CH[ch]).DestAddr = config->DestAddr; //設置目標地址
(DMA->CH[ch]).Control0 = 0x80000000 //1<<31 //是否在當前的傳輸完成後產生中斷
| ((config->DestIncrement == ENABLE) ? (1 << 27) : 0) //目標地址自增
| ((config->SrcIncrement == ENABLE) ? (1 << 26) : 0) //源地址自增
| ((config->DestPeripheral == DMA_MEM) ? AHB_M1 : AHB_M2) << 25 //目標AHB主機選擇
| ((config->SrcPeripheral == DMA_MEM) ? AHB_M1 : AHB_M2) << 24 //源AHB主機選擇
| (config->FlowWidth & 0x7) << 21 //目標傳輸寬度
| (config->FlowWidth & 0x7) << 18 //源傳輸寬度
| (config->BurstSize & 0x7) << 15 //目標傳輸脈沖大小,單次傳輸的數量
| (config->BurstSize & 0x7) << 12; //源傳輸脈沖大小,單次傳輸的數量
(DMA->CH[ch]).Control1 = config->DataSize & 0x1ffffff; //傳輸數據數量
(DMA->CH[ch]).Config = (0<<18)// enable DMA requests
| (0<<16) // disables locked transfers
| (1<<15) // Teminal count interrupt enable
| (0<<14) // Interrupt error mask //允許DMA請求
| (((config->SrcPeripheral == DMA_MEM) ? 0 : 1) << 12)
| (((config->DestPeripheral == DMA_MEM) ? 0 : 1) << 11) //傳輸模式,如內存到內存等
| (config->DestPeripheral & 0x0f) << 6 //目標外設
| (config->SrcPeripheral & 0x0f) << 1; //源外設
(DMA->CH[ch]).LLI = config->LLIArrd; //下一個傳輸LLI配置位置
//(DMA->CH[ch]).ConfigExp = 7;
}
/*************************************************************************************************************************
*函數 : void DMA_Enable(DMA_TypeDef *DMA)
*功能 : DMA使能
*參數 : DMA:DMA模塊選擇,見DMA_TypeDef;
*返回 : 無
*依賴 : 底層
*作者 : [email protected]
*時間 : 20130131
*最後修改時間 : 20130131
*說明 : 無
*************************************************************************************************************************/
void DMA_Enable(DMA_TypeDef *DMA)
{
DMA->Config = 0x01; //AHB小端模式,啟動DMA控制器
}
/*************************************************************************************************************************
*函數 : void DMA_Disable(DMA_TypeDef *DMA)
*功能 : DMA關閉
*參數 : DMA:DMA模塊選擇,見DMA_TypeDef;
*返回 : 無
*依賴 : 底層
*作者 : [email protected]
*時間 : 20130131
*最後修改時間 : 20130131
*說明 : 無
*************************************************************************************************************************/
void DMA_Disable(DMA_TypeDef *DMA)
{
DMA->Config = 0x00; //AHB小端模式,關閉DMA控制器
}
/*************************************************************************************************************************
*函數 : void DMA_StartChannels(DMA_TypeDef *DMA, DMA_CHX ch)
*功能 : DMA通道傳輸開始
*參數 : DMA:DMA模塊選擇,見DMA_TypeDef;ch:通道選擇,見DMA_CHX;
*返回 : 無
*依賴 : 底層
*作者 : [email protected]
*時間 : 20130131
*最後修改時間 : 20130131
*說明 : 無
*************************************************************************************************************************/
void DMA_StartChannels(DMA_TypeDef *DMA, DMA_CHX ch)
{
DMA_ClearIntTCStatus(DMA0, ch);
DMA_ClearIntErrorStatus(DMA0, ch);
(DMA->CH[ch]).Config |= 1 << 0; //通道使能
}
/*************************************************************************************************************************
*函數 : void DMA_WaitComplete(DMA_TypeDef *DMA, DMA_CHX ch)
*功能 : 等待傳輸完成
*參數 : DMA:DMA模塊選擇,見DMA_TypeDef;ch:通道選擇,見DMA_CHX;
*返回 : 無
*依賴 : 底層
*作者 : [email protected]
*時間 : 20130131
*最後修改時間 : 20130131
*說明 : 無
*************************************************************************************************************************/
void DMA_WaitComplete(DMA_TypeDef *DMA, DMA_CHX ch)
{
while(!(DMA->RawIntTCStatus & (1 << ch)));
}
/*************************************************************************************************************************
*函數 : void DMA_ClearIntTCStatus(DMA_TypeDef *DMA, DMA_CHX ch)
*功能 : DMA清除DMA傳輸完成中斷狀態
*參數 : DMA:DMA模塊選擇,見DMA_TypeDef;ch:通道選擇,見DMA_CHX;
*返回 : 無
*依賴 : 底層
*作者 : [email protected]
*時間 : 20130131
*最後修改時間 : 20130131
*說明 : 無
*************************************************************************************************************************/
void DMA_ClearIntTCStatus(DMA_TypeDef *DMA, DMA_CHX ch)
{
DMA->IntTcClear |= 1 << ch;
}
/*************************************************************************************************************************
*函數 : void DMA_ClearIntErrorStatus(DMA_TypeDef *DMA, DMA_CHX ch)
*功能 : 清除DMA傳輸錯誤中斷狀態
*參數 : DMA:DMA模塊選擇,見DMA_TypeDef;ch:通道選擇,見DMA_CHX;
*返回 : 無
*依賴 : 底層
*作者 : [email protected]
*時間 : 20130131
*最後修改時間 : 20130131
*說明 : 無
*************************************************************************************************************************/
void DMA_ClearIntErrorStatus(DMA_TypeDef *DMA, DMA_CHX ch)
{
DMA->IntErrClear |= 1 << ch;
}