Sophie Dexter
/
Just4Trionic
Just4Trionic - CAN and BDM FLASH programmer for Saab cars
canutils.cpp@3:92dae9083c83, 2011-06-07 (annotated)
- Committer:
- Just4pLeisure
- Date:
- Tue Jun 07 12:23:28 2011 +0000
- Revision:
- 3:92dae9083c83
- Parent:
- 2:bf3a2b29259a
- Child:
- 4:682d96ff6d79
Basic T7 CAN DUMP and FLASH for P-BUS connection only
Requires MyBooty V2.x for T5 CAN FLASHing at 1 Mbps
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 | 3:92dae9083c83 | 45 | // |
Just4pLeisure | 3:92dae9083c83 | 46 | // show_can_message |
Just4pLeisure | 3:92dae9083c83 | 47 | // |
Just4pLeisure | 3:92dae9083c83 | 48 | // Displays a CAN message in the RX buffer if there is one. |
Just4pLeisure | 3:92dae9083c83 | 49 | // |
Just4pLeisure | 3:92dae9083c83 | 50 | // inputs: none |
Just4pLeisure | 3:92dae9083c83 | 51 | // return: bool TRUE if there was a message, FALSE if no message. |
Just4pLeisure | 3:92dae9083c83 | 52 | // |
Just4pLeisure | 3:92dae9083c83 | 53 | extern void show_can_message() { |
Just4pLeisure | 1:d5452e398b76 | 54 | CANMessage can_MsgRx; |
Just4pLeisure | 1:d5452e398b76 | 55 | if (can.read(can_MsgRx)) { |
Just4pLeisure | 3:92dae9083c83 | 56 | CANRXLEDON; |
Just4pLeisure | 1:d5452e398b76 | 57 | printf("w%03x%d", can_MsgRx.id, can_MsgRx.len); |
Just4pLeisure | 3:92dae9083c83 | 58 | for (char i=0; i<can_MsgRx.len; i++) |
Just4pLeisure | 1:d5452e398b76 | 59 | printf("%02x", can_MsgRx.data[i]); |
Just4pLeisure | 3:92dae9083c83 | 60 | printf(" %c ", can_MsgRx.data[2]); |
Just4pLeisure | 1:d5452e398b76 | 61 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 62 | } |
Just4pLeisure | 3:92dae9083c83 | 63 | return; |
Just4pLeisure | 3:92dae9083c83 | 64 | } |
Just4pLeisure | 3:92dae9083c83 | 65 | |
Just4pLeisure | 3:92dae9083c83 | 66 | // |
Just4pLeisure | 3:92dae9083c83 | 67 | // silent_can_message |
Just4pLeisure | 3:92dae9083c83 | 68 | // |
Just4pLeisure | 3:92dae9083c83 | 69 | // Turns on the CAN receive LED if there is a CAN message |
Just4pLeisure | 3:92dae9083c83 | 70 | // but doesn't displays anything. |
Just4pLeisure | 3:92dae9083c83 | 71 | // |
Just4pLeisure | 3:92dae9083c83 | 72 | // inputs: none |
Just4pLeisure | 3:92dae9083c83 | 73 | // return: bool TRUE if there was a message, FALSE if no message. |
Just4pLeisure | 3:92dae9083c83 | 74 | // |
Just4pLeisure | 3:92dae9083c83 | 75 | extern void silent_can_message() { |
Just4pLeisure | 3:92dae9083c83 | 76 | CANMessage can_MsgRx; |
Just4pLeisure | 3:92dae9083c83 | 77 | if (can.read(can_MsgRx)) { |
Just4pLeisure | 3:92dae9083c83 | 78 | CANRXLEDON; |
Just4pLeisure | 3:92dae9083c83 | 79 | } |
Just4pLeisure | 3:92dae9083c83 | 80 | return; |
Just4pLeisure | 1:d5452e398b76 | 81 | } |
Just4pLeisure | 1:d5452e398b76 | 82 | |
Just4pLeisure | 1:d5452e398b76 | 83 | // |
Just4pLeisure | 1:d5452e398b76 | 84 | // Sends a CAN Message, returns FALSE if the message wasn't sent in time |
Just4pLeisure | 1:d5452e398b76 | 85 | // |
Just4pLeisure | 1:d5452e398b76 | 86 | // inputs: integer CAN message 'id', pointer to 'frame', integer message length and integer timeout |
Just4pLeisure | 1:d5452e398b76 | 87 | // return: TRUE if the CAN message was sent before the 'timeout' expires |
Just4pLeisure | 1:d5452e398b76 | 88 | // FALSE if 'timeout' expires or the message length is wrong |
Just4pLeisure | 1:d5452e398b76 | 89 | // |
Just4pLeisure | 1:d5452e398b76 | 90 | extern bool can_send_timeout (uint32_t id, char *frame, uint8_t len, uint16_t timeout) { |
Just4pLeisure | 1:d5452e398b76 | 91 | CANTimer.reset(); |
Just4pLeisure | 1:d5452e398b76 | 92 | CANTimer.start(); |
Just4pLeisure | 1:d5452e398b76 | 93 | while (CANTimer.read_ms() < timeout) { |
Just4pLeisure | 1:d5452e398b76 | 94 | if (can.write(CANMessage(id, frame, len))) { |
Just4pLeisure | 1:d5452e398b76 | 95 | CANTimer.stop(); |
Just4pLeisure | 2:bf3a2b29259a | 96 | CANTXLEDON; |
Just4pLeisure | 2:bf3a2b29259a | 97 | // led1 = 1; |
Just4pLeisure | 1:d5452e398b76 | 98 | return TRUE; |
Just4pLeisure | 1:d5452e398b76 | 99 | } |
Just4pLeisure | 1:d5452e398b76 | 100 | } |
Just4pLeisure | 1:d5452e398b76 | 101 | can.reset(); |
Just4pLeisure | 1:d5452e398b76 | 102 | CANTimer.stop(); |
Just4pLeisure | 1:d5452e398b76 | 103 | return FALSE; |
Just4pLeisure | 1:d5452e398b76 | 104 | } |
Just4pLeisure | 1:d5452e398b76 | 105 | |
Just4pLeisure | 1:d5452e398b76 | 106 | // |
Just4pLeisure | 1:d5452e398b76 | 107 | // Waits for a CAN Message with the specified 'id' for a time specified by the 'timeout' |
Just4pLeisure | 1:d5452e398b76 | 108 | // All other messages are ignored |
Just4pLeisure | 1:d5452e398b76 | 109 | // The CAN message frame is returned using the pointer to 'frame' |
Just4pLeisure | 1:d5452e398b76 | 110 | // |
Just4pLeisure | 1:d5452e398b76 | 111 | // inputs: integer CAN message 'id', pointer to 'frame' for returning the data |
Just4pLeisure | 1:d5452e398b76 | 112 | // integer expected length of message, len and integer for the waiting time 'timeout' |
Just4pLeisure | 1:d5452e398b76 | 113 | // |
Just4pLeisure | 1:d5452e398b76 | 114 | // return: TRUE if a qualifying message was received |
Just4pLeisure | 1:d5452e398b76 | 115 | // FALSE if 'timeout' expires or the message length is wrong |
Just4pLeisure | 1:d5452e398b76 | 116 | // |
Just4pLeisure | 1:d5452e398b76 | 117 | extern bool can_wait_timeout (uint32_t id, char *frame, uint8_t len, uint16_t timeout) { |
Just4pLeisure | 1:d5452e398b76 | 118 | CANMessage CANMsgRx; |
Just4pLeisure | 1:d5452e398b76 | 119 | CANTimer.reset(); |
Just4pLeisure | 1:d5452e398b76 | 120 | CANTimer.start(); |
Just4pLeisure | 1:d5452e398b76 | 121 | while (CANTimer.read_ms() < timeout) { |
Just4pLeisure | 1:d5452e398b76 | 122 | if (can.read(CANMsgRx)) { |
Just4pLeisure | 1:d5452e398b76 | 123 | /* |
Just4pLeisure | 1:d5452e398b76 | 124 | printf("w%03x8", CANMsgRx.id); |
Just4pLeisure | 1:d5452e398b76 | 125 | for (char i=0; i<len; i++) { |
Just4pLeisure | 1:d5452e398b76 | 126 | printf("%02x", CANMsgRx.data[i]); |
Just4pLeisure | 1:d5452e398b76 | 127 | } |
Just4pLeisure | 1:d5452e398b76 | 128 | printf("\n\r"); |
Just4pLeisure | 1:d5452e398b76 | 129 | // */ |
Just4pLeisure | 2:bf3a2b29259a | 130 | CANRXLEDON; |
Just4pLeisure | 2:bf3a2b29259a | 131 | // led2 = 1; |
Just4pLeisure | 1:d5452e398b76 | 132 | if (CANMsgRx.id == id) { |
Just4pLeisure | 1:d5452e398b76 | 133 | CANTimer.stop(); |
Just4pLeisure | 1:d5452e398b76 | 134 | // if (T5MsgRx.len != len) |
Just4pLeisure | 1:d5452e398b76 | 135 | // return FALSE; |
Just4pLeisure | 1:d5452e398b76 | 136 | for (int i=0; i<len; i++) |
Just4pLeisure | 1:d5452e398b76 | 137 | frame[i] = CANMsgRx.data[i]; |
Just4pLeisure | 1:d5452e398b76 | 138 | return TRUE; |
Just4pLeisure | 1:d5452e398b76 | 139 | } |
Just4pLeisure | 1:d5452e398b76 | 140 | } |
Just4pLeisure | 1:d5452e398b76 | 141 | } |
Just4pLeisure | 1:d5452e398b76 | 142 | can.reset(); |
Just4pLeisure | 1:d5452e398b76 | 143 | CANTimer.stop(); |
Just4pLeisure | 1:d5452e398b76 | 144 | return FALSE; |
Just4pLeisure | 1:d5452e398b76 | 145 | } |