Soy nuevo en los microcontroladores: estoy tratando de leer los valores ADC externos de un AD7798 ADC utilizando la comunicación SPI.
Inicialmente tengo que configurar algunos registros ADC, algunos registros no están configurados. Para configurar los registros, tengo que usar el registro de comunicación para seleccionar qué registro quiero configurar.
Por ejemplo, quiero establecer el registro de configuración AD7798 (16 bits). Tengo un código como este: #incluir #define PORTB.3 ADC_CS #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;
}
//Sets the waveform generator output to given phase
void SetWGPhase(unsigned int phase)
{
SPCR = 0x5A; // mode #2 F_CPU/64
WG_CS = 0; // enable
spi(0x20);
spi(0x00);
spi((phase >> 8) | 0xC0); //Load into phase register 0
spi(phase & 0x00FF);
WG_CS = 1;
}
void setupAd(){
SPCR = 0x5D;
ADC_CS = 0;
// while(spi(0x10) != 0x10);
spi(0x10); //set up communication register for configuration reg.
spi(0x07);
spi(0x10);
spi(0x08); //set up communication register for mode reg.
spi(0x00);
spi(0x0A);
ADC_CS = 1;
}
unsigned int ReadAd(void)
{
unsigned int data;
SPCR = 0x5D; // mode #3 F_CPU/16
CheckStatus();
ADC_CS = 0; // enable
while (MISO_PIN != 0) ; // wait for DOUT/!RDY line to go low
//Read data
spi(0x58); //Place readinstruction in communication register
data = spi(0xFF); // read hi-byte
data = (data << 8) | spi(0xFF); // and lo-byte.
ADC_CS = 1; // disable
return data;
}
unsigned char CheckStatus(void)
{
char adcStatus;
SPCR = 0x5D;
ADC_CS = 0; // enable
while(ADC_CS_PIN);
adcStatus = 0xFF;
while(!(adcStatus & 0x80)){
spi(0x40);
adcStatus = spi(0xFF);
}
ADC_CS = 1;
return adcStatus;
}
unsigned int ReadAdConfReg(void)
{
unsigned int retvalconfig;
SPCR = 0x5D;
ADC_CS = 0;
while (MISO_PIN != 0) ;
spi(0x50);
adcConfig = spi(0xFF);
adcConfig = (adcConfig << 8) | spi(0xFF);
retvalconfig= adcConfig;
ADC_CS = 1;
return retvalconfig;
}
unsigned int ReadAdModeReg(void)
{
unsigned retvalmode;
SPCR = 0x5D;
ADC_CS = 0;
while (MISO_PIN != 0) ;
spi(0x48);
adcMode = spi(0xFF);
adcMode = (adcMode << 8) | spi(0xFF);
retvalmode =adcMode;
ADC_CS = 1;
return retvalmode;
}
unsigned int ReadAdIdReg(void)
{
SPCR = 0x5D;
ADC_CS = 0;
while (MISO_PIN != 0) ;
spi(0x60);
adcId = spi(0xFF);
ADC_CS = 1;
return adcId;
}
cuando imprimo el registro de configuración está dando valor "16383". pero cuando apago / enciendo el objetivo obtengo "1808 (que es equivalente a 0x0710)" después de eso, está dando el mismo valor que "16383". También he probado con diferentes configuraciones pero no está cambiando, siempre imprimiendo "16383" excepto el apagado / encendido. Creo que el valor predeterminado.
Incluso con el registro de modo siempre se está imprimiendo "10 (que es equivalente a 0x000A)" pero ese es el valor que obtengo siempre, incluso si cambio la configuración a "0x0022".
Incluso he intentado leer el registro de identificación, pero está dando "0x48". pero en la hoja de datos mencionó "0xX8" para AD7798. Gracias de antemano.
Alguien que me ayude, por favor, no tengo idea de qué error estoy cometiendo aquí.