La comunicación SPI entre PIC24FV32KA301 y MS5611 no funcionará

1

Soy nuevo en la programación de microcontroladores e intento establecer comunicación SPI entre PIC24FV32KA301 ( Hoja de datos ) y MS5611 ( Hoja de datos ).

Después de una semana de búsqueda y aprendizaje sobre SPI, todavía no puedo comunicarme entre ellos y agradecería que alguien me ayudara.

¿Me estoy perdiendo algo?

/* Device header file */
#if defined(__XC16__)
    #include <xc.h>
#elif defined(__C30__)
    #if defined(__PIC24E__)
        #include <p24Exxxx.h>
    #elif defined (__PIC24F__)||defined (__PIC24FK__)
    #include <p24Fxxxx.h>
    #elif defined(__PIC24H__)
    #include <p24Hxxxx.h>
    #endif
#endif

#include <stdint.h>        /* Includes uint16_t definition                    */
#include <stdbool.h>       /* Includes true/false definition                  */

#include "system.h"        /* System funct/params, like osc/peripheral config */
#include "user.h"          /* User funct/params, such as InitApp              */

#include "uart1.h"

#include <libpic30.h>        // __delayXXX() functions macros defined here

/******************************************************************************/
/* Global Variable Declaration                                                */
/******************************************************************************/

/* i.e. uint16_t <variable_name>; */

/******************************************************************************/
/* Main Program                                                               */
/******************************************************************************/

void SPIinit(){
    //Master mode, 8bits
    SPI1CON1bits.MSTEN = 1;
    SPI1CON1bits.MODE16 = 0; //8bit
    SPI1CON1bits.DISSCK = 0;

    //SPI mode 0
    SPI1CON1bits.CKP = 0;
    SPI1CON1bits.CKE = 1;

    //1:1 prescale
    //SPI1CON1bits.SPRE = 0b111;
    //SPI1CON1bits.PPRE = 0b11;

    //Enable SPI operation
    SPI1STATbits.SPIROV = 0;
    SPI1STATbits.SPIEN = 1;
}

char SPIsend(char command){

    unsigned int buffer;

    //wait until the device is available
    while( SPI1STATbits.SPITBF);
    // Initiate the exchange
    SPI1BUF = command;

    // Wait for the exchange to complete (or handle things via an ISR)
    while( !SPI1STATbits.SPIRBF);

    //Read from buffer
    buffer = SPI1BUF;

    //return first byte
    return buffer & 0xff;
}

int16_t main(void)
{

    /* Configure the oscillator for the device */
    ConfigureOscillator();

    /* Initialize IO ports and peripherals */
    InitApp();



    //OSCCON = 0x11C0;   //Use primary, no divide FCY = 10Mhz/2 = 5Mhz
    OSCCON = 0x11C0;
    CLKDIV = 0x0000;     //do not divide


    ANSELA = 0x0000;
    ANSELB = 0x0000;

    //UART
    TRISBbits.TRISB2 = 1;
    TRISBbits.TRISB7 = 0;

    //SPI
    TRISBbits.TRISB12 = 0; //SCK
    TRISBbits.TRISB13 = 0; //SDO
    TRISBbits.TRISB14 = 1; //SDI
    TRISBbits.TRISB15 = 0; //CSB

    LATBbits.LATB15 = 0; //CSB

    //Disable Watch Dog Timer
    RCONbits.SWDTEN = 0;

    UART1Init(12);   //Initiate UART1 to 19200 at 8MHz OSCI
    SPIinit();
    __delay_ms(1000);

    SPIsend(0x1E);
    __delay_ms(3);


    //pressure command
    SPIsend(0x40);
    __delay_ms(9);

    //read
    UART1PutChar(SPIsend(0x00));
    UART1PutChar(SPIsend(0x00));
    UART1PutChar(SPIsend(0x00));

    while(1){

    }
}

Estoy usando UART1PutChar para enviar los resultados a mi computadora y siempre obtengo la respuesta 0xFF de MS5611, pero si conecto SDO y SDI a bordo, obtengo los mismos datos que estoy enviando a MS5611, lo que significa que mi código funciona pero el sensor (MS5611) está muerto?

    
pregunta Nejc Okorn

2 respuestas

2

Probablemente debería escribir esto en un comentario, pero no tengo suficiente reputación para escribir comentarios, así que aquí va:

Tengo varios dispositivos en uso de producción con PIC24FV32KA301 y PIC24F32KA301 utilizando SPI por todas partes.

Por lo que puedo ver por lo que publicaste, tu uso de SPI parece correcto.

Aunque la hoja de datos del sensor no lo indica, pero las cosas con las que uso SPI usualmente requieren que el CSB sea elevado, tal vez se mantenga alto un poco y luego se vuelva a bajar entre los comandos. Podrías intentarlo ...

También la corriente de suministro de conversión es considerablemente más alta que la corriente de espera. Puede intentar bombardear el sensor con comandos de conversión y verificar la corriente para ver si recibe / ejecuta los comandos en absoluto.

    
respondido por el Szidor
0

Después de iniciar su transmisión escribiendo a SPI1BUF, creo que tendrá que esperar hasta que se complete la transmisión antes de comenzar a verificar si la recepción está completa. También parece que estás ignorando los valores que deseas enviar y enviando 0x00 en su lugar.

    
respondido por el HandyHowie

Lea otras preguntas en las etiquetas