Forum: Mikrocontroller und Digitale Elektronik lpc2294 CAN receive problem


von idu79 (Gast)


Lesenswert?

Hallo leute

ich versuche seit ein paar tagen zwei LPC2294 Boards von olimex über CAN 
Schnittstelle zu verbinden dabei sendet der erste Board ein CAN 
Nachricht  und der zweit lässt bei enthalten der Nachricht die LED 
leuchten . Dafür habe ich ganz einfache Softwares „eins fürs senden der 
Nachricht und das andere fürs empfangen“  programmiert und je auf einen 
Board geflasht.Mit dem ersten board kann ich erfolgreich senden,das was 
ich im Ozilloskop eindeutig sehen kann, aber mit dem empfangen scheitert 
es. Obwohl ich die beiden LPC´s richtig verbunden habe, reagiert mein 
zweites Board nicht und die LED leuchtet nicht.


 --Das Sende Programm sieht so aus:

#include "LPC22xx.H"

int main(void)
{

VPBDIV    =   0x00000001;             //Set PClk to 60Mhz
PINSEL1   |=   0x00010000;              //Enable  CAN2 RX
C2MOD     =   0x00000001;    //Set CAN controller into reset
C2BTR       =  0x001C001D;              //Set bit timing to 125k
C2MOD     =   0x00000000;              //Release CAN controller

while (1)  {        //See if Tx Buffer 1 is free

C2TFI1     =  0x00040000;       //Set DLC to 4 bytes
C2TID1     = 0x00000022;                //Set address to 2 Standard 
Frame
C2TDA1   = 0x40000000;                   //Copy some data into first 
four bytes
C2CMR    = 0x00000001;     //Transmit the message

}

}

 --Das Empfang programm habe so erstellt:

void CANIRQ (void) _attribute_ ((interrupt("IRQ")));
int main(void)
{
VPBDIV = 0x00000001; //Set PClk to 60MHz
IODIR1 = 0x00FF0000; // set all ports to output
IODIR0 |= 0x40000000;
PINSEL1|= 0x00040000; //Enable Pin 0.25 as CAN1 RX
C1MOD = 0x00000001; //Set CAN controller into reset
C1BTR = 0x001C001D; //Set bit timing to 125k
C1IER =0x00000001; //Enable the Receive interrupt
VICVectCntl0 = 0x0000003A; //select a priority slot for a given 
interrupt
VICVectAddr0 = (unsigned) CANIRQ; //pass the address of the IRQ
//into the VIC slot
VICIntEnable = 0x04000000; //enable interrupt
AFMR = 0x00000001; //Disable the Acceptance filters
C1MOD = 0x00000000; //Release CAN controller

If (C1DRA == 0x40000000){/* Nachricht 0x40000000 die gesendet wurde 
siehe sende programm wurde empfangen*/

IOSET0 = 0x40000000;          //LED leuchtet
}
while(1){;}
}
void CANIRQ (void)
{
IOCLR1 = ~C1RDA; //clear output pins
IOSET1 = C1RDA; //set output pins
C1CMR = 0x00000004; //release the receive buffer
VICVectAddr = 0x00000000; //Signal the end of interrupt
}

Bitte sagt mir was ich hier falsch mache vielen dank im voraus.

von Magnus (Gast)


Lesenswert?

ich kenn mich nicht speziell mit dem lpc2294 nun aus, da ich mit dem 
LPC2129 unterwegs bin, aber vllt helfen dir die LPC2xxx CAN Examples

http://www.keil.com/download/docs/291.asp

Dort sind die Treiberfunktionen schon alle implementiert, ich musste sie 
aufgrund meiner Toolchain ein wenig anpassen (RapidiTTy Lite 1.51) aber 
sie funktionieren dumm vor sich hin.

Vllt findest du in diesen Quellen Anreize für den eigenen Treiberbau 
bzw. findest den Haken in deinem Code. (Vllt hast du irgendein Register 
vergessen zu setzen?)

VG

--magnus

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.