Hallo,
ich habe einen LPC 2119 und möchte ein CAN drauf zum laufen bekommen.
Es klappt auch alles soweit nur tu ich mir schwer die einzelnen Bytes
der Botschaften auszulesen.
Auszug aus CANoe
1 | message CAN1.SPEED Speed =
|
2 | {
|
3 | byte (0) = 0x1,
|
4 | byte (1) = 0x2,
|
5 | byte (2) = 0x3,
|
6 | byte (3) = 0x4,
|
7 | byte (4) = 0x5,
|
8 | byte (5) = 0x6,
|
9 | byte (6) = 0x7,
|
10 | byte (7) = 0x8
|
11 | };
|
diese Nachricht schicke ich über den CAN. die Nachricht wird korrekt
eingelesen und im Rgister C1RDA gespeichert.
Aufbau meiner CAN Nachricht:
1 | typedef struct
|
2 | {
|
3 | unsigned int Frame; // Bits 16..19: DLC - Data Length Counter
|
4 | // Bit 30: Set if this is a RTR message
|
5 | // Bit 31: Set if this is a 29-bit ID message
|
6 | unsigned int MsgID; // CAN Message ID (11-bit or 29-bit)
|
7 | unsigned int DatA; // CAN Message Data Bytes 0-3
|
8 | unsigned int DatB; // CAN Message Data Bytes 4-7
|
9 | } CANALL_MSGRX;
|
Wenn eine Nachricht empfangen wurde wird dieser Interrupt gestartet:
1 | // Receive Queue: one queue for each CAN port
|
2 | CANALL_MSGRX mRxCAN[MAX_CANPORTS][MAX_QUEUE];
|
3 |
|
4 | void CANAll_CANISR_Rx1 (void) __irq
|
5 | {
|
6 | unsigned int *pDest;
|
7 | unsigned int *data;
|
8 |
|
9 | // initialize destination pointer
|
10 | pDest = (unsigned int *) &(mRxCAN[0][mRxIN[0]]);
|
11 | *pDest = C1RFS; // Frame
|
12 |
|
13 | pDest++;
|
14 | *pDest = C1RID; // ID
|
15 |
|
16 | pDest++;
|
17 | *pDest = C1RDA; // Data A
|
18 |
|
19 | pDest++;
|
20 | *pDest = C1RDB; // Data B
|
21 |
|
22 | // Adjust IN pointer
|
23 | mRxIN[0]++;
|
24 | if (mRxIN[0] >= MAX_QUEUE)
|
25 | {
|
26 | mRxIN[0] = 0;
|
27 | }
|
28 |
|
29 | C1CMR = 0x04; // release receive buffer
|
30 | VICVectAddr = 0xFFFFFFFFL; // acknowledge Interrupt
|
31 |
|
32 | }
|
Laut LPC 2119 Datenblatt stehen im C1RDA register Byte (0) - Byte (3)
wie bekomm ich des hin, das Byte (1) auszulesen um es auf ein Display
auszugeben ?!