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?