Sophie Dexter
/
Just4Trionic
Just4Trionic - CAN and BDM FLASH programmer for Saab cars
Diff: CANUtils.cpp
- Revision:
- 1:d5452e398b76
- Parent:
- 0:e0b964252a05
- Child:
- 2:bf3a2b29259a
--- a/CANUtils.cpp Wed May 19 12:39:18 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,97 +0,0 @@ -// CANUtils.cpp - functions that work with the CAN bus directly -// Anything to do with the CAN bus must (should anyway) be done by one of these functions. - -#include "CANUtils.h" - -// CAN_RS pin at Philips PCA82C250 can bus controller. -// activate transceiver by pulling this pin to GND. -// (Rise and fall slope controlled by resistor R_s) -// (+5V result in tranceiver standby mode) -// For further information see datasheet page 4 -DigitalOut can_Pca82c250SlopePin(p28);// second can controller on these pins. Not used here. -// CAN can1(p9, p10); -// We use can on mbed pins 29(CAN_TXD) and 30(CAN_RXD). -CAN can2(p30, p29); -// Use a timer to see if things take too long -Timer CANTimer; - -// Use the LEDs to if anything is happening on the CAN bus -// LED1 CAN send -DigitalOut led1(LED1); -// LED2 CAN receive -DigitalOut led2(LED2); - - -void CANOpen() { - // 600kbit/s first - basically sets up CAN interface, but to wrong speed - not sure what else it does - can2.frequency(600000); - // 615kbit/s direct write of 615 kbit/s speed setting - LPC_CAN2->BTR = 0x370002; - // activate external can transceiver - can_Pca82c250SlopePin = 0; -} - -void CANClose() { - // disable external can transceiver - can_Pca82c250SlopePin = 1; -} - -// -// Sends a CAN Message, returns FALSE if the message wasn't sent in time -// -// inputs: integer CAN message 'id', pointer to 'frame', integer message length and integer timeout -// return: TRUE if the CAN message was sent before the 'timeout' expires -// FALSE if 'timeout' expires or the message length is wrong -// -extern bool CANSendTimeout (int id, char *frame, int len, int timeout) { - CANTimer.reset(); - CANTimer.start(); - while (CANTimer.read_ms() < timeout) { - if (can2.write(CANMessage(id, frame, len))) { - CANTimer.stop(); - led1 = !led1; - return TRUE; - } - } - CANTimer.stop(); - return FALSE; -} - -// -// Waits for a CAN Message with the specified 'id' for a time specified by the 'timeout' -// All other messages are ignored -// The CAN message frame is returned using the pointer to 'frame' -// -// inputs: integer CAN message 'id', pointer to 'frame' for returning the data -// integer expected length of message, len and integer for the waiting time 'timeout' -// -// return: TRUE if a qualifying message was received -// FALSE if 'timeout' expires or the message length is wrong -// -extern bool CANWaitTimeout (int id, char *frame, int len, int timeout) { - CANMessage CANMsgRx; - CANTimer.reset(); - CANTimer.start(); - while (CANTimer.read_ms() < timeout) { - if (can2.read(CANMsgRx)) { -/* - printf("w%03x8", CANMsgRx.id); - for (char i=0; i<len; i++) { - printf("%02x", CANMsgRx.data[i]); - } - printf("\n\r"); -// */ - led2 = !led2; - if (CANMsgRx.id == id) { - CANTimer.stop(); -// if (T5MsgRx.len != len) -// return FALSE; - for (int i=0; i<len; i++) - frame[i] = CANMsgRx.data[i]; - return TRUE; - } - } - } - CANTimer.stop(); - return FALSE; -}