Código del chip del sensor de temperatura LTC2498 a través de SPI

1

Le agradecería mucho sus sugerencias para la definición de mi problema actual:

Tengo un microcontrolador ATmega128RFA1 con Zigbee integrado con UART-USB (Convertidor TTL) conectado a la PC.

Desde el ATmega128RFA1 he conectado a través de SPI un chip sensor de temperatura LTC2498.

Necesito leer The Temperature from LTC2498 en The Terminal Program en mi PC. El esquema es el siguiente:

LTC2498 - SPI - uC (Programado con el código Read_ltc2498) - UART_USB - PC.

El código con el que estoy trabajando es el siguiente:

#include <avr/io.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <util/delay.h>


#define DD_MISO 3
#define DD_MOSI 2
#define DD_SCK 1
#define DD_SS 0




void uart_init()
{
    uint16_t temp = ((8000000)/(9600.0*16)-1); //Berechnung Übertragungsgeschwindigkeit


    UBRR0L = temp; //Übertragungsgeschwindigkeit übermitteln
    UBRR0H = temp>>8;

    UCSR0B |= (1<<TXEN0)|(1<<RXEN0)|(1<<RXCIE0); //Senden und Empfangen freischalten


    UCSR0C |= (1<<UCSZ00)|(1<<UCSZ01);  //Übertragungsformat: 8-Bit

}


