ADUC7061的ADC采集不到数据

我前几天发过一个类似的问题,有个ADI的技术支持回复了一下,但回复是不正确的。 如果ADI的技术支持没有正确的把握,请不要随意回复,免得误导。谢谢理解。

ADUC7061是有些问题的,比如通过JLINK调试,STEP BY STEP模式下,读取的ADC1DAT数据是16位而不是24位,如果改用某个特定版本的ULINK,则可以显示24位。这个是仿真调试工具和芯片接口上出了问题。但无论如何,归类为BUG是没有问题的。我不想讨论这个细节,我只是说ADUC7061其实也有很多BUG。不要全部归责到用户使用是否熟悉上。

ADC1可以采集通道1~9,1~5是专用通道,6~9是和SPI、I2C复用的。

用ADC去采集1~5通道的数据,是没有问题的。这个确实也是比较简单的。

但我用同样的代码去采集ADC8通道,就问题大了。

当然,会把芯片脚的复用功能切换到模拟上,即把初始的GPIO功能改到模拟输入。然后读取ADC值。

按DATAHEET操作,不行。

我的板子是ADC4和ADC8连接在一起的,ADC5接地AGND,单端模式,读ADC4没有问题,正确且正常,但读ADC8的数据,读到的值在0x5fexx~0x607xx之间变化,换个芯片,也是这样。

我个人认为,ADI芯片的配置代码,可能存在一些BUG,导致配置可能需要特定的顺序或者特定的要求,理解为BUG的意思是:至少DATASHEET里没有说明,用户无法猜测到。

通道4~通道8的差别是这样的。就一句差别:

ADC1CON = 0x8004 | 0x0480;//ch 8
//ADC1CON = 0x800c | 0x0300;//ch 4

端口的配置是这样的:

GP0CON0 = 0x00000000; //p0.0~p0.4 gpio
GP0PAR = 0x0f; //01110
GP0DAT = 0x10100000;

GP0KEY1 = 0x7;
GP0CON1 = 0x1; // adc
GP0KEY2 = 0x13;

我还试过,GP0CON1 修改后再配置GP0复用,以测试是否有顺序要求,但效果不对。

为了检测芯片脚是否短路,我使用过ADC8复用的SPI功能,SPI用来驱动显示屏,工作正常(测ADC8的时候,显示屏当然会取下)。

这个简单的功能,验证了好几天,实在想不到有什么遗漏的地方可以测试,只能归结为芯片BUG。

看看有没有哪位师傅,有兴趣帮一下。谢谢

(注:这个芯片用五六年了,不会有低级错误,估计是芯片BUG,我以前处理过好几BUG,就这个芯片的)

附代码:

#include "ResGf.h"
int main()
{
volatile signed long s;
signed char N = -1;
char Err = 0;
float fN = 0;

PLLKEY1 = 0xaa;
PLLCON = 0x00;
PLLKEY2 = 0x55;

POWKEY1 = 0x1;
POWCON0 = 0x38; // Set core to max CPU speed of 10.24Mhz
POWKEY2 = 0xF4;

POWKEY3 = 0x76;
POWCON1 = 0x024;
POWKEY4 = 0xB1;

DACCON = 0x0013;
DACDAT = 0x04ff0000;


while(1)
{

ADCCFG = 0x84;
ADCFLT = 0x8083;

GP0CON0 = 0x00000000; //p0.0~p0.4 gpio
GP0PAR = 0x0f; //01110
GP0DAT = 0x10100000;

GP0KEY1 = 0x7;
GP0CON1 = 0x1; // adc
GP0KEY2 = 0x13;

ADC0CON = 0;
ADC1CON = 0x878c;;

s = ADCSTA;
s = ADC0DAT;
s = ADC1DAT;
//////////
ADCMDE = 0x83;
////
ADC1CON = 0x8004 | 0x0480;//ch 8
//ADC1CON = 0x800c | 0x0300;//ch 4

s = ADC1DAT;
s = ADCSTA;
ADCMDE = 0x82;
do
{
s = ADCSTA;
if (s & 0x2000) //adc1cerr
{
Err |= 1; //over range
}
} while(!(s & 0x2));

s = ADC1DAT;
ADCMDE = 0x83;

//3. exit adc
ADCMDE = 0x83; //idle
ADCFLT = 0x80ff;
ADC1CON = 0x78c; //internally shorted

GP0CON0 = 0x00001011; //back to spi
GP0PAR = 0x04;
GP0DAT = 0x10100000;

GP0KEY1 = 0x7;
GP0CON1 = 0x0; // exit adc
GP0KEY2 = 0x13;
}
}