Ich versuche, zwischen zwei LPC2129- Mikrocontrollern zu kommunizieren, einem als Sender und dem anderen als Empfänger, und verwende Interrupts zum Senden und Empfangen der Nachricht.
Die Sende- und Empfangsunterbrechungen treten in der Simulation auf, aber das Gleiche funktioniert nicht auf den MCUs. Aber die anderen Interrupts wie Busfehler und passive Fehler treten auf.
Und wenn ich die Empfangsfunktion in diesem ISR aufrufe, wird die Nachricht einmal empfangen, und danach geht das Gerät in den passiven Modus.
Problem: Obwohl ich separate ISRs für Übertragung und Empfang habe, wird es nicht auf der MCU ausgeführt, ABER die ISR des anderen CAN-Interrupts wird ausgeführt.
Der Code ist wie folgt bitte helfen.
CAN-Initialisierung:
PINSEL1 |= (DWORD) 0x00054000;
C2MOD = 1; // Enter Reset Mode
C2GSR = 0; // Clear status register
C2BTR = 0x001C001D; // Set bit timing
C2IER = 0x000007FF;
AFMR = 0x00000001; // Enable recieve acceptance filter
C2MOD = 0; // Enter normal operating mode
VICIntEnable |= 0x08280000; //Enable interrupts
VICVectCntl0 = 0x00000033; //Select a priority slot for a given interrupt
VICVectAddr0 = (unsigned)CAN2_ISR; //Pass the address of the IRQ
VICVectCntl1 = 0x0000003B; //Select a priority slot for a given interrupt
VICVectAddr1 = (unsigned)CAN2_Rx_ISR; //Pass the address of the IRQ
VICVectCntl2 = 0x00000035; //Select a priority slot for a given interrupt
VICVectAddr2 = (unsigned)CAN2_Tx_ISR; //Pass the address of the IRQ
AFMR = 0x00000001; //Disable the acceptance filters
Sendefunktion:
void Tx_Frame(unsigned int ID, unsigned long LSB_4, unsigned long MSB_4, unsigned char LEN, char RTR_FF)
{
while ( (C2SR & 0x00000004) != 0x00000004)
; // Checking that the TX buffer is empty
C2TFI1 |= (LEN << 16); // Frame information (RTR=0, 11 bit identifier. And length is setting)
C2TFI1 |= (RTR_FF << 30);
C2TDA1 = LSB_4; // Data A
C2TDB1 = MSB_4; // Data B
C2TID1 = ID; // 11 bit ID or 29 bit
C2CMR = 0x21; // Command: Transmit previously written message through TX buffer 1.
}
Empfangsfunktion:
void Rx_Frame(void)
{
DWORD DATA_A,DATA_B,LEN,ID;
LEN = C2RFS;
ID = C2RID;
DATA_A = C2RDA;
DATA_B = C2RDB;
C2CMR = 0x04; // Release receive buffer command
}
CAN erfordert die beiden Abschlusswiderstände, 120 jeder, anwesend zu sein. Andernfalls verlässt der Bus den Fehlerzustand nicht, und Sie erhalten nur Fehlerunterbrechungen.
TurboJ
Raghu TC
Schwanand