【问题标题】:How to set registers of an external ADC如何设置外部 ADC 的寄存器
【发布时间】:2012-10-10 16:04:29
【问题描述】:

我是微控制器新手,我正在尝试读取外部 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”。

【问题讨论】:

  • 读取寄存器时,以下代码(如发布的)没有意义:ReadAdConfReg(); printf("configreg:%d",adcConfig); - adcConfigReadAdConfReg() 的本地代码。因此,要么此代码无法编译,要么您打印出与 ReadAdConfReg() 中的变量无关的 adcConfig 变量。
  • 另外,首先让寄存器的读数正常工作 - 它上电重置为0x0710。在复位后您可以读取该值之前,您不必太担心写入寄存器。
  • @MichaelBurr 我已将 adcConfig 声明为全局变量。抱歉发错了。
  • 你能把示波器或逻辑分析仪放在 SPI 线上吗?知道信号对代码的实际反应总是很高兴。例如SPI时钟极性和相位是否正确?
  • 我没有看到范围图像的任何更新。

标签: embedded microcontroller avr


【解决方案1】:

这个:

spi(0x07)<<8;

一定是错的,它只是移动了spi()函数的返回值,结果被丢弃了。

【讨论】:

  • 好的,请建议我如何设置ADC配置寄存器
【解决方案2】:

如果我的假设是正确的:

  • 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() 函数是如何用于读写的。你有这方面的文档链接吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多