Just4Trionic - CAN and BDM FLASH programmer for Saab cars

Dependencies:   mbed

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?

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