📄 adc.c
字号:
**
** pRsv --保留指针参数,可输入NULL.
** Output parameters: OPERATE_FAIL -- 操作失败
** Returned value: OPERATE_SUCCESS -- 操作成功
**
** Using example : char *pcArg = "Chn=1 ADCClk=100000"; adcInit(0,pcArg,NULL);
** Notice: 设备操作失败的原因是输入不正确的设备号.
** 本API函数的参数是在FPCLK=11059200Hz的频率下设置的
**********************************************************************************************************/
uint32 adcInit (uint32 uiID,
char *pcArg,
void *pRsv)
{
static uint32 uiParam[7]={1,0,0,0,1,1,1};
if ((uiID >= __ADC_MAX_NUM) | (pcArg == NULL)) { /* 检查参数有效性 */
return (uint32)(OPERATE_FAIL);
}
pRsv = pRsv ; /* 为了防止编译器警告 */
ImpCmd(Tab_ADC, pcArg, uiParam); /* 解析字符串参数 */
/*
* 过滤输入字符参数
*/
if ((uiParam[Chn] > 0xFF) || (uiParam[Chn] == 0)){
uiParam[Chn] &= 0x01; /* 默认输入通道号为0,即值等于1 */
}
if (uiParam[ADCClk] > 4500000) {
uiParam[ADCClk] = 4500000;
}
if (uiParam[Burst] > 0x01) {
uiParam[Burst] = 0x00;
}
if (uiParam[Precision] > 10 || uiParam[Precision] < 3) {
uiParam[Precision] = 10;
}
if (uiParam[PowerDown] > 0x01) {
uiParam[PowerDown] = 0x01;
}
if (uiParam[Start] > 0x07) {
uiParam[Start] = 0x01;
}
if (uiParam[Edge] > 0x01) {
uiParam[Edge] = 0x01;
}
/*
* 初始化结构体,给设备套上一层参数壳.
*/
return (__adcInit(uiID,uiParam,NULL));
}
/*********************************************************************************************************
** Function name: adcSetMode
**
** Descriptions: 参数设置函数,解释用户的字符串命令,并对ADC进行设置及设置中断
** input parameters: uiID --部件设备号 :0-ADC0;1-ADC1
** pcArg --字符串输入指针参数,输入参数格式为:关键字0=值0[空格]关键字1=值1[空格]......
** 关键字: Chn: 可选择范围从 1~8;
** ADCClk: <= 4.5MHZ,输入范围:0~4500000;
** Burst : 0 -软件控制模式,1 -硬件控制模式
** Precision:可输入范围:3~10
** PowerDown:可选择:0 -掉电模式, 1 -ADC处于正常工作模式
** Start: 启动控制选择. 根据手册数据,可选择范围:0~7
** Edge: 启动触发信号的边沿选择. 0 -下降沿, 1 -上升沿转换.
**
** pRsv --保留指针参数,可输入NULL.
** Output parameters: OPERATE_FAIL -- 操作失败
** Returned value: OPERATE_SUCCESS -- 操作成功
**
** Using example : char *pcArg = "Chn=1 ADCClk=100000"; adcSetMode(0,pcArg,NULL);
** Notice: 1.设备操作失败的原因是输入不正确的设备号.
** 2.本API函数的参数是在FPCLK=11059200Hz的频率下设置的
** 3.不允许在ADC工作忙状态下对ADC进行模式设置,否则直接返回错误.
*********************************************************************************************************/
uint32 adcSetMode (uint32 uiID,
char *pcArg,
void *pRsv)
{
static uint32 uiParam[7]={1,0,0,0,1,1,1};
if ((uiID >= __ADC_MAX_NUM) | (pcArg == NULL)) { /* 检查参数有效性 */
return (uint32)(OPERATE_FAIL);
}
pRsv = pRsv ; /* 为了防止编译器警告 */
if (__GpADCInfoData[uiID]->uiAdcState == ADC_BUSY) { /* 如此时ADC正忙,处理中断,返回 */
return (uint32)(OPERATE_FAIL);
}
ImpCmd(Tab_ADC, pcArg, uiParam); /* 解析字符串参数 */
/*
* 检查输入字符参数有效性
*/
if ((uiParam[Chn] > 0xFF) ||
(uiParam[ADCClk] > 4500000) ||
(uiParam[Burst] > 0x01) ||
(uiParam[Precision] > 10) ||
(uiParam[Precision] < 3) ||
(uiParam[PowerDown] > 0x01) ||
(uiParam[Start] > 0x07) ||
(uiParam[Edge] > 0x01)) {
return (uint32)(OPERATE_FAIL);
}
/*
* 初始化结构体,给设备套上一层参数壳.
*/
if (uiParam[Chn] == 0) { /* 如果通道号设为0,强制为0x01 */
uiParam[Chn] = 0x01;
}
return (__adcInit(uiID,uiParam,NULL));
}
/*********************************************************************************************************
** Function name: adcGetState
**
** Descriptions: ADC状态获取函数
** Input parameters: uiID 设备号,例如0表示使用ADC0
** uiParmCmd 要读取的参数类型,具体参见ADC.h宏定义
** pRsv 保留指针参数,可输入NULL.
**
** Returned value: 获取状态失败: OPERATE_FAIL. 失败的原因:参数错误.
** 获取状态成功: 根据不同命令获得的值意义不一样
** uiParamCmd = ADC_GET_START, 返回ADC_STOP,ADC_START;
** uiParamCmd = ADC_GET_STARTMODE, 返回ADC_BURST,ADC_SOFE;
** uiParamCmd = ADC_GET_USECHN, 返回通道号数组名;
** uiParamCmd = ADC_GET_DONECHN, 返回已完成转换的通道号数组名;
** uiParamCmd = ADC_GET_STATE, 返回ADC_BUSY,ADC_IDLE,ADC_ERR.
*********************************************************************************************************/
uint32 adcGetState (uint32 uiID,
uint32 uiParamCmd,
char *pRsv)
{
if (uiID >= __ADC_MAX_NUM) { /* 检查参数有效性 */
return (uint32)(OPERATE_FAIL);
}
pRsv = pRsv ; /* 为了防止编译器警告 */
switch (uiParamCmd) {
case ADC_GET_START: /* 启动状态 */
return ((__GpADCInfoData[uiID]->uiStart != FALSE) ? ADC_START : ADC_STOP);
break;
case ADC_GET_STARTMODE: /* 转换模式 */
return ((__GpADCInfoData[uiID]->uiBurst == TRUE) ? ADC_BURST : ADC_SOFE);
break;
case ADC_GET_USECHN:
return (uint32)(__GpADCInfoData[uiID]->ucUseChn); /* 已使用通道 */
break;
case ADC_GET_DONECHN:
return (uint32)(__GpADCInfoData[uiID]->ucDoneFlg); /* 已转换结束通道 */
break;
case ADC_GET_STATE:
return (__GpADCInfoData[uiID]->uiAdcState); /* ADC当前状态 */
break;
default:
{ return (uint32)(OPERATE_FAIL);} /* 返回输入参数错误 */
}
}
/*********************************************************************************************************
** Function name: adcStart
**
** Descriptions: 启动ADC
** input parameters: uiID --部件设备号:0-ADC0
** pRsv --保留指针参数,可输入NULL.
** Output parameters: OPERATE_FAIL -- 操作失败
** Returned value: OPERATE_SUCCESS -- 操作成功
** Notice : 启动之前,必须先进行ADC初始化.
*********************************************************************************************************/
uint32 adcStart (uint32 uiID, void *pRsv)
{
volatile uint32 uiOffsetBase;
volatile uint32 *puiBaseAddr;
if (uiID >= __ADC_MAX_NUM) { /* 检查参数有效性 */
return (uint32)(OPERATE_FAIL);
}
pRsv = pRsv ; /* 为了防止编译器警告 */
IRQDisable(); /* 关IRQ中断 */
uiOffsetBase = __GpADCInfoData[uiID]->uiOffsetBase;
puiBaseAddr = __GpADCInfoData[uiID]->puiAddrBase;
if (__GpADCInfoData[uiID]->uiBurst == TRUE) { /* 硬件控制模式 */
puiBaseAddr[__B_ADC_ADCR << uiOffsetBase] |= (0x01 << 16); /* Burst= 1,立即开始循环扫描 */
puiBaseAddr[__B_ADC_ADCR << uiOffsetBase] &= (~(0x07 << 24)); /* Start= 0,Burst时此位不起作用*/
} else {
puiBaseAddr[__B_ADC_ADCR << uiOffsetBase] |= (__GpADCInfoData[uiID]->uiStart << 24);
/* 软件控制模式,则更新Start位 */
}
IRQEnable(); /* 开IRQ中断 */
return (uint32)(OPERATE_SUCCESS);
}
/*********************************************************************************************************
** Function name: adcStop
**
** Descriptions: 停止ADC
** input parameters: uiID --部件设备号:0-ADC0
**
** Output parameters: OPERATE_FAIL -- 操作失败
** Returned value: OPERATE_SUCCESS -- 操作成功
*********************************************************************************************************/
uint32 adcStop (uint32 uiID)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -