我使用mini2440做AD采样,输入信号是1KHz,预分频值是49,按理说一个周期应该是采样200个点,但是我现在一个周期只有将近40个点,请问下是什么原因?我的驱动程序是用自带的驱动修改的,部分代码如下:
#define PRESCALE_DIS (0 << 14)
#define PRESCALE_EN (1 << 14)
#define PRSCVL(x) ((x) << 6)
#define ADC_INPUT(x) ((x) << 3)
#define ADC_START (1 << 0)
#define ADC_ENDCVT (1 << 15)
#define START_ADC_AIN(ch, prescale) \
do{ \
ADCCON = PRESCALE_EN | PRSCVL(prescale) | ADC_INPUT((ch)) ; \
ADCCON |= ADC_START; \
}while(0)
static irqreturn_t adcdone_int_handler(int irq, void *dev_id)
{
if (OwnADC) {
adc_data = ADCDAT0 & 0x3ff;
ev_adc = 1;
wake_up_interruptible(&adcdev.wait);
}
return IRQ_HANDLED;
}
static ssize_t s3c2410_adc_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)
{
char str[20];
int value;
size_t len;
unsigned short ad_buf[value_count];
memset(ad_buf,0,sizeof(unsigned short) * value_count);
if (down_trylock(&ADC_LOCK) == 0)
{
spin_lock_irq(&ADC_LOCK);
int i = 0;
for (i = 0;i<1000;i++)
{
OwnADC = 1;
START_ADC_AIN(adcdev.channel, adcdev.prescale);
wait_event_interruptible(adcdev.wait, ev_adc);
ev_adc = 0;
ad_buf = adc_data;
OwnADC = 0;
}
spin_unlock_irq(&ADC_LOCK);
up(&ADC_LOCK);
}
else
{
value = -1;
}
copy_to_user(buffer,ad_buf, (sizeof(unsigned short))*value_count);
}
static int s3c2410_adc_open(struct inode *inode, struct file *filp)
{
init_waitqueue_head(&(adcdev.wait));
adcdev.channel=0;
adcdev.prescale=0x31;
DPRINTK( "adc opened\n");
return 0;
}
测试的代码如下:
int main(void)
{
fprintf(stderr, "press Ctrl-C to stop\n");
int fd = open("/dev/adc", 0);
FILE *fp;
int i = 0;
unsigned short buf[1000];
char test[10];
double AdData;
if (fd < 0)
{
perror("open ADC device:");
return 1;
}
for( i = 0;i<1000;i++)
{ printf("ADC Value: %d\n", buf);
AdData = (buf)*2.9/1024;
printf("ADC Value: %10.9f\n",AdData);
}
close(fd);
}