int sendestring(char *s)
{
    int i=0;

    for(i=0; s[i] != '
#include <avr/io.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <util/delay.h>


#define DD_MISO 3
#define DD_MOSI 2
#define DD_SCK 1
#define DD_SS 0




void uart_init()
{
    uint16_t temp = ((8000000)/(9600.0*16)-1); //Berechnung Übertragungsgeschwindigkeit


    UBRR0L = temp; //Übertragungsgeschwindigkeit übermitteln
    UBRR0H = temp>>8;

    UCSR0B |= (1<<TXEN0)|(1<<RXEN0)|(1<<RXCIE0); //Senden und Empfangen freischalten


    UCSR0C |= (1<<UCSZ00)|(1<<UCSZ01);  //Übertragungsformat: 8-Bit

}


int sendestring(char *s)
{
    int i=0;

    for(i=0; s[i] != '%pre%'; i++)
    {
        while bit_is_clear(UCSR0A, UDRE0); //warten, bis UDRE0 = 1 (Senderegister frei)

        UDR0 = s[i]; //ein Zeichen senden

    }

    return 0;
}




void SPI_MasterInit(void)
{
    //Outputs: MOSI, SCK, SS
    DDRB = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);

    //Enable SPI, Master-Mode, set clock rate fck/16
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}


int SPI_MasterTransmit(char MOSI)
{
    //start Transmission
    SPDR = MOSI;

    //wait for transmission complete
    while(!(SPSR & (1<<SPIF)));

    //returned data from slave to master
    return SPDR;
}


int main()
{

    char str[20];

    // Thermoelement an CH0 und CH1
    char masterOut1 = 0b10100000;

    // interne Temperaturmessung:
    char masterOut2 = 0b10000000;

    char result;
    uint32_t masterIn = 0;
    uint32_t Temp = 0;

    uart_init();    

    SPI_MasterInit();


    for(;;)
    {

        _delay_ms(500);

        //CS des Thermochips auf low
        PORTB &= !(1<<DD_SS);


        //Byte1
        result = SPI_MasterTransmit(masterOut1);        
        masterIn = (result & 0b00011111);  /*last 3 bits lost/*
        sendestring(str);

        //Byte2
        result = SPI_MasterTransmit(masterOut2);
        masterIn = (masterIn<<8) + result;


        //Byte3
        result = SPI_MasterTransmit(0);
        masterIn = (masterIn<<8) + result;


        //Byte4
        result = SPI_MasterTransmit(0);
        masterIn = (masterIn<<8) + result;


        //CS des Thermochips auf high
        PORTB |= (1<<DD_SS);


        masterIn = (masterIn>>5) & 0b00000000111111111111111111111111; /*Last 5 bits lost/*

        sendestring(" masterIn: ");
        sprintf(str, "%ld", masterIn);
        sendestring(str);

        //bei interner Temperaturmessung: Temperatur in °C berechnen laut Datenblatt Seite21
        Temp = (masterIn*4/1570)-273;

        sendestring(" Temp: ");
        sprintf(str, "%ld", Temp);
        sendestring(str);

        _delay_ms(2000);
    }


    return 0;
}
'; i++) { while bit_is_clear(UCSR0A, UDRE0); //warten, bis UDRE0 = 1 (Senderegister frei) UDR0 = s[i]; //ein Zeichen senden } return 0; } void SPI_MasterInit(void) { //Outputs: MOSI, SCK, SS DDRB = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS); //Enable SPI, Master-Mode, set clock rate fck/16 SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); } int SPI_MasterTransmit(char MOSI) { //start Transmission SPDR = MOSI; //wait for transmission complete while(!(SPSR & (1<<SPIF))); //returned data from slave to master return SPDR; } int main() { char str[20]; // Thermoelement an CH0 und CH1 char masterOut1 = 0b10100000; // interne Temperaturmessung: char masterOut2 = 0b10000000; char result; uint32_t masterIn = 0; uint32_t Temp = 0; uart_init(); SPI_MasterInit(); for(;;) { _delay_ms(500); //CS des Thermochips auf low PORTB &= !(1<<DD_SS); //Byte1 result = SPI_MasterTransmit(masterOut1); masterIn = (result & 0b00011111); /*last 3 bits lost/* sendestring(str); //Byte2 result = SPI_MasterTransmit(masterOut2); masterIn = (masterIn<<8) + result; //Byte3 result = SPI_MasterTransmit(0); masterIn = (masterIn<<8) + result; //Byte4 result = SPI_MasterTransmit(0); masterIn = (masterIn<<8) + result; //CS des Thermochips auf high PORTB |= (1<<DD_SS); masterIn = (masterIn>>5) & 0b00000000111111111111111111111111; /*Last 5 bits lost/* sendestring(" masterIn: "); sprintf(str, "%ld", masterIn); sendestring(str); //bei interner Temperaturmessung: Temperatur in °C berechnen laut Datenblatt Seite21 Temp = (masterIn*4/1570)-273; sendestring(" Temp: "); sprintf(str, "%ld", Temp); sendestring(str); _delay_ms(2000); } return 0; }

He intentado cambiar la función SPI en los 4 modos para CPOL y CPHA bits en el registro SPCR pero no funciona.

Con los siguientes caracteres, he configurado LTC2498 de la siguiente manera:

32 bits: Byte1 = 10100000; Byte2 = 10000000; Byte3 = 00000000; Byte4 = 00000000;

Los resultados están alrededor de esto:
result1: 11111111 masterIn: 16777215 Temp: 42471

masterIn = DATAOUT según la hoja de datos de LTC2498 tiene que ser alrededor de 80000, por lo que es demasiado alto.

¿Podría alguien ayudarme con este problema?

    
pregunta Ektor

1 respuesta

1

No sé si esto resolverá su problema, pero le sugiero que haga este cambio:

//CS des Thermochips auf low
PORTB &= ~(1<<DD_SS);

¿Ha intentado medir con un osciloscopio?

Editar: ¿También te diste cuenta de que la sintaxis de tu comentario está un poco apagada, tal vez un problema cuando la pegaste en el foro? ¿Se compila el código?

 masterIn = (result & 0b00011111);  /*last 3 bits lost/* 

Debería ser:

masterIn = (result & 0b00011111);  /*last 3 bits lost*/

Y:

masterIn = (masterIn>>5) & 0b00000000111111111111111111111111; /*Last 5 bits lost/* 

Debería ser:

masterIn = (masterIn>>5) & 0b00000000111111111111111111111111; /*Last 5 bits lost*/   
    
respondido por el amimo816

Lea otras preguntas en las etiquetas