Just4Trionic - CAN and BDM FLASH programmer for Saab cars

Dependencies:   mbed

Committer:
Just4pLeisure
Date:
Wed May 19 12:39:18 2010 +0000
Revision:
0:e0b964252a05

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Just4pLeisure 0:e0b964252a05 1 // CANUtils.cpp - functions that work with the CAN bus directly
Just4pLeisure 0:e0b964252a05 2 // Anything to do with the CAN bus must (should anyway) be done by one of these functions.
Just4pLeisure 0:e0b964252a05 3
Just4pLeisure 0:e0b964252a05 4 #include "CANUtils.h"
Just4pLeisure 0:e0b964252a05 5
Just4pLeisure 0:e0b964252a05 6 // CAN_RS pin at Philips PCA82C250 can bus controller.
Just4pLeisure 0:e0b964252a05 7 // activate transceiver by pulling this pin to GND.
Just4pLeisure 0:e0b964252a05 8 // (Rise and fall slope controlled by resistor R_s)
Just4pLeisure 0:e0b964252a05 9 // (+5V result in tranceiver standby mode)
Just4pLeisure 0:e0b964252a05 10 // For further information see datasheet page 4
Just4pLeisure 0:e0b964252a05 11 DigitalOut can_Pca82c250SlopePin(p28);// second can controller on these pins. Not used here.
Just4pLeisure 0:e0b964252a05 12 // CAN can1(p9, p10);
Just4pLeisure 0:e0b964252a05 13 // We use can on mbed pins 29(CAN_TXD) and 30(CAN_RXD).
Just4pLeisure 0:e0b964252a05 14 CAN can2(p30, p29);
Just4pLeisure 0:e0b964252a05 15 // Use a timer to see if things take too long
Just4pLeisure 0:e0b964252a05 16 Timer CANTimer;
Just4pLeisure 0:e0b964252a05 17
Just4pLeisure 0:e0b964252a05 18 // Use the LEDs to if anything is happening on the CAN bus
Just4pLeisure 0:e0b964252a05 19 // LED1 CAN send
Just4pLeisure 0:e0b964252a05 20 DigitalOut led1(LED1);
Just4pLeisure 0:e0b964252a05 21 // LED2 CAN receive
Just4pLeisure 0:e0b964252a05 22 DigitalOut led2(LED2);
Just4pLeisure 0:e0b964252a05 23
Just4pLeisure 0:e0b964252a05 24
Just4pLeisure 0:e0b964252a05 25 void CANOpen() {
Just4pLeisure 0:e0b964252a05 26 // 600kbit/s first - basically sets up CAN interface, but to wrong speed - not sure what else it does
Just4pLeisure 0:e0b964252a05 27 can2.frequency(600000);
Just4pLeisure 0:e0b964252a05 28 // 615kbit/s direct write of 615 kbit/s speed setting
Just4pLeisure 0:e0b964252a05 29 LPC_CAN2->BTR = 0x370002;
Just4pLeisure 0:e0b964252a05 30 // activate external can transceiver
Just4pLeisure 0:e0b964252a05 31 can_Pca82c250SlopePin = 0;
Just4pLeisure 0:e0b964252a05 32 }
Just4pLeisure 0:e0b964252a05 33
Just4pLeisure 0:e0b964252a05 34 void CANClose() {
Just4pLeisure 0:e0b964252a05 35 // disable external can transceiver
Just4pLeisure 0:e0b964252a05 36 can_Pca82c250SlopePin = 1;
Just4pLeisure 0:e0b964252a05 37 }
Just4pLeisure 0:e0b964252a05 38
Just4pLeisure 0:e0b964252a05 39 //
Just4pLeisure 0:e0b964252a05 40 // Sends a CAN Message, returns FALSE if the message wasn't sent in time
Just4pLeisure 0:e0b964252a05 41 //
Just4pLeisure 0:e0b964252a05 42 // inputs: integer CAN message 'id', pointer to 'frame', integer message length and integer timeout
Just4pLeisure 0:e0b964252a05 43 // return: TRUE if the CAN message was sent before the 'timeout' expires
Just4pLeisure 0:e0b964252a05 44 // FALSE if 'timeout' expires or the message length is wrong
Just4pLeisure 0:e0b964252a05 45 //
Just4pLeisure 0:e0b964252a05 46 extern bool CANSendTimeout (int id, char *frame, int len, int timeout) {
Just4pLeisure 0:e0b964252a05 47 CANTimer.reset();
Just4pLeisure 0:e0b964252a05 48 CANTimer.start();
Just4pLeisure 0:e0b964252a05 49 while (CANTimer.read_ms() < timeout) {
Just4pLeisure 0:e0b964252a05 50 if (can2.write(CANMessage(id, frame, len))) {
Just4pLeisure 0:e0b964252a05 51 CANTimer.stop();
Just4pLeisure 0:e0b964252a05 52 led1 = !led1;
Just4pLeisure 0:e0b964252a05 53 return TRUE;
Just4pLeisure 0:e0b964252a05 54 }
Just4pLeisure 0:e0b964252a05 55 }
Just4pLeisure 0:e0b964252a05 56 CANTimer.stop();
Just4pLeisure 0:e0b964252a05 57 return FALSE;
Just4pLeisure 0:e0b964252a05 58 }
Just4pLeisure 0:e0b964252a05 59
Just4pLeisure 0:e0b964252a05 60 //
Just4pLeisure 0:e0b964252a05 61 // Waits for a CAN Message with the specified 'id' for a time specified by the 'timeout'
Just4pLeisure 0:e0b964252a05 62 // All other messages are ignored
Just4pLeisure 0:e0b964252a05 63 // The CAN message frame is returned using the pointer to 'frame'
Just4pLeisure 0:e0b964252a05 64 //
Just4pLeisure 0:e0b964252a05 65 // inputs: integer CAN message 'id', pointer to 'frame' for returning the data
Just4pLeisure 0:e0b964252a05 66 // integer expected length of message, len and integer for the waiting time 'timeout'
Just4pLeisure 0:e0b964252a05 67 //
Just4pLeisure 0:e0b964252a05 68 // return: TRUE if a qualifying message was received
Just4pLeisure 0:e0b964252a05 69 // FALSE if 'timeout' expires or the message length is wrong
Just4pLeisure 0:e0b964252a05 70 //
Just4pLeisure 0:e0b964252a05 71 extern bool CANWaitTimeout (int id, char *frame, int len, int timeout) {
Just4pLeisure 0:e0b964252a05 72 CANMessage CANMsgRx;
Just4pLeisure 0:e0b964252a05 73 CANTimer.reset();
Just4pLeisure 0:e0b964252a05 74 CANTimer.start();
Just4pLeisure 0:e0b964252a05 75 while (CANTimer.read_ms() < timeout) {
Just4pLeisure 0:e0b964252a05 76 if (can2.read(CANMsgRx)) {
Just4pLeisure 0:e0b964252a05 77 /*
Just4pLeisure 0:e0b964252a05 78 printf("w%03x8", CANMsgRx.id);
Just4pLeisure 0:e0b964252a05 79 for (char i=0; i<len; i++) {
Just4pLeisure 0:e0b964252a05 80 printf("%02x", CANMsgRx.data[i]);
Just4pLeisure 0:e0b964252a05 81 }
Just4pLeisure 0:e0b964252a05 82 printf("\n\r");
Just4pLeisure 0:e0b964252a05 83 // */
Just4pLeisure 0:e0b964252a05 84 led2 = !led2;
Just4pLeisure 0:e0b964252a05 85 if (CANMsgRx.id == id) {
Just4pLeisure 0:e0b964252a05 86 CANTimer.stop();
Just4pLeisure 0:e0b964252a05 87 // if (T5MsgRx.len != len)
Just4pLeisure 0:e0b964252a05 88 // return FALSE;
Just4pLeisure 0:e0b964252a05 89 for (int i=0; i<len; i++)
Just4pLeisure 0:e0b964252a05 90 frame[i] = CANMsgRx.data[i];
Just4pLeisure 0:e0b964252a05 91 return TRUE;
Just4pLeisure 0:e0b964252a05 92 }
Just4pLeisure 0:e0b964252a05 93 }
Just4pLeisure 0:e0b964252a05 94 }
Just4pLeisure 0:e0b964252a05 95 CANTimer.stop();
Just4pLeisure 0:e0b964252a05 96 return FALSE;
Just4pLeisure 0:e0b964252a05 97 }