Ich versuche, eine einfache SPI-Kommunikation von 16-Bit-Daten von einem PIC24FJ64GA002 zu einem anderen desselben Mikrocontrollers zu erreichen. Indem ich dem Datenblatt bis ins kleinste Detail folgte, schrieb ich den Sender- und Empfängercode wie folgt:
Sender:
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++
}
}
Empfänger:
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
}
}
Der Sender scheint die Daten zu übertragen (Takt- und Datenleitungen zeigen erwartete Zyklen), aber aus irgendeinem Grund empfängt der Empfänger die Daten nicht und schiebt sie auf A-Anschlüsse.
Die Konfigurationseinstellungen für beide Mikrocontroller sind:
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
Die einzigen zwei Verbindungen sind die Takt- und Datenleitungen von den jeweiligen Peripheriestiften. Was ist hier das Problem und wie erhält man die Daten?
Es scheint unmöglich, dass dies tatsächlich funktioniert, hat das jemals jemand erreicht?
Sie weisen Peripheriegeräten falsche Pins zu. Es reicht nicht aus, das Bit einfach zu setzen, Sie müssen mindestens einmal eine Entsperrsequenz befolgen, und es wird empfohlen, das Register zu sperren, nachdem Sie mit der Zuweisung fertig sind. Die nützlichen Makros sind in 'pps.h' enthalten, der Code sieht so aus (für UART2):
PPSUnLock;
PPSOutput( PPS_RP21, PPS_U2TX );
PPSInput( PPS_U2RX, PPS_RP26 );
Die ganze C-Datei kann hier eingesehen werden -> https://github.com/felis/cdb/blob/master/fw/minimal/bsp.c#L185
Oliver
Harscha
Oliver
Harscha
Oliver
Harscha
Oliver
Harscha
Harscha
Alexxx
Harscha
Harscha
Guill
Harscha
Guill
Guill
Harscha
Chris Stratton