使用的是RVDS4.0編譯的
大家主要是看看如何配置模式的
我之前一直使用自動X,Y采樣,但是讀取的都不準,最后采樣分離的,才可以,需要注意的是使能ADC讀開始后需要先讀轉(zhuǎn)換結(jié)果寄存器,但是此時讀取的是上一次的轉(zhuǎn)換結(jié)果,如果是連續(xù)讀取需要等待轉(zhuǎn)換完成,否則轉(zhuǎn)換結(jié)果不準.
adc.c
/*************************************************************************************************************
*文件名:ADC.c
*功能:S3C6410ADC底層驅(qū)動函數(shù)
*作者:cp1300@139.com
*創(chuàng)建時間:2012年3月12日21:05
*最后修改時間:2012年3月12日
*詳細:觸摸屏驅(qū)動以及相關(guān)ADC驅(qū)動
*問題:一直以來存在一個誤區(qū),一直以為使用了啟動開始讀操作,每次讀DAT寄存器后就可以讀取到轉(zhuǎn)換后的數(shù)據(jù),最終發(fā)現(xiàn)使用這個后讀到的是上一次的數(shù)據(jù),
*還是需要等到轉(zhuǎn)換完成,否則連續(xù)轉(zhuǎn)換的時候數(shù)據(jù)會非常亂.
*現(xiàn)在使用的是手動控制轉(zhuǎn)換開始
*************************************************************************************************************/
#include"system.h"
#include"ADC.h"
//ADC的控制寄存器ADCCON
#defineADCCON_RESSEL_12BIT(1<<16)//12bit模式
#defineADCCON_ECFLG(0<<15)//A/D轉(zhuǎn)換結(jié)束標志只讀;
#defineADCCON_PRSCEN(1<<14)//A/D轉(zhuǎn)換器預(yù)分頻器使能
#defineADCCON_PRSCVL(32<<6)//預(yù)分頻值,1-255,分頻值+1,至少為PCLK的1/5,此時PCLK=66MHZ,在2.5MHZ時鐘下轉(zhuǎn)換最快
#defineADCCON_SEL_MUX(0<<3)//默認選擇通道0
#defineADCCON_STDBM(0<<2)//正常模式
#defineADCCON_READ_START(0<<1)//關(guān)閉啟動開始讀操作
#defineADCCON_ENABLE_START(0<<0)//如果READ_START啟用,這個值是無效的。
//ADCDLY
#defineADCDLY_DELAY500//自動采樣延時時間,
/*************************************************************************************************************************
*函數(shù):voidSetADC_Channel(u8ch)
*功能:設(shè)置ADC輸入通道
*參數(shù):ch:通道號,0-7
*返回:無
*依賴:底層宏定義
*作者:cp1300@139.com
*時間:20120513
*最后修改時間:20120513
*說明:ADC輸入通道選擇
*************************************************************************************************************************/
voidSetADC_Channel(u8ch)
{
ADC->CON&=~(7<<3);//清除通道
ADC->CON|=ch&(0x07);//設(shè)置通道號
}
/*************************************************************************************************************************
*函數(shù):voidADC_Init(void)
*功能:ADC初始始化
*參數(shù):無
*返回:無
*依賴:底層宏定義
*作者:cp1300@139.com
*時間:20120312
*最后修改時間:20120313
*說明:ADC初始始化
*************************************************************************************************************************/
voidADC_Init(void)
{
//ADC的控制寄存器配置;12BIT模式
ADC->CON=ADCCON_RESSEL_12BIT+ADCCON_ECFLG+ADCCON_PRSCEN+ADCCON_PRSCVL+ADCCON_SEL_MUX+ADCCON_STDBM+ADCCON_READ_START+ADCCON_ENABLE_START;
ADC->DLY=ADCDLY_DELAY;//設(shè)置自動間隔采樣時間
}
/*************************************************************************************************************************
*函數(shù):voidADC_SetMode(u8Mode)
*功能:設(shè)置ADC模式
*參數(shù):無
*返回:無
*依賴:底層宏定義
*作者:cp1300@139.com
*時間:20120313
*最后修改時間:20120313
*說明:設(shè)置ADC模式
*************************************************************************************************************************/
voidADC_SetMode(u8Mode)
{
ADC->TSC&=(1<<8);//清除原先設(shè)置
ADC->CON&=~BIT2;//退出待機模式
XP_UP_DISABLE();//XP上拉禁止
Normal_ADC_Mode();//普通ADC模式
switch(Mode)
{
caseCOMMON_AD_MODER://普通ADC模式
Normal_ADC_Mode();break;
caseASUNDER_X_MODER://分離的X掃描模式
{
ADCTSC_XP_VDD();
ADCTSC_XM_GND();
ADCTSC_YP_HZ();
ADCTSC_YM_HZ();
X_PosMode();
}break;//XP=外部電源,XM=GND,YP=AIN5,YM=高阻
caseASUNDER_Y_MODER://分離的Y掃描模式
{
ADCTSC_X