-1

マイクロコントローラーは初めてで、外部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」と記載されています。

4

2 に答える 2

1

これ:

spi(0x07)<<8;

間違っているに違いありません。単にspi()関数の戻り値をシフトし、その結果を破棄します。

于 2012-10-10T16:06:43.333 に答える
1

私がそれを仮定するのが正しければ:

  • 関数はspi()SPI インターフェイスに 1 バイトを書き込みます。
  • インターフェイスは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()関数が読み取りと書き込みにどのように使用されているかわかりません。これに関するドキュメントへのリンクはありますか?

于 2012-10-10T16:59:35.670 に答える