主题 : mini2440 ADC 裸机程序问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 85742
精华: 0
发帖: 25
金钱: 125 两
威望: 25 点
综合积分: 50 分
注册时间: 2013-01-08
最后登录: 2014-02-26
楼主  发表于: 2014-01-13 20:33

 mini2440 ADC 裸机程序问题

在学习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
}

麻烦大家看看哪里出错了,都纠结一个月了,先谢谢了……