S3C6410裸机电阻屏驱动
扫描二维码
随时随地手机看文章
使用的是RVDS4.0编译的
大家主要是看看如何配置模式的
我之前一直使用自动X,Y采样,但是读取的都不准,最后采样分离的,才可以,需要注意的是使能ADC读开始后需要先读转换结果寄存器,但是此时读取的是上一次的转换结果,如果是连续读取需要等待转换完成,否则转换结果不准.
adc.c
/*************************************************************************************************************
*文件名:ADC.c
*功能:S3C6410ADC底层驱动函数
*作者:cp1300@139.com
*创建时间:2012年3月12日21:05
*最后修改时间:2012年3月12日
*详细:触摸屏驱动以及相关ADC驱动
*问题:一直以来存在一个误区,一直以为使用了启动开始读操作,每次读DAT寄存器后就可以读取到转换后的数据,最终发现使用这个后读到的是上一次的数据,
*还是需要等到转换完成,否则连续转换的时候数据会非常乱.
*现在使用的是手动控制转换开始
*************************************************************************************************************/
#include"system.h"
#include"ADC.h"
//ADC的控制寄存器ADCCON
#defineADCCON_RESSEL_12BIT(1<<16)//12bit模式
#defineADCCON_ECFLG(0<<15)//A/D转换结束标志只读;
#defineADCCON_PRSCEN(1<<14)//A/D转换器预分频器使能
#defineADCCON_PRSCVL(32<<6)//预分频值,1-255,分频值+1,至少为PCLK的1/5,此时PCLK=66MHZ,在2.5MHZ时钟下转换最快
#defineADCCON_SEL_MUX(0<<3)//默认选择通道0
#defineADCCON_STDBM(0<<2)//正常模式
#defineADCCON_READ_START(0<<1)//关闭启动开始读操作
#defineADCCON_ENABLE_START(0<<0)//如果READ_START启用,这个值是无效的。
//ADCDLY
#defineADCDLY_DELAY500//自动采样延时时间,
/*************************************************************************************************************************
*函数:voidSetADC_Channel(u8ch)
*功能:设置ADC输入通道
*参数:ch:通道号,0-7
*返回:无
*依赖:底层宏定义
*作者:cp1300@139.com
*时间:20120513
*最后修改时间:20120513
*说明:ADC输入通道选择
*************************************************************************************************************************/
voidSetADC_Channel(u8ch)
{
ADC->CON&=~(7<<3);//清除通道
ADC->CON|=ch&(0x07);//设置通道号
}
/*************************************************************************************************************************
*函数:voidADC_Init(void)
*功能:ADC初始始化
*参数:无
*返回:无
*依赖:底层宏定义
*作者: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;//设置自动间隔采样时间
}
/*************************************************************************************************************************
*函数:voidADC_SetMode(u8Mode)
*功能:设置ADC模式
*参数:无
*返回:无
*依赖:底层宏定义
*作者:cp1300@139.com
*时间:20120313
*最后修改时间:20120313
*说明:设置ADC模式
*************************************************************************************************************************/
voidADC_SetMode(u8Mode)
{
ADC->TSC&=(1<<8);//清除原先设置
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