Kevin Konradt
/
CanBusExample1
main.cpp@0:ed26402e7a0b, 2010-01-02 (annotated)
- Committer:
- kevin
- Date:
- Sat Jan 02 18:05:53 2010 +0000
- Revision:
- 0:ed26402e7a0b
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kevin | 0:ed26402e7a0b | 1 | #include "mbed.h" |
kevin | 0:ed26402e7a0b | 2 | #include "CAN.h" |
kevin | 0:ed26402e7a0b | 3 | |
kevin | 0:ed26402e7a0b | 4 | Ticker ticker; |
kevin | 0:ed26402e7a0b | 5 | |
kevin | 0:ed26402e7a0b | 6 | DigitalOut led1(LED1); |
kevin | 0:ed26402e7a0b | 7 | DigitalOut led2(LED2); |
kevin | 0:ed26402e7a0b | 8 | |
kevin | 0:ed26402e7a0b | 9 | // CAN_RS pin at Philips PCA82C250 can bus controller. |
kevin | 0:ed26402e7a0b | 10 | // activate transceiver by pulling this pin to GND. |
kevin | 0:ed26402e7a0b | 11 | // (Rise and fall slope controlled by resistor R_s) |
kevin | 0:ed26402e7a0b | 12 | // (+5V result in tranceiver standby mode) |
kevin | 0:ed26402e7a0b | 13 | // For further information see datasheet page 4 |
kevin | 0:ed26402e7a0b | 14 | DigitalOut can_Pca82c250SlopePin(p28); |
kevin | 0:ed26402e7a0b | 15 | |
kevin | 0:ed26402e7a0b | 16 | // second can controller on these pins. Not used here. |
kevin | 0:ed26402e7a0b | 17 | // CAN can1(p9, p10); |
kevin | 0:ed26402e7a0b | 18 | |
kevin | 0:ed26402e7a0b | 19 | // We use can on mbed pins 29(CAN_TXD) and 30(CAN_RXD). |
kevin | 0:ed26402e7a0b | 20 | CAN can2(p30, p29); |
kevin | 0:ed26402e7a0b | 21 | |
kevin | 0:ed26402e7a0b | 22 | void send() { |
kevin | 0:ed26402e7a0b | 23 | static char counter = 0; |
kevin | 0:ed26402e7a0b | 24 | if (can2.write(CANMessage(0x200, &counter, 1))) { |
kevin | 0:ed26402e7a0b | 25 | printf("CanTx--> id: 0x200 dlc: 1 data: %x\n\r", counter); |
kevin | 0:ed26402e7a0b | 26 | counter++; |
kevin | 0:ed26402e7a0b | 27 | } |
kevin | 0:ed26402e7a0b | 28 | // toggle led1 after every transmission |
kevin | 0:ed26402e7a0b | 29 | led1 = !led1; |
kevin | 0:ed26402e7a0b | 30 | } |
kevin | 0:ed26402e7a0b | 31 | |
kevin | 0:ed26402e7a0b | 32 | int main() { |
kevin | 0:ed26402e7a0b | 33 | // 500kbit/s |
kevin | 0:ed26402e7a0b | 34 | can2.frequency(500000); |
kevin | 0:ed26402e7a0b | 35 | // activate external can transceiver |
kevin | 0:ed26402e7a0b | 36 | can_Pca82c250SlopePin = 0; |
kevin | 0:ed26402e7a0b | 37 | // every 500ms |
kevin | 0:ed26402e7a0b | 38 | ticker.attach(&send, 0.5); |
kevin | 0:ed26402e7a0b | 39 | /// create message object for message reception |
kevin | 0:ed26402e7a0b | 40 | CANMessage can_MsgRx; |
kevin | 0:ed26402e7a0b | 41 | while (1) { |
kevin | 0:ed26402e7a0b | 42 | // send received messages to the pc via serial line (9k6, 8n1) |
kevin | 0:ed26402e7a0b | 43 | if (can2.read(can_MsgRx)) { |
kevin | 0:ed26402e7a0b | 44 | printf("CanRx--> id: 0x%x dlc: %d data: ", can_MsgRx.id, can_MsgRx.len); |
kevin | 0:ed26402e7a0b | 45 | for (char i=0; i<can_MsgRx.len; i++) { |
kevin | 0:ed26402e7a0b | 46 | printf("%x ", can_MsgRx.data[i]); |
kevin | 0:ed26402e7a0b | 47 | } |
kevin | 0:ed26402e7a0b | 48 | printf("\n\r"); |
kevin | 0:ed26402e7a0b | 49 | // any incoming message: toggle led2 |
kevin | 0:ed26402e7a0b | 50 | led2 = !led2; |
kevin | 0:ed26402e7a0b | 51 | } |
kevin | 0:ed26402e7a0b | 52 | } |
kevin | 0:ed26402e7a0b | 53 | } |