Embedded 如何设置外部ADC的寄存器
我不熟悉微控制器,我正在尝试读取外部值。最初,我必须设置ADC寄存器。我使用通信读取ADC值。我正在使用ADC。我已经检查了一些未配置的寄存器。要在ADC AD7798中配置寄存器,我必须使用通信寄存器来选择要配置的寄存器。例如,我想设置AD7798的配置寄存器(16位)。我是这样写的:Embedded 如何设置外部ADC的寄存器,embedded,microcontroller,avr,Embedded,Microcontroller,Avr,我不熟悉微控制器,我正在尝试读取外部值。最初,我必须设置ADC寄存器。我使用通信读取ADC值。我正在使用ADC。我已经检查了一些未配置的寄存器。要在ADC AD7798中配置寄存器,我必须使用通信寄存器来选择要配置的寄存器。例如,我想设置AD7798的配置寄存器(16位)。我是这样写的: #include <io.h> #define ADC_CS PORTB.3 #define WG_CS PORTB.4 #define MOSI PORTB.5 #define MI
#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;
}
#包括
#定义ADC_CS端口B.3
#定义WG_CS端口B.4
#定义MOSI端口B.5
#定义味噌酱B.6
#定义MISO_引脚B.6
#定义SCK端口B.7
//全球职能。
无符号整数adcConfig;
无符号整数adcMode;
无符号整数adcId;
无效初始io(无效)
{
DDRB=0xBF;//使SCK、MOSI、CS1、CS2输出
ADC_CS=1;//禁用ADC
WG_CS=1;//禁用WaveGenerator
味噌_PU=1;//启用味噌上拉,以便我们可以测试!RDY
}
无符号字符spi(无符号字符数据)
{
//启动传输
SPDR=数据;
//等待传输完成
而(!(SPSR&(1
spi(0x07)如果我的假设是正确的:
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()
函数进行读写。您有关于此的文档链接吗?好的,那么请建议我如何设置ADC配置寄存器读取寄存器时,下面的代码(如公告所示)毫无意义:ReadAdConfReg();printf(“configreg:%d”,adcConfig);
-adcConfig
是ReadAdConfReg()
的本地变量。因此,要么此代码无法编译,要么您正在打印与ReadAdConfReg()中的变量无关的adcConfig
变量
。另外,首先让寄存器的读数正常工作-它的上电重置为0x0710
。在重置后可以读取该值之前,您不必太担心写入寄存器。@MichaelBurr我已将adcConfig声明为全局变量。很抱歉发布了错误的帖子。您能在SPI行上放置一个范围或逻辑分析器吗知道信号对代码的实际反应总是很好的。例如SPI时钟的极性和相位是否正确?我没有看到示波器图像的任何更新。
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);
}