CAN-Kommunikation zwischen zwei ARM-MCUs (LPC2129)

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
}
Riecht nach CAN-Bus-Hardwarefehler. Wie ist Ihr CAN-Bus verkabelt, welche Transceiver verwenden Sie?
mit MCP2551 Transceiver und wie folgt verbunden MCU RD2 an MCP2551 Rx, MCU TD2 an MCP2551 Tx. Und für die Busverbindung: CANH eines MCP2551 wird direkt über ein Kabel mit CANH eines anderen MCP 2551 verbunden, und auf dieselbe Weise auch für CANL.
Kannst du CANalyzer an den Bus anschließen und sehen, was los ist?? Ich hoffe, die Baudrate beider Knoten ist gleich!

Antworten (1)

CAN erfordert die beiden Abschlusswiderstände, 120 Ω jeder, anwesend zu sein. Andernfalls verlässt der Bus den Fehlerzustand nicht, und Sie erhalten nur Fehlerunterbrechungen.

Ich verwende einen 120-Ohm-Widerstand auf jeder Seite, aber ich erhalte ständig einen ACK-Steckplatzfehler vom Sender. Ich habe zwei MCp2551-Module wie CANH-CANH und CANL-CANL direkt verbunden. Bitte schlagen Sie vor, wie Sie diesen ACK-Steckplatzfehler beseitigen können