cómo verificar las señales SPI

1

Estoy trabajando con el microcontrolador ATmega32-A. Estoy tratando de leer los valores de ADC (AD7798). Estoy configurando registros ADC como se muestra a continuación. Imágenes también adjuntas.

char spi(char data)
{
    //Start transmision
    SPDR = data;
    //Wait for transmision complete
    while(!(SPSR & 0x80));
    return SPDR;
} 

void setupAd(){
    ADC_CS=0; 
    SPCR = 0x5D;
    spi(0x10);   //set up communication register for configuration reg (16bit).
    spi(0x07);    // sending 07 as MSB     
    spi(0x10);    //sending 10 as LSB 
    ADC_CS=1; 
}

Estoy intentando leer esta configuración de configuración usando esto

void ReadAdConfReg(void)
{              
    SPCR = 0x5D;
    ADC_CS=0;
    spi(0x50);
    adcConfig = spi(0xFF)<<8;
    adcConfig |= spi(0xFF);   
    ADC_CS=1;
}

imprimiendo de esta manera

ReadAdConfReg();
printf("configreg:%d",adcConfig);

Pero mi problema de configuración de ese registor de configuración no estaba funcionando. He comprobado con el osciloscopio cualquier error en la polaridad del reloj y la selección de chip. He adjuntado imágenes como se muestra a continuación.

Por favor, ayúdeme por qué no puedo configurar el registro de configuración. Las polaridades del reloj y el chip seleccionan todo de acuerdo con la hoja de datos de ATmega32-A y la hoja de datos AD7798. por favor ayúdame que error estoy cometiendo o Si quiero verificar la configuración de mi registro de configuración en el osciloscopio, ¿qué debo hacer?

    
pregunta verendra

2 respuestas

1

He cambiado las funciones para leer los registros de 8 bits y 16 bits y luego funcionó.

unsigned int Bit_16(unsigned char cmd, unsigned int value) 
{
    unsigned int data; 
    SPCR = 0x5D;        // mode #3 F_CPU/16 
    ADC_CS = 0;                 // enable 
    spi(cmd);                   //Place instruction in communication register 
    data = spi(value >> 8);     // read hi-byte 
    data = (data << 8) | spi(value);    // and lo-byte. 
    ADC_CS = 1;                 // disable 
    return data; 
} 

para escribir

AD7798_16(0x08, 0x000A);
    
respondido por el verendra
0

Debe leer la hoja de datos de ADC más detenidamente.

Para cada comunicación con el ADC debe enviar un valor para el registro de comunicación. Según la hoja de datos, CR7 debe estar bajo o ningún otro bit está sincronizado en el registro de comunicación.

Por lo tanto, para el primer byte que envíe, debe haber borrado el MSB.

El bit 6 es si desea una lectura o una escritura. Los bits 5-3 son los registros en los que desea operar. Bit 2 es si quieres leer continuamente Los bits 1-0 deben ser 0's.

Consulte la sección "Interfaz digital" de la hoja de datos, así como la sección "Registros en chip".

    
respondido por el Ross

Lea otras preguntas en las etiquetas