大家好,请问谁在做实验时用过ADC0809呀?怎么我按照adc0809的时序要求设置了各控制信号,但转换完成信号eoc不伦在任何时候都是"0",不会变成"1",这是哪里出了错呢?
程序如下:
#include "alt_types.h"
#include <stdio.h>
#include <unistd.h>
#include "system.h"
#include "altera_avalon_pio_regs.h"
/* adc0809 ad_a select*/
void ad_a_select(int ad8switch) //选择8路模拟信号中的一路
{
switch(ad8switch)
{
case 0x80: //IN7
IOWR_ALTERA_AVALON_PIO_DATA(AD_A_PIO_BASE,0x7);
break;
case 0x40: //IN6
IOWR_ALTERA_AVALON_PIO_DATA(AD_A_PIO_BASE,0x6);
break;
case 0x20: //IN5
IOWR_ALTERA_AVALON_PIO_DATA(AD_A_PIO_BASE,0x5);
break;
case 0x10: //IN4
IOWR_ALTERA_AVALON_PIO_DATA(AD_A_PIO_BASE,0x4);
break;
case 0x08: //IN3
IOWR_ALTERA_AVALON_PIO_DATA(AD_A_PIO_BASE,0x3);
break;
case 0x04: //IN2
IOWR_ALTERA_AVALON_PIO_DATA(AD_A_PIO_BASE,0x2);
break;
case 0x02: //IN1
IOWR_ALTERA_AVALON_PIO_DATA(AD_A_PIO_BASE,0x1);
break;
case 0x01: //IN0
IOWR_ALTERA_AVALON_PIO_DATA(AD_A_PIO_BASE,0x0);
break;
default: //warning
printf("======warning======\n");
break;
}
}
/* start adc0809*/
void ad_start(void) //adc0809转换程序
{
int ad8s;
//test the value of EOC: the value must be "1"
printf("eoc_un ?=1: %d\n",IORD_ALTERA_AVALON_PIO_DATA(AD_EOC_PIO_BASE));
//set ad_start=0
IOWR_ALTERA_AVALON_PIO_DATA(AD_START_PIO_BASE,0);
//set ad_ale=0
IOWR_ALTERA_AVALON_PIO_DATA(AD_ALE_PIO_BASE,0);
//set ad_oe=0
IOWR_ALTERA_AVALON_PIO_DATA(AD_OE_PIO_BASE,0);
//test the value of EOC: the value must be "1"
printf("eoc_in ?=1: %d\n",IORD_ALTERA_AVALON_PIO_DATA(AD_EOC_PIO_BASE));
//get the value of AD_8SWITCH_PIO
ad8s = IORD_ALTERA_AVALON_PIO_DATA(AD_8SWITCH_PIO_BASE);
//set IN0~IN7
ad_a_select(ad8s,flag2);
//set ad_ale=1
IOWR_ALTERA_AVALON_PIO_DATA(AD_ALE_PIO_BASE,1); //save the address into the flip-latch of address
//set ad_ale=0
IOWR_ALTERA_AVALON_PIO_DATA(AD_ALE_PIO_BASE,0);
//set ad_start=1
IOWR_ALTERA_AVALON_PIO_DATA(AD_START_PIO_BASE,1); //reset the register
//set ad_start=0
IOWR_ALTERA_AVALON_PIO_DATA(AD_START_PIO_BASE,0); //start AtoD
//test the value of EOC: the value must be "0"
printf("eoc_t ?=0: %d\n",IORD_ALTERA_AVALON_PIO_DATA(AD_EOC_PIO_BASE));
while((IORD_ALTERA_AVALON_PIO_DATA(AD_EOC_PIO_BASE))!= 1)
// whether the conversion of ADC is over:1 is over and the data have been saved into the flip-latch
{
printf("test eoc_f ?=1: %d\n",IORD_ALTERA_AVALON_PIO_DATA(AD_EOC_PIO_BASE));
}
//set ad_oe=1
IOWR_ALTERA_AVALON_PIO_DATA(AD_OE_PIO_BASE,1); //put the data to the dataBus
printf("ad_data is : %d\n",IORD_ALTERA_AVALON_PIO_DATA(AD_DATA_PIO_BASE));
printf("\n=============AtoD is successful!=================\n");
}
int main(void)
{
while(1)
{
ad_start();
}
}
但是调试过程中eoc总是为0,不知道是哪里出了错,请大家指点,谢谢
[此贴子已经被作者于2007-3-8 20:38:13编辑过]
对0809的时序操作比较简单,可以在0809的datasheet上找到。
你的程序的输出时序和你想要的时序有没有不同, 你可以单步调试,然后通过FPGA的led灯或其他电路作为你的关心的时序信号指示灯来调试。看看输出的时序和你想要的时序有什么不同,然后看看是你nios的设置或设计的问题还是别的其它问题。
[此贴子已经被作者于2007-3-8 23:06:56编辑过]
这是调试的问题,你的调试方法很重要。
软件谁都会写,除了问题,找到问题的方法很重要,比问题本身重要的多。
你用vhdl编写的应该是从设备,一般不可能对系统生成的寄存器进行访问,除非你做一个dma设备可以访问某些地址。
谢谢前辈们的指点,我明天再去实验室试试,希望可以找到问题的所在^^
程序中
printf("eoc_in ?=1: %d\n",IORD_ALTERA_AVALON_PIO_DATA(AD_EOC_PIO_BASE);请问这句有什么意义?做什么用的啊?试否是做测试?
//set IN0~IN7
ad_a_select(ad8s,flag2);
这是是定义了一个吗?怎么还有一个啊?
//get the value of AD_8SWITCH_PIO
ad8s = IORD_ALTERA_AVALON_PIO_DATA(AD_8SWITCH_PIO_BASE);中的AD_8SWITCH_PIO_BASE 是什么意思啊? 是怎么来的?接到哪的啊??
希望斑竹和各位高人解释下,还有问这个问题的姐姐能告诉我一下,不胜感激~!!!!
已经回答。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |