Hallo =) Ich habe folgendes Problem und wollte mal hören, ob dies schon jemand hatte und mir evtl. eine Lösung liefern kann. Und zwar arbeite ich mit einem LPC1768 dieser kann ein Display ansteuern und CAN Botschaften senden und empfangen. solange ich beides einzeln betreibe funktioniert es wunderbar, sprich ich kann CAN Daten senden und empfangen (ich kann dies mit CANOE kontrollieren) und wenn ich mein Display betreiben will kann ich Strings und Chars darstellen und mit Hilfe von sprintf auch Zahlen. so nun wollte ich die CAN-Daten auswerten und anschließend anzeigen, jedoch stellt mein CAN-Controller jedes mal den Betrieb nach eine unbestimmten Zeit ein sobald ich zusätzlich etwas auf mein Display schreiben möchte.
Und jetzt sollen alle ihre Kistallkugeln polieren? Mehr als "du machst offenbar etwas falsch" gibt deine Information nicht her. So haben CAN Controller typischerweise Fehlerzähler und Statusregister. Wäre ja vielleicht nicht uninteressant, da sowohl beim Stillstand als auch im Betrieb mal reinzusehen.
ich wollte wissen ob jemand das Problem kennt, da es mir völlig unbekannt und unerklärlich ist. Und mein Fehlerzähler bleibt auf 0. Ich starte das Programm und alles läuft wie es soll und nach gerade ca. 40 sekunden stoppt mein Controller den Sendevorgang aber das Senden von CANoe an den Controller wird noch vollzogen, jedoch ändern sich meine Empfangenen Daten auf dem Controller nicht mehr.
Tom schrieb: > ich wollte wissen ob jemand das Problem kennt, da es mir völlig > unbekannt und unerklärlich ist. Das Problem "mein Programm funktioniert nicht" ist jedem hier nur zu gut bekannt. Wer sich mal mit CAN befasst hat, der kennt auch die spezifisch erweiterte Variante dafür. Hilft dir das jetzt weiter? Eine andere hoffentlich zielführende Antwort ist das beliebte "Fehler in Zeile 42".
so siehts aus
1 | int main( void ) |
2 | {
|
3 | SystemInit(); // Funktionsaufruf Systeminitialisierung |
4 | lcd_init(); |
5 | INOUT_Def(); |
6 | |
7 | /* Please note, the bit timing is based on the setting of the
|
8 | PCLK, if different PCLK is used, please read can.h carefully
|
9 | and set your CAN bit timing accordingly. */
|
10 | |
11 | CAN_Init(BITRATE500K15MHZ); // Bitrate = 500kbaud bei 15MHz |
12 | NVIC_EnableIRQ(CAN_IRQn); // Interrupts freischalten |
13 | |
14 | MsgBuf_TX1.Frame = 0x00080000; // 11-bit, no RTR, DLC is 8 bytes |
15 | MsgBuf_TX1.MsgID = 0x2ee; // Explicit Standard ID |
16 | MsgBuf_TX1.DataA = data[0]; |
17 | MsgBuf_TX1.DataB = data[1]; |
18 | |
19 | CAN_SetACCF( ACCF_ON ); // Filtermodus festlegen |
20 | |
21 | while ( 1 ) |
22 | {
|
23 | /* Transmit initial message on CAN 1 */
|
24 | while ( !(LPC_CAN1->GSR & (1 << 3)) ); |
25 | MsgBuf_TX1.DataA = data[0]; |
26 | MsgBuf_TX1.DataB = data[1]; |
27 | if ( CAN1_SendMessage( &MsgBuf_TX1 ) == FALSE ) |
28 | {
|
29 | continue; |
30 | }
|
31 | |
32 | /* please note: FULLCAN identifier will NOT be received as it's not set
|
33 | in the acceptance filter. */
|
34 | if ( CAN1RxDone == TRUE ) |
35 | {
|
36 | CAN1RxDone = FALSE; |
37 | |
38 | } /* Message on CAN 2 received */ |
39 | |
40 | lcd_draw_string(font_vw_16px, NORMAL_STYLE,"m/h",79,50,255); |
41 | }
|
1 | if(MsgBuf_RX1.MsgID == 0x45) // first ID |
2 | {
|
3 | data[0] = LPC_CAN1->RDA; |
4 | data[1] = LPC_CAN1->RDB; |
5 | }
|
habe eben nen bisschen getestet und zwar springt das Programm auch nicht mehr in den Interrupt hinein obwohl Daten mit dem richtigen Identifier gesendet werden und keine Fehler angezeigt werden.
1 | /******************************************************************************
|
2 | ** Function name: CAN_ISR_Rx1
|
3 | **
|
4 | ** Descriptions: CAN Rx1 interrupt handler
|
5 | **
|
6 | ** parameters: None
|
7 | ** Returned value: None
|
8 | **
|
9 | ******************************************************************************/
|
10 | void CAN_ISR_Rx1( void ) |
11 | {LPC_GPIO2->FIOSET =0x01; |
12 | uint32_t * pDest; |
13 | |
14 | /* initialize destination pointer */
|
15 | pDest = (uint32_t *)&MsgBuf_RX1; |
16 | *pDest = LPC_CAN1->RFS; /* Frame */ |
17 | |
18 | pDest++; |
19 | *pDest = LPC_CAN1->RID; /* ID */ |
20 | |
21 | |
22 | pDest++; |
23 | *pDest = LPC_CAN1->RDA; /* Data A */ |
24 | |
25 | |
26 | pDest++; |
27 | *pDest = LPC_CAN1->RDB; /* Data B */ |
28 | |
29 | Data_Score(); /* jedem Nachrichtenteil A oder B nach der ID geordnet ein Feld zuweisen*/ |
30 | |
31 | CAN1RxDone = TRUE; |
32 | LPC_CAN1->CMR = 0x04; /* release receive buffer */ |
33 | return; |
34 | |
35 | |
36 | }
|
37 | |
38 | /*****************************************************************************
|
39 | ** Function name: CAN_Handler
|
40 | **
|
41 | ** Descriptions: CAN interrupt handler
|
42 | **
|
43 | ** parameters: None
|
44 | ** Returned value: None
|
45 | **
|
46 | *****************************************************************************/
|
47 | void CAN_IRQHandler(void) |
48 | {
|
49 | LPC_GPIO2->FIOPIN &= ~(0x00000040); |
50 | CANStatus = LPC_CANCR->CANRxSR; /* Score CAN Status */ |
51 | if ( CANStatus & (1 << 8) ) /* if a message received */ |
52 | {
|
53 | CAN1RxCount++; |
54 | CAN_ISR_Rx1(); /* go to CAN_ISR_RX1() */ |
55 | }
|
56 | |
57 | if ( LPC_CAN1->GSR & (1 << 6 ) ) /* if there is an error */ |
58 | {
|
59 | /* The error count includes both TX and RX */
|
60 | CAN1ErrCount = LPC_CAN1->GSR >> 16; |
61 | }
|
62 | return; |
63 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.