Sophie Dexter
/
Just4Trionic
Just4Trionic - CAN and BDM FLASH programmer for Saab cars
CANUtils.cpp@0:e0b964252a05, 2010-05-19 (annotated)
- Committer:
- Just4pLeisure
- Date:
- Wed May 19 12:39:18 2010 +0000
- Revision:
- 0:e0b964252a05
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Just4pLeisure | 0:e0b964252a05 | 1 | // CANUtils.cpp - functions that work with the CAN bus directly |
Just4pLeisure | 0:e0b964252a05 | 2 | // Anything to do with the CAN bus must (should anyway) be done by one of these functions. |
Just4pLeisure | 0:e0b964252a05 | 3 | |
Just4pLeisure | 0:e0b964252a05 | 4 | #include "CANUtils.h" |
Just4pLeisure | 0:e0b964252a05 | 5 | |
Just4pLeisure | 0:e0b964252a05 | 6 | // CAN_RS pin at Philips PCA82C250 can bus controller. |
Just4pLeisure | 0:e0b964252a05 | 7 | // activate transceiver by pulling this pin to GND. |
Just4pLeisure | 0:e0b964252a05 | 8 | // (Rise and fall slope controlled by resistor R_s) |
Just4pLeisure | 0:e0b964252a05 | 9 | // (+5V result in tranceiver standby mode) |
Just4pLeisure | 0:e0b964252a05 | 10 | // For further information see datasheet page 4 |
Just4pLeisure | 0:e0b964252a05 | 11 | DigitalOut can_Pca82c250SlopePin(p28);// second can controller on these pins. Not used here. |
Just4pLeisure | 0:e0b964252a05 | 12 | // CAN can1(p9, p10); |
Just4pLeisure | 0:e0b964252a05 | 13 | // We use can on mbed pins 29(CAN_TXD) and 30(CAN_RXD). |
Just4pLeisure | 0:e0b964252a05 | 14 | CAN can2(p30, p29); |
Just4pLeisure | 0:e0b964252a05 | 15 | // Use a timer to see if things take too long |
Just4pLeisure | 0:e0b964252a05 | 16 | Timer CANTimer; |
Just4pLeisure | 0:e0b964252a05 | 17 | |
Just4pLeisure | 0:e0b964252a05 | 18 | // Use the LEDs to if anything is happening on the CAN bus |
Just4pLeisure | 0:e0b964252a05 | 19 | // LED1 CAN send |
Just4pLeisure | 0:e0b964252a05 | 20 | DigitalOut led1(LED1); |
Just4pLeisure | 0:e0b964252a05 | 21 | // LED2 CAN receive |
Just4pLeisure | 0:e0b964252a05 | 22 | DigitalOut led2(LED2); |
Just4pLeisure | 0:e0b964252a05 | 23 | |
Just4pLeisure | 0:e0b964252a05 | 24 | |
Just4pLeisure | 0:e0b964252a05 | 25 | void CANOpen() { |
Just4pLeisure | 0:e0b964252a05 | 26 | // 600kbit/s first - basically sets up CAN interface, but to wrong speed - not sure what else it does |
Just4pLeisure | 0:e0b964252a05 | 27 | can2.frequency(600000); |
Just4pLeisure | 0:e0b964252a05 | 28 | // 615kbit/s direct write of 615 kbit/s speed setting |
Just4pLeisure | 0:e0b964252a05 | 29 | LPC_CAN2->BTR = 0x370002; |
Just4pLeisure | 0:e0b964252a05 | 30 | // activate external can transceiver |
Just4pLeisure | 0:e0b964252a05 | 31 | can_Pca82c250SlopePin = 0; |
Just4pLeisure | 0:e0b964252a05 | 32 | } |
Just4pLeisure | 0:e0b964252a05 | 33 | |
Just4pLeisure | 0:e0b964252a05 | 34 | void CANClose() { |
Just4pLeisure | 0:e0b964252a05 | 35 | // disable external can transceiver |
Just4pLeisure | 0:e0b964252a05 | 36 | can_Pca82c250SlopePin = 1; |
Just4pLeisure | 0:e0b964252a05 | 37 | } |
Just4pLeisure | 0:e0b964252a05 | 38 | |
Just4pLeisure | 0:e0b964252a05 | 39 | // |
Just4pLeisure | 0:e0b964252a05 | 40 | // Sends a CAN Message, returns FALSE if the message wasn't sent in time |
Just4pLeisure | 0:e0b964252a05 | 41 | // |
Just4pLeisure | 0:e0b964252a05 | 42 | // inputs: integer CAN message 'id', pointer to 'frame', integer message length and integer timeout |
Just4pLeisure | 0:e0b964252a05 | 43 | // return: TRUE if the CAN message was sent before the 'timeout' expires |
Just4pLeisure | 0:e0b964252a05 | 44 | // FALSE if 'timeout' expires or the message length is wrong |
Just4pLeisure | 0:e0b964252a05 | 45 | // |
Just4pLeisure | 0:e0b964252a05 | 46 | extern bool CANSendTimeout (int id, char *frame, int len, int timeout) { |
Just4pLeisure | 0:e0b964252a05 | 47 | CANTimer.reset(); |
Just4pLeisure | 0:e0b964252a05 | 48 | CANTimer.start(); |
Just4pLeisure | 0:e0b964252a05 | 49 | while (CANTimer.read_ms() < timeout) { |
Just4pLeisure | 0:e0b964252a05 | 50 | if (can2.write(CANMessage(id, frame, len))) { |
Just4pLeisure | 0:e0b964252a05 | 51 | CANTimer.stop(); |
Just4pLeisure | 0:e0b964252a05 | 52 | led1 = !led1; |
Just4pLeisure | 0:e0b964252a05 | 53 | return TRUE; |
Just4pLeisure | 0:e0b964252a05 | 54 | } |
Just4pLeisure | 0:e0b964252a05 | 55 | } |
Just4pLeisure | 0:e0b964252a05 | 56 | CANTimer.stop(); |
Just4pLeisure | 0:e0b964252a05 | 57 | return FALSE; |
Just4pLeisure | 0:e0b964252a05 | 58 | } |
Just4pLeisure | 0:e0b964252a05 | 59 | |
Just4pLeisure | 0:e0b964252a05 | 60 | // |
Just4pLeisure | 0:e0b964252a05 | 61 | // Waits for a CAN Message with the specified 'id' for a time specified by the 'timeout' |
Just4pLeisure | 0:e0b964252a05 | 62 | // All other messages are ignored |
Just4pLeisure | 0:e0b964252a05 | 63 | // The CAN message frame is returned using the pointer to 'frame' |
Just4pLeisure | 0:e0b964252a05 | 64 | // |
Just4pLeisure | 0:e0b964252a05 | 65 | // inputs: integer CAN message 'id', pointer to 'frame' for returning the data |
Just4pLeisure | 0:e0b964252a05 | 66 | // integer expected length of message, len and integer for the waiting time 'timeout' |
Just4pLeisure | 0:e0b964252a05 | 67 | // |
Just4pLeisure | 0:e0b964252a05 | 68 | // return: TRUE if a qualifying message was received |
Just4pLeisure | 0:e0b964252a05 | 69 | // FALSE if 'timeout' expires or the message length is wrong |
Just4pLeisure | 0:e0b964252a05 | 70 | // |
Just4pLeisure | 0:e0b964252a05 | 71 | extern bool CANWaitTimeout (int id, char *frame, int len, int timeout) { |
Just4pLeisure | 0:e0b964252a05 | 72 | CANMessage CANMsgRx; |
Just4pLeisure | 0:e0b964252a05 | 73 | CANTimer.reset(); |
Just4pLeisure | 0:e0b964252a05 | 74 | CANTimer.start(); |
Just4pLeisure | 0:e0b964252a05 | 75 | while (CANTimer.read_ms() < timeout) { |
Just4pLeisure | 0:e0b964252a05 | 76 | if (can2.read(CANMsgRx)) { |
Just4pLeisure | 0:e0b964252a05 | 77 | /* |
Just4pLeisure | 0:e0b964252a05 | 78 | printf("w%03x8", CANMsgRx.id); |
Just4pLeisure | 0:e0b964252a05 | 79 | for (char i=0; i<len; i++) { |
Just4pLeisure | 0:e0b964252a05 | 80 | printf("%02x", CANMsgRx.data[i]); |
Just4pLeisure | 0:e0b964252a05 | 81 | } |
Just4pLeisure | 0:e0b964252a05 | 82 | printf("\n\r"); |
Just4pLeisure | 0:e0b964252a05 | 83 | // */ |
Just4pLeisure | 0:e0b964252a05 | 84 | led2 = !led2; |
Just4pLeisure | 0:e0b964252a05 | 85 | if (CANMsgRx.id == id) { |
Just4pLeisure | 0:e0b964252a05 | 86 | CANTimer.stop(); |
Just4pLeisure | 0:e0b964252a05 | 87 | // if (T5MsgRx.len != len) |
Just4pLeisure | 0:e0b964252a05 | 88 | // return FALSE; |
Just4pLeisure | 0:e0b964252a05 | 89 | for (int i=0; i<len; i++) |
Just4pLeisure | 0:e0b964252a05 | 90 | frame[i] = CANMsgRx.data[i]; |
Just4pLeisure | 0:e0b964252a05 | 91 | return TRUE; |
Just4pLeisure | 0:e0b964252a05 | 92 | } |
Just4pLeisure | 0:e0b964252a05 | 93 | } |
Just4pLeisure | 0:e0b964252a05 | 94 | } |
Just4pLeisure | 0:e0b964252a05 | 95 | CANTimer.stop(); |
Just4pLeisure | 0:e0b964252a05 | 96 | return FALSE; |
Just4pLeisure | 0:e0b964252a05 | 97 | } |