Не работает ADC LPC2478 -- при попытке опросить канал выдаёт набор чисел типа 512,896,960,512.....,
не зависящий от выбора канала и значения PINSEL. Привожу код инициализации(укороченный из Keil-
овского примера, перепроверен по даташиту дважды ...
Код
#include "LPC23xx.h" /* LPC23xx definitions */
#include "type.h"
#include "adc.h"
volatile DWORD ADC0Value[ADC_NUM];
volatile DWORD ADC0IntDone = 0;
/*****************************************************************************
** Function name: ADCInit
**
** Descriptions: initialize ADC channel
**
** parameters: ADC clock rate
** Returned value: true or false
**
*****************************************************************************/
ADC_INIT( DWORD ADC_Clk )
{
/* Enable CLOCK into ADC controller */
PCONP |= (1 << 12);
AD0CR = ( 0x01 << 0 ) | /* SEL=1,select channel 0~7 on ADC0 */
( ( 18000000 / ADC_Clk - 1 ) << 8 ) | /* CLKDIV = Fpclk / 1000000 - 1 */
( 0 << 16 ) | /* BURST = 0, no BURST, software controlled */
( 0 << 17 ) | /* CLKS = 0, 11 clocks/10 bits */
( 1 << 21 ) | /* PDN = 1, normal operation */
( 0 << 22 ) | /* TEST1:0 = 00 */
( 0 << 24 ) | /* START = 0 A/D conversion stops */
( 0 << 27 ); /* EDGE = 0 (CAP/MAT singal falling,trigger A/D conversion) */
}
/*****************************************************************************
** Function name: ADC0Read
**
** Descriptions: Read ADC0 channel
**
** parameters: Channel number
** Returned value: Value read, if interrupt driven, return channel #
**
*****************************************************************************/
DWORD ADC_READ( BYTE channelNum )
{
DWORD regVal, ADC_Data;
/* channel number is 0 through 7 */
if ( channelNum >= ADC_NUM )
{
channelNum = 0; /* reset channel number to 0 */
}
AD0CR &= 0xFFFFFF00;
AD0CR |= (1 << 24) | (1 << channelNum);
/* switch channel,start A/D convert */
while ( 1 ) /* wait until end of A/D convert */
{
regVal = *(volatile unsigned long *)(AD0_BASE_ADDR
+ ADC_OFFSET + ADC_INDEX * channelNum);
/* read result of A/D conversion */
if ( regVal & ADC_DONE )
{
break;
}
}
AD0CR &= 0xF8FFFFFF; /* stop ADC now */
ADC_Data = ( regVal >> 6 ) & 0x3FF;
return ( ADC_Data ); /* return A/D conversion value */
}
Тоже присоединяю в архиве вместе с adc.h .
Неужели спалил ADC, или я чего-то не заметил в коде,
кстати PINSEL выбирается в основной программе.
Прикрепленные файлы
200809.ZIP ( 1.59 килобайт )
Кол-во скачиваний: 14