Forum: Mikrocontroller und Digitale Elektronik LPC11C14 löst bei mehrmaligen CAN RTR keinen Interrupt aus


von Christian K. (christian_rx7) Benutzerseite


Lesenswert?

Hallo.

Ich habe ein Problem, bei dem ich nicht weiter komme.
Ich nutze den LPC11C14 mit der CANopen API, was prinzipiell schon gut 
funktioniert.
Node ID: 1
Es gibt zwei Transmit PDOs (COB 0x181 und 0x281), welche soweit 
funktionieren, bis auf die Reaktion auf ein Remote Transmit Request. 
Welcher nur einen CAN_RX Interrupt auslöst, wenn zuvor nicht die gleiche 
Adresse gesendet wurde. Soll heißen, frage ich zweimal hintereinander 
0x181 ab, wird nur die erste Anfrage beantwortet, die Zweite geht ins 
Leere. Frage ich beide abwechselnd ab, funktioniert alles. Selbes gilt, 
wenn wenn eine der beiden Adressen zuvor durch ein Event gesendet wurde, 
Anfrage bringt nichts, solange kein anderes Telegramm dazwischen war.
CAN wird laut Beispielcode initialisiert:
1
  /* Initialize the CAN controller */
2
  (*rom)->pCAND->init_can(&ClkInitTable[0], 1);
3
  /* Configure the CAN callback functions */
4
  (*rom)->pCAND->config_calb(&callbacks);
5
  /* Initiate object dictionary */
6
  CANopen_Init_SDO();
7
  /* Initialize CANopen handler */
8
  myCANopen.node_id = CANnodeId;
9
  myCANopen.od_const_num = NumberOfmyConstODEntries;
10
  myCANopen.od_num = NumberOfmyODEntries;
11
  (*rom)->pCAND->config_canopen((CAN_CANOPENCFG *)&myCANopen);
12
  /* Enable the CAN Interrupt */
13
  NVIC_EnableIRQ(CAN_IRQn);
14
  /* Configure message object 3 to receive all 11-bit messages 0x700-0x77F  Network Management Error Control */
15
  CANopen_Msg_Obj.msgobj = CAN_MSG_BUFFER_HEARTBEAT_RX;
16
  CANopen_Msg_Obj.mode_id = 0x700;
17
  CANopen_Msg_Obj.mask = 0x780;
18
  (*rom)->pCAND->config_rxmsgobj(&CANopen_Msg_Obj);
19
20
  /* Configure message object 5 to receive all 11-bit messages 0x000 (Network Management) */
21
  CANopen_Msg_Obj.msgobj = CAN_MSG_BUFFER_NMT_RX;
22
  CANopen_Msg_Obj.mode_id = 0x000;
23
  CANopen_Msg_Obj.mask = 0x7FF;
24
  (*rom)->pCAND->config_rxmsgobj(&CANopen_Msg_Obj);
25
26
  /* Configure message object 7 to receive all 11-bit messages 0x580-5FF (SDO) */
27
  CANopen_Msg_Obj.msgobj = CAN_MSG_BUFFER_SDO_CLIENT_RX;
28
  CANopen_Msg_Obj.mode_id = 0x580;
29
  CANopen_Msg_Obj.mask = 0x780;
30
  (*rom)->pCAND->config_rxmsgobj(&CANopen_Msg_Obj);
31
32
  /* Configure message object 9 to receive all 11-bit messages 0x200+NodeID (PDO) */
33
  CANopen_Msg_Obj.msgobj = CAN_MSG_BUFFER_PDO_RX;
34
  CANopen_Msg_Obj.mode_id = SDOS_1400Sub1_Data;
35
  CANopen_Msg_Obj.mask = 0x7FF;
36
  (*rom)->pCAND->config_rxmsgobj(&CANopen_Msg_Obj);
37
38
  /* Configure message object 11 to receive all 11-bit rtr messages 0x?80+NodeID (PDO request) */
39
  CANopen_Msg_Obj.msgobj = CAN_MSG_BUFFER_PDO_RXTX_REQ;
40
  CANopen_Msg_Obj.mode_id = SDOS_1800Sub1_Data | CAN_MSGOBJ_RTR;
41
  CANopen_Msg_Obj.mask = (~(SDOS_1800Sub1_Data ^ SDOS_1801Sub1_Data) & 0x7FF);
42
  (*rom)->pCAND->config_rxmsgobj(&CANopen_Msg_Obj);
Gesendet wird aus CANopen_Msg_Obj.msgobj = 10.

Würde mich freuen, wenn jemand eine Idee hat, da ich schon seit Stunden 
suche und nicht weiter komme.

Danke,
Christian_RX7

von Christian K. (christian_rx7) Benutzerseite


Lesenswert?

Wenn ich die Numerierung und somit die Prioritäten der Message Objects 
ändere funktioniert es.
Anscheinend muss der Empfang eine höhere Priorität als das Senden 
besitzen.
PDO RTR Empfang = 9
PDO Empang = 10
PDO Senden = 11
funktioniert

Falls jemand eine Erklärung dafür hat, warum sich die Puffer gegenseitig 
beeinflussen, würde mich das interessieren.

Christian_RX7

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

Überleg mal was passiert wenn die Priorität nicht geregelt ist und 
verschiedene IRQs mitgleicher Priorität überlappend einlaufen ....

von Christian K. (christian_rx7) Benutzerseite


Lesenswert?

Es laufen ja alle Puffer auf einen Interrupt zusammen. Senden und 
Empfangen liegt in verschiedenen Puffern, die anscheinend nichts mit 
einander zu tun haben. Beim Debuggen ist mir aufgefallen, dass der 
CAN-Controller bei der ursprünglichen Programmierung nur das Flag 
gesetzt hat, dass er eine Nachricht korrekt empfangen hat, aber kein 
Flag und auch kein Interrupt, dass er es in einen Puffer kopiert hat. 
Somti gehe ich davon aus, dass er es einfach verworfen hat.

Christian_RX7

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.