Comunicación SPI de dos hilos simple entre dos PIC24s

1

Estoy tratando de lograr una comunicación simple SPI de datos de 16 bits desde un PIC24FJ64GA002 a otro del mismo microcontrolador. Siguiendo la hoja de datos de la palabra, escribí el código del transmisor y el receptor como se muestra a continuación,

Transmisor:

unsigned int i = 0;

void main()
{
    RPOR2bits.RP4R = 7;  // Data out through Peripheral Pin 4
    RPOR2bits.RP5R = 8;  // Clock out  through Peripheral Pin 5
    SPI1CON1bits.MODE16 = 1; //16 bit mode 
    SPI1CON1bits.MSTEN = 1;  // Master enable
    SPI1CON1bits.SSEN = 0; //No slave selection
    SPI1STATbits.SPIROV = 0; //Receiver Overflow cleared as told in datasheet
    SPI1STATbits.SPIEN = 1; //SPI is enabled
    while (1)
    {
        while (SPI1STATbits.SPITBF); //Waiting for any transmission to complete
        SPI1BUF = i; // Data is written
        i++
    }
}

Receptor:

unsigned int i;

void main()
{
    RPINR20bits.SDI1R = 0; //Data in through Peripheral pin 0
    RPINR20bits.SCK1R = 2; //Clock in through Peripheral pin 2
    AD1PCFG = 0xFFFF;
    TRISA = 0x0000;
    SPI1CON1bits.MODE16 = 1;
    SPI1CON1bits.MSTEN = 0; // Slave mode
    SPI1CON1bits.SSEN = 0;
    SPI1CON1bits.SMP = 0; //Must be cleared in slave mode as told in datasheet
    SPI1CON1bits.DISSDO = 1; //Receiver only receives data
    SPI1STATbits.SPIROV = 0;
    SPI1STATbits.SPIEN = 1;

    while (1)
    {
        while (!SPI1STATbits.SPIRBF); //waiting for receive to complete
        LATA = SPI1BUF; // pushing Received data onto A
    }
}

El transmisor parece estar transmitiendo los datos (el reloj y las líneas de datos muestran los ciclos esperados), pero por alguna razón el receptor no recibe los datos y los empuja hacia los terminales A.

Los ajustes de configuración para ambos microcontroladores son:

Primary Oscillator Select: Primary Oscillator Disabled 
I2c1 Pin Location Select: Use default SCL 1/SDA 1 pins 
IOLOCK Protection: Disabled 
OSCO Pin Configuration: OSCO functions as port I/O 
Clock Switching and Monitor: Clock switching is enabled, Fail-safe Clock Monitor is enabled 
Oscillator Select: Fast RC Oscillator (FRC) 
Sec Oscillator Select: Default Secondary Oscillator (SOSC) 
Wake-up timer Select: Legacy Wake-up Timer 
Internal External Switch Over Mode: Disabled
External Watchdog Timer Postscaler: 1:32,768
WDT Prescalar: Prescaler ratio of 1:128 
Watchdog Timer Window: Disabled 
Watchdog Timer Enable: Disabled 
Comm Channel Select: Emulator EMUC1/EMUD1 pins are shared with PGC1/PGD1 
Background Debug: Disabled 
General Code Segment Write Protect: Disabled 
General Code Segment Code Protect: Disabled 
JTAG Port Enable: Disabled

Las únicas dos conexiones son el Reloj y las líneas de datos de los respectivos pines periféricos. ¿Cuál es el problema aquí y cómo recibir los datos?

Parece imposible que esto realmente funcione, ¿alguien lo ha logrado alguna vez?

    
pregunta Harsha

1 respuesta

1

Está asignando pins a los periféricos incorrectamente. Simplemente no basta con establecer el bit, debe seguir una secuencia de desbloqueo al menos una vez, y se recomienda bloquear el registro una vez que haya terminado con la asignación. Las macros útiles están contenidas en 'pps.h', el código se verá así (para UART2):

PPSUnLock;
PPSOutput( PPS_RP21, PPS_U2TX );
PPSInput( PPS_U2RX, PPS_RP26 );

El archivo completo de C se puede ver aquí - > enlace

    
respondido por el Oleg Mazurov

Lea otras preguntas en las etiquetas