在学习ADC转换时遇到了奇怪的现象,ADC转换总不结束,附上程序,请求大侠帮助找出原因:
编译环境 mini2440 + Keil MDK5 ,板子用自带的裸机程序测试ADC转换正常。
程序如下:
#define rADCCON (*(volatile unsigned *) 0x05800000)
#define rADCTSC (*(volatile unsigned *) 0x05800004)
#define rADCDLY (*(volatile unsigned *) 0x05800008)
#define rADCDAT0 (*(volatile unsigned *) 0x0580000C)
#define rADCDAT1 (*(volatile unsigned *) 0x05800010)
#define rADCUPDN (*(volatile unsigned *) 0x05800014)
#define rMPLLCON (*(volatile unsigned *) 0x4C000004)
#define rUPLLCON (*(volatile unsigned *) 0x4C000008)
#define rCLKCON (*(volatile unsigned *) 0x4C00000C)
#define rCLKDIVN (*(volatile unsigned *) 0x4C000014)
#define rGPBCON (*(volatile unsigned *)0x56000010)
#define rGPBDAT (*(volatile unsigned *)0x56000014)
#define rGPBUP (*(volatile unsigned *)0x56000018)
void delay(unsigned int a);
void BEEP_init(void);
void BEEP_ing(void);
void ADC_init(void);
void ADC_start(void);
unsigned int ADC_read(void);
void Set_PCLK_50M(void);
int main(void)
{
int value=0;
Set_PCLK_50M();
BEEP_init();
ADC_init();
ADC_start();
while(1)
{
value=ADC_read();//程序停在此处
BEEP_ing(); // 程序不能运行到此处,蜂鸣器不响
if(value)
BEEP_ing();
ADC_start();
}
}
void ADC_init()
{
rADCDLY = 100;
rADCTSC = 0;
rADCCON = (1<<14)|(19<<6)|(0<<3);
}
void ADC_start()
{
rADCCON |= 0x1; //start ADC
}
unsigned int ADC_read()
{
while(rADCCON & 0x1);
while(!(rADCCON & 0x8000)); // 程序卡在这一句
return ( (int)rADCDAT0 & 0x3ff );
}
void delay(unsigned int a)
{
int k;
for(k=0;k<a;k++);
}
void BEEP_init(void)
{
rGPBCON &= ~0x3ffffd;
rGPBCON |= 0x3ffffd;
}
void BEEP_ing(void)
{
while(1)
{
rGPBDAT |= (1<<0);
delay(10000);
rGPBDAT &= ~(1<<0);
delay(10000);
}
}
void Set_PCLK_50M(void)
{
rMPLLCON = 0;
rMPLLCON |= ((0x5c<<12)|(0x01<<4)|(0x02)); // 200Mhz,MPLL = FCLK
rCLKDIVN = 0x03; // FCLK:HCLK:PCLK = 1:2:4 PCLK = 50MHz
}
麻烦大家看看哪里出错了,都纠结一个月了,先谢谢了……