Just4Trionic - CAN and BDM FLASH programmer for Saab cars

Dependencies:   mbed

Committer:
Just4pLeisure
Date:
Tue Sep 14 21:02:04 2010 +0000
Revision:
1:d5452e398b76
Child:
2:bf3a2b29259a

        

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