Sophie Dexter
/
Just4Trionic
Just4Trionic - CAN and BDM FLASH programmer for Saab cars
canutils.cpp@1:d5452e398b76, 2010-09-14 (annotated)
- Committer:
- Just4pLeisure
- Date:
- Tue Sep 14 21:02:04 2010 +0000
- Revision:
- 1:d5452e398b76
- Child:
- 2:bf3a2b29259a
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 | 1:d5452e398b76 | 70 | led1 = 1; |
Just4pLeisure | 1:d5452e398b76 | 71 | return TRUE; |
Just4pLeisure | 1:d5452e398b76 | 72 | } |
Just4pLeisure | 1:d5452e398b76 | 73 | } |
Just4pLeisure | 1:d5452e398b76 | 74 | can.reset(); |
Just4pLeisure | 1:d5452e398b76 | 75 | CANTimer.stop(); |
Just4pLeisure | 1:d5452e398b76 | 76 | return FALSE; |
Just4pLeisure | 1:d5452e398b76 | 77 | } |
Just4pLeisure | 1:d5452e398b76 | 78 | |
Just4pLeisure | 1:d5452e398b76 | 79 | // |
Just4pLeisure | 1:d5452e398b76 | 80 | // Waits for a CAN Message with the specified 'id' for a time specified by the 'timeout' |
Just4pLeisure | 1:d5452e398b76 | 81 | // All other messages are ignored |
Just4pLeisure | 1:d5452e398b76 | 82 | // The CAN message frame is returned using the pointer to 'frame' |
Just4pLeisure | 1:d5452e398b76 | 83 | // |
Just4pLeisure | 1:d5452e398b76 | 84 | // inputs: integer CAN message 'id', pointer to 'frame' for returning the data |
Just4pLeisure | 1:d5452e398b76 | 85 | // integer expected length of message, len and integer for the waiting time 'timeout' |
Just4pLeisure | 1:d5452e398b76 | 86 | // |
Just4pLeisure | 1:d5452e398b76 | 87 | // return: TRUE if a qualifying message was received |
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_wait_timeout (uint32_t id, char *frame, uint8_t len, uint16_t timeout) { |
Just4pLeisure | 1:d5452e398b76 | 91 | CANMessage CANMsgRx; |
Just4pLeisure | 1:d5452e398b76 | 92 | CANTimer.reset(); |
Just4pLeisure | 1:d5452e398b76 | 93 | CANTimer.start(); |
Just4pLeisure | 1:d5452e398b76 | 94 | while (CANTimer.read_ms() < timeout) { |
Just4pLeisure | 1:d5452e398b76 | 95 | if (can.read(CANMsgRx)) { |
Just4pLeisure | 1:d5452e398b76 | 96 | /* |
Just4pLeisure | 1:d5452e398b76 | 97 | printf("w%03x8", CANMsgRx.id); |
Just4pLeisure | 1:d5452e398b76 | 98 | for (char i=0; i<len; i++) { |
Just4pLeisure | 1:d5452e398b76 | 99 | printf("%02x", CANMsgRx.data[i]); |
Just4pLeisure | 1:d5452e398b76 | 100 | } |
Just4pLeisure | 1:d5452e398b76 | 101 | printf("\n\r"); |
Just4pLeisure | 1:d5452e398b76 | 102 | // */ |
Just4pLeisure | 1:d5452e398b76 | 103 | led2 = 1; |
Just4pLeisure | 1:d5452e398b76 | 104 | if (CANMsgRx.id == id) { |
Just4pLeisure | 1:d5452e398b76 | 105 | CANTimer.stop(); |
Just4pLeisure | 1:d5452e398b76 | 106 | // if (T5MsgRx.len != len) |
Just4pLeisure | 1:d5452e398b76 | 107 | // return FALSE; |
Just4pLeisure | 1:d5452e398b76 | 108 | for (int i=0; i<len; i++) |
Just4pLeisure | 1:d5452e398b76 | 109 | frame[i] = CANMsgRx.data[i]; |
Just4pLeisure | 1:d5452e398b76 | 110 | return TRUE; |
Just4pLeisure | 1:d5452e398b76 | 111 | } |
Just4pLeisure | 1:d5452e398b76 | 112 | } |
Just4pLeisure | 1:d5452e398b76 | 113 | } |
Just4pLeisure | 1:d5452e398b76 | 114 | can.reset(); |
Just4pLeisure | 1:d5452e398b76 | 115 | CANTimer.stop(); |
Just4pLeisure | 1:d5452e398b76 | 116 | return FALSE; |
Just4pLeisure | 1:d5452e398b76 | 117 | } |