Sophie Dexter
/
Just4Trionic
Just4Trionic - CAN and BDM FLASH programmer for Saab cars
canutils.cpp@2:bf3a2b29259a, 2010-12-14 (annotated)
- Committer:
- Just4pLeisure
- Date:
- Tue Dec 14 21:50:35 2010 +0000
- Revision:
- 2:bf3a2b29259a
- Parent:
- 1:d5452e398b76
- Child:
- 3:92dae9083c83
Update for change to BDM DSO connection (and removed DS) fixed a bug that prevented BDM mode detecting Trionic 7 ECUs
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Just4pLeisure | 1:d5452e398b76 | 1 | /******************************************************************************* |
Just4pLeisure | 1:d5452e398b76 | 2 | |
Just4pLeisure | 1:d5452e398b76 | 3 | canutils.cpp |
Just4pLeisure | 1:d5452e398b76 | 4 | (c) 2010 by Sophie Dexter |
Just4pLeisure | 1:d5452e398b76 | 5 | |
Just4pLeisure | 1:d5452e398b76 | 6 | General purpose CAN bus functions for Just4Trionic by Just4pLeisure |
Just4pLeisure | 1:d5452e398b76 | 7 | Functions that work with the CAN bus directly. Anything to do with the CAN bus |
Just4pLeisure | 1:d5452e398b76 | 8 | must (should anyway) be done by one of these functions. |
Just4pLeisure | 1:d5452e398b76 | 9 | |
Just4pLeisure | 1:d5452e398b76 | 10 | ******************************************************************************** |
Just4pLeisure | 1:d5452e398b76 | 11 | |
Just4pLeisure | 1:d5452e398b76 | 12 | WARNING: Use at your own risk, sadly this software comes with no guarantees. |
Just4pLeisure | 1:d5452e398b76 | 13 | This software is provided 'free' and in good faith, but the author does not |
Just4pLeisure | 1:d5452e398b76 | 14 | accept liability for any damage arising from its use. |
Just4pLeisure | 1:d5452e398b76 | 15 | |
Just4pLeisure | 1:d5452e398b76 | 16 | *******************************************************************************/ |
Just4pLeisure | 1:d5452e398b76 | 17 | |
Just4pLeisure | 1:d5452e398b76 | 18 | #include "canutils.h" |
Just4pLeisure | 1:d5452e398b76 | 19 | |
Just4pLeisure | 1:d5452e398b76 | 20 | //CAN can2(p30, p29); |
Just4pLeisure | 1:d5452e398b76 | 21 | // Use a timer to see if things take too long |
Just4pLeisure | 1:d5452e398b76 | 22 | Timer CANTimer; |
Just4pLeisure | 1:d5452e398b76 | 23 | |
Just4pLeisure | 1:d5452e398b76 | 24 | |
Just4pLeisure | 1:d5452e398b76 | 25 | void can_open() { |
Just4pLeisure | 1:d5452e398b76 | 26 | // activate external can transceiver |
Just4pLeisure | 1:d5452e398b76 | 27 | can.reset(); |
Just4pLeisure | 1:d5452e398b76 | 28 | can_rs_pin = 0; |
Just4pLeisure | 1:d5452e398b76 | 29 | } |
Just4pLeisure | 1:d5452e398b76 | 30 | |
Just4pLeisure | 1:d5452e398b76 | 31 | void can_close() { |
Just4pLeisure | 1:d5452e398b76 | 32 | // disable external can transceiver |
Just4pLeisure | 1:d5452e398b76 | 33 | can_rs_pin = 1; |
Just4pLeisure | 1:d5452e398b76 | 34 | can.reset(); |
Just4pLeisure | 1:d5452e398b76 | 35 | } |
Just4pLeisure | 1:d5452e398b76 | 36 | |
Just4pLeisure | 1:d5452e398b76 | 37 | uint8_t can_set_speed(uint32_t speed) { |
Just4pLeisure | 1:d5452e398b76 | 38 | // 600kbit/s first - basically sets up CAN interface, but to wrong speed - not sure what else it does |
Just4pLeisure | 1:d5452e398b76 | 39 | // can.frequency(600000); |
Just4pLeisure | 1:d5452e398b76 | 40 | // 615kbit/s direct write of 615 kbit/s speed setting |
Just4pLeisure | 1:d5452e398b76 | 41 | // LPC_CAN2->BTR = 0x370002; |
Just4pLeisure | 1:d5452e398b76 | 42 | return (can.frequency(speed)) ? TERM_OK : TERM_ERR; |
Just4pLeisure | 1:d5452e398b76 | 43 | } |
Just4pLeisure | 1:d5452e398b76 | 44 | |
Just4pLeisure | 1:d5452e398b76 | 45 | |
Just4pLeisure | 1:d5452e398b76 | 46 | void show_can_message() { |
Just4pLeisure | 1:d5452e398b76 | 47 | CANMessage can_MsgRx; |
Just4pLeisure | 1:d5452e398b76 | 48 | if (can.read(can_MsgRx)) { |
Just4pLeisure | 1:d5452e398b76 | 49 | printf("w%03x%d", can_MsgRx.id, can_MsgRx.len); |
Just4pLeisure | 1:d5452e398b76 | 50 | for (char i=0; i<can_MsgRx.len; i++) { |
Just4pLeisure | 1:d5452e398b76 | 51 | printf("%02x", can_MsgRx.data[i]); |
Just4pLeisure | 1:d5452e398b76 | 52 | } |
Just4pLeisure | 1:d5452e398b76 | 53 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 54 | } |
Just4pLeisure | 1:d5452e398b76 | 55 | } |
Just4pLeisure | 1:d5452e398b76 | 56 | |
Just4pLeisure | 1:d5452e398b76 | 57 | // |
Just4pLeisure | 1:d5452e398b76 | 58 | // Sends a CAN Message, returns FALSE if the message wasn't sent in time |
Just4pLeisure | 1:d5452e398b76 | 59 | // |
Just4pLeisure | 1:d5452e398b76 | 60 | // inputs: integer CAN message 'id', pointer to 'frame', integer message length and integer timeout |
Just4pLeisure | 1:d5452e398b76 | 61 | // return: TRUE if the CAN message was sent before the 'timeout' expires |
Just4pLeisure | 1:d5452e398b76 | 62 | // FALSE if 'timeout' expires or the message length is wrong |
Just4pLeisure | 1:d5452e398b76 | 63 | // |
Just4pLeisure | 1:d5452e398b76 | 64 | extern bool can_send_timeout (uint32_t id, char *frame, uint8_t len, uint16_t timeout) { |
Just4pLeisure | 1:d5452e398b76 | 65 | CANTimer.reset(); |
Just4pLeisure | 1:d5452e398b76 | 66 | CANTimer.start(); |
Just4pLeisure | 1:d5452e398b76 | 67 | while (CANTimer.read_ms() < timeout) { |
Just4pLeisure | 1:d5452e398b76 | 68 | if (can.write(CANMessage(id, frame, len))) { |
Just4pLeisure | 1:d5452e398b76 | 69 | CANTimer.stop(); |
Just4pLeisure | 2:bf3a2b29259a | 70 | CANTXLEDON; |
Just4pLeisure | 2:bf3a2b29259a | 71 | // led1 = 1; |
Just4pLeisure | 1:d5452e398b76 | 72 | return TRUE; |
Just4pLeisure | 1:d5452e398b76 | 73 | } |
Just4pLeisure | 1:d5452e398b76 | 74 | } |
Just4pLeisure | 1:d5452e398b76 | 75 | can.reset(); |
Just4pLeisure | 1:d5452e398b76 | 76 | CANTimer.stop(); |
Just4pLeisure | 1:d5452e398b76 | 77 | return FALSE; |
Just4pLeisure | 1:d5452e398b76 | 78 | } |
Just4pLeisure | 1:d5452e398b76 | 79 | |
Just4pLeisure | 1:d5452e398b76 | 80 | // |
Just4pLeisure | 1:d5452e398b76 | 81 | // Waits for a CAN Message with the specified 'id' for a time specified by the 'timeout' |
Just4pLeisure | 1:d5452e398b76 | 82 | // All other messages are ignored |
Just4pLeisure | 1:d5452e398b76 | 83 | // The CAN message frame is returned using the pointer to 'frame' |
Just4pLeisure | 1:d5452e398b76 | 84 | // |
Just4pLeisure | 1:d5452e398b76 | 85 | // inputs: integer CAN message 'id', pointer to 'frame' for returning the data |
Just4pLeisure | 1:d5452e398b76 | 86 | // integer expected length of message, len and integer for the waiting time 'timeout' |
Just4pLeisure | 1:d5452e398b76 | 87 | // |
Just4pLeisure | 1:d5452e398b76 | 88 | // return: TRUE if a qualifying message was received |
Just4pLeisure | 1:d5452e398b76 | 89 | // FALSE if 'timeout' expires or the message length is wrong |
Just4pLeisure | 1:d5452e398b76 | 90 | // |
Just4pLeisure | 1:d5452e398b76 | 91 | extern bool can_wait_timeout (uint32_t id, char *frame, uint8_t len, uint16_t timeout) { |
Just4pLeisure | 1:d5452e398b76 | 92 | CANMessage CANMsgRx; |
Just4pLeisure | 1:d5452e398b76 | 93 | CANTimer.reset(); |
Just4pLeisure | 1:d5452e398b76 | 94 | CANTimer.start(); |
Just4pLeisure | 1:d5452e398b76 | 95 | while (CANTimer.read_ms() < timeout) { |
Just4pLeisure | 1:d5452e398b76 | 96 | if (can.read(CANMsgRx)) { |
Just4pLeisure | 1:d5452e398b76 | 97 | /* |
Just4pLeisure | 1:d5452e398b76 | 98 | printf("w%03x8", CANMsgRx.id); |
Just4pLeisure | 1:d5452e398b76 | 99 | for (char i=0; i<len; i++) { |
Just4pLeisure | 1:d5452e398b76 | 100 | printf("%02x", CANMsgRx.data[i]); |
Just4pLeisure | 1:d5452e398b76 | 101 | } |
Just4pLeisure | 1:d5452e398b76 | 102 | printf("\n\r"); |
Just4pLeisure | 1:d5452e398b76 | 103 | // */ |
Just4pLeisure | 2:bf3a2b29259a | 104 | CANRXLEDON; |
Just4pLeisure | 2:bf3a2b29259a | 105 | // led2 = 1; |
Just4pLeisure | 1:d5452e398b76 | 106 | if (CANMsgRx.id == id) { |
Just4pLeisure | 1:d5452e398b76 | 107 | CANTimer.stop(); |
Just4pLeisure | 1:d5452e398b76 | 108 | // if (T5MsgRx.len != len) |
Just4pLeisure | 1:d5452e398b76 | 109 | // return FALSE; |
Just4pLeisure | 1:d5452e398b76 | 110 | for (int i=0; i<len; i++) |
Just4pLeisure | 1:d5452e398b76 | 111 | frame[i] = CANMsgRx.data[i]; |
Just4pLeisure | 1:d5452e398b76 | 112 | return TRUE; |
Just4pLeisure | 1:d5452e398b76 | 113 | } |
Just4pLeisure | 1:d5452e398b76 | 114 | } |
Just4pLeisure | 1:d5452e398b76 | 115 | } |
Just4pLeisure | 1:d5452e398b76 | 116 | can.reset(); |
Just4pLeisure | 1:d5452e398b76 | 117 | CANTimer.stop(); |
Just4pLeisure | 1:d5452e398b76 | 118 | return FALSE; |
Just4pLeisure | 1:d5452e398b76 | 119 | } |