如何设置外部ADC的寄存器

时间:2012-10-10 16:04:30

标签: embedded microcontroller avr

我是微控制器的新手,我正在尝试读取外部ADC值。最初我必须设置ADC寄存器。我正在使用SPI通信来读取ADC值。我正在使用AD7798 ADC。我检查过一些未配置的寄存器。要配置ADC AD7798中的寄存器,我必须使用通信寄存器来选择要配置的寄存器。例如,我想设置AD7798的配置寄存器(16位)。我写得像这样:

#include <io.h> 
#define ADC_CS PORTB.3 
#define WG_CS  PORTB.4 
#define MOSI   PORTB.5 
#define MISO_PU PORTB.6 
#define MISO_PIN PINB.6 
#define SCK    PORTB.7 

//global functions.
unsigned int adcConfig;
unsigned int adcMode;
unsigned int adcId;

void init_io(void) 
{ 
DDRB = 0xBF;        // make SCK, MOSI, CS1, CS2 outputs 
ADC_CS = 1;              //disable ADC 
WG_CS = 1;               //disable WaveGenerator 
MISO_PU = 1;             //enable pull-up on MISO so we can test !RDY 
} 

unsigned char spi(unsigned char data) 
{ 
//Start transmision 
SPDR = data; 
//Wait for transmision complete 
while (!(SPSR & (1<<SPIF))); 
return SPDR; 
} 


unsigned int ReadAdIdReg(void) 
{              

SPCR = 0x5D;  
ADC_CS = 0;          
while (MISO_PIN != 0) ; 
spi(0x60); 
adcId = spi(0xFF);    
ADC_CS = 1;
 return adcId; 
} 

当我打印配置寄存器时,它给出值“16383”。但是当我关闭/打开目标时,我得到“1808(相当于0x0710)”之后,它给出与“16383”相同的值。我已经测试了不同的配置,但它没有改变,除了电源关闭/打开外总是打印“16383”。我认为默认值。

即使使用模式寄存器,它也始终打印“10(相当于0x000A)”但这是我总是得到的值,即使我将配置更改为“0x0022”。

即使我尝试读取Id寄存器,但它给出的是“0x48”。但在数据表中,它提到了AD7798的“0xX8”。

2 个答案:

答案 0 :(得分:1)

此:

spi(0x07)<<8;

一定是错的,只是简单地移动spi()函数的返回值,然后抛弃该结果。

答案 1 :(得分:1)

如果我认为这是正确的:

  • spi()函数在SPI接口上写入单个字节
  • 界面首先是MSB

然后你不需要左移...

 void setupADC(unsigned char configReg){
     ChipSelectAd(1);  
     spi(0x10);        // register address (including R/Wb bit?)
     spi(0x07);        // data MSB
     spi(0x10);        // data LSB
     spi(configReg);  
     ChipSelectAd(0);  
}

我不确定spi()函数如何用于读写。你有关于此文件的任何链接吗?