Just4Trionic - CAN and BDM FLASH programmer for Saab cars

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }