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