Dual CANbus monitor and instrumentation cluster

Eagle Schematic and Board design

/media/uploads/TickTock/canaryr5.zip

/media/uploads/TickTock/sch_r4.jpg /media/uploads/TickTock/lcdsch.jpg /media/uploads/TickTock/brd_r4.jpg

Parts List

qtyinstancepart #packagesupplierDescription
1BAT3Vhttp://www.ebay.com/itm/10x-CR2032-SMD-Battery-Holder-for-CR2032-Battery-/180938057979?pt=LH_DefaultDomain_0&hash=item2a20bfa8fbLithium 2032 coin battery holder
4C1-C4ECST1DC106R6032Tantalium capacitor 10uF
3FC1-FC3ZF1-20-01-T-WThttp://www.samtec.com/cable-systems/idc-ffc/ffc/zero-insertion.aspx20 conductor 1mm pitch flex cable connector (optional)
1FJ-20-R-08.00-4http://www.samtec.com/cable-systems/idc-ffc/ffc/zero-insertion.aspx8\" 20 conductor 1mm pitch flex connector, end reversed (optional)
2H1-H4(DON'T populate H1-H4 headers - solder mbed directly)
1H5http://www.ebay.com/itm/221186042943?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l26491x12 .1\" pitch header (optional)
1H62x6 .1\" pitch header (optional)
2IC1,IC2VP230LMDSOP8http://www.ebay.com/itm/130488665247?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649canbus transciever
1IC3LM1117-5VSOT2235V regulator
5JP*2 pin .1\" jumper header
1mbedLPC1768http://www.ebay.com/itm/200830573509?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649mbed uC
2Q1,Q22N2222SOT23General purpose NPN transistor
1R1R392M12063.9K resistor
4R2,R4-R6R102M12061K resistor
1R3R500M120650 Ohm resistor
2TR1-TR5ZJYS81R5-2PL51TG01http://www.digikey.com/product-detail/en/ZJYS81R5-2PL51T-G01/445-2223-1-ND/765232CM Choke
1Z11N5340BGC1702-15http://www.ebay.com/itm/150878122425?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l26496V, 5W Zener Diode
1X1USBhttp://www.ebay.com/itm/New-Vertical-USB-2-0-A-pcb-connector-socket-USB-A-Type-/300553895292?pt=LH_DefaultDomain_0&hash=item45fa687d7cvertical USB connector
2LCD0,LCD1TFThttp://www.mikroe.com/add-on-boards/display/tft-proto/320x240 LCD with touch screen

Assembly

1) LCD Displays

I found ribbon cable is a nice way to organize the wires to the displays. You'll need 12 conductors and I connected them in the following order:

1LED+
2LED-
3RSTB
4MOSI
5SCLK
6CSB
7X+
8X-
9Y+
10Y-
11VDD
12GND

First I connected all the GND connections (IM0, IM1, IM3, & 2 GND). Do not connect the bottom GND until you have the ribbon cable connected. After making all the ribbon cable connections (connecting the GND of the ribbon cable to the bottom GND pad), solder the GND bar from the previous step to the back of the bottom GND connection. Finally, make a connection from the back side 3.3V pin to IM2. Take a break and repeat for the second display. /media/uploads/TickTock/lcdtop.jpg /media/uploads/TickTock/lcdbot.jpg Once the two displays are complete combine all wires except CS0, CS1, X+, X-, Y+, and Y-. Connect X- of the left display to X+ of the right. Similarly connect Y- of the left display to Y+ of the right. Insulate any exposed wires.

2) PCB

Refer to the schematics to place all the components on the board. If you plan to install into the CANary 3D enclosure, DO NOT install the battery holder or the socket for the mbed and, instead, connect two wires to the VB and GND pads nearby. You will have to install the battery holder against the back wall to avoid interfering with the right-hand display and the mbed will have to be directly soldered. I have not found a socket with a low enough profile to fit in the space provided (depth of enclosure is limited by the space behind the center console). Also, I recommend keeping as much lead as possible on the Zener diode (bending it as shown to clear the back wall). Although it is operating well within parameters, the Zener gets quite hot during extended operation and the leads help dissipate the heat and keep it away from the PCB and other components.

/media/uploads/TickTock/pcbtop.jpg /media/uploads/TickTock/pcbbot.jpg

Once the PCB is populated, solder the LCDs to the PCB. CS0 connects to the right display and CS1 connects to the left. /media/uploads/TickTock/brddis.jpg

3) Testing

1)First step is to buzz out all connections from the LCDs to the pins in the main board
2)Next check the touch screen connections. On the main board, place an Ohm meter across X+ and X-. You should read 700 Ohms. Repeat for Y+ and Y-. Then test the resistance from X+ to Y+. With nothing touching the screens, it should read >100K Ohms and <1K when touching either screen.
3)When all connections are checked, solder in the mbed. Download and install the touch2 program http://mbed.org/users/TickTock/code/touch2/ to test the basic operation of the mbed and touch screens.
tips:
Touch screen is sensitive - excess flux on X+,X-,Y+,Y- connection on mbed can result in flakey operation
If touch is not working, double-check the LCD0_CS and LCD1_CS are not swapped. LCD0_CS must connect to the CS of the LCD that has X- & Y- connected to the mbed. LCD1_CS must connect to the CS of the LCD that has X+ & Y+ connected to the mbed.
4)Once touch2 works, it is time to connect to the OBD connector. I highly recommend double checking all connections from the OBD to the PCB with the cable in place before connecting to the Leaf. Buzz out all the pins in the OBS to make sure none are shorting to each other, Check that the 12V goes to the Zener (and nothing else) and the switched 12V to the resistor divider (and nothing else). Test the ground connection properly connects to ground and nothing else.
5)Once you are confident there are no shorts or wrong connections from the OBD connector, take a deep breath and plug it into your leaf. Touch2 program should come up and function. Unplug and install the latest CANary firmware. Test all features before installing into the enclosure (gids, cellpair, menu system, logging) since installing and removing from the enclosure is a PITA.

/media/uploads/TickTock/pcbdone.jpg /media/uploads/TickTock/functioning.jpg

4) Enclosure

The 3D printer leaves a lot of powder behind - I used a strong spray of water to get it out of all the cracks. The enclosure comes with a rather rough finish. I recommend convincing yourself you like it, then simply lightly sand then paint before assembly. Sanding is very difficult - the nylon is very nicely fused and doesn't want to sand. I tried sandblasting and that didn't work either. I had some limited success with filler and then sanding, but only on the outside - it is too difficult to sand the face.

5) Final Assembly

Committer:
TickTock
Date:
Sun Mar 03 15:50:54 2013 +0000
Revision:
12:8e42d7ba8468
Child:
13:62e0f7f39ff5
Repartitioned display and utility functions

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TickTock 12:8e42d7ba8468 1 // utility.cpp
TickTock 12:8e42d7ba8468 2 #include "mbed.h"
TickTock 12:8e42d7ba8468 3 #include "CAN.h"
TickTock 12:8e42d7ba8468 4 #include "beep.h"
TickTock 12:8e42d7ba8468 5 #include "MSCFileSystem.h"
TickTock 12:8e42d7ba8468 6 #include "PowerControl.h"
TickTock 12:8e42d7ba8468 7 #include "EthernetPowerControl.h"
TickTock 12:8e42d7ba8468 8
TickTock 12:8e42d7ba8468 9 #define upLine "\033[1A"
TickTock 12:8e42d7ba8468 10 #define maxBufLen 768
TickTock 12:8e42d7ba8468 11 #define canTimeout 500
TickTock 12:8e42d7ba8468 12 #define userTimeout 10
TickTock 12:8e42d7ba8468 13 #define btn31x1 12
TickTock 12:8e42d7ba8468 14 #define btn31x2 101
TickTock 12:8e42d7ba8468 15 #define btn32x1 115
TickTock 12:8e42d7ba8468 16 #define btn32x2 204
TickTock 12:8e42d7ba8468 17 #define btn33x1 218
TickTock 12:8e42d7ba8468 18 #define btn33x2 307
TickTock 12:8e42d7ba8468 19 #define btn11y1 180
TickTock 12:8e42d7ba8468 20 #define btn11y2 229
TickTock 12:8e42d7ba8468 21 #define maxScreens 7
TickTock 12:8e42d7ba8468 22 #define offScreen 0
TickTock 12:8e42d7ba8468 23 #define logScreen 1
TickTock 12:8e42d7ba8468 24 #define dteScreen 2
TickTock 12:8e42d7ba8468 25 #define brakeScreen 3
TickTock 12:8e42d7ba8468 26 #define powerScreen 4
TickTock 12:8e42d7ba8468 27 #define monitorScreen 5
TickTock 12:8e42d7ba8468 28 #define changedScreen 6
TickTock 12:8e42d7ba8468 29 #define cpScreen 7
TickTock 12:8e42d7ba8468 30 LocalFileSystem local("local");
TickTock 12:8e42d7ba8468 31
TickTock 12:8e42d7ba8468 32 // to write to USB Flash Drives, or equivalent (SD card in Reader/Writer)
TickTock 12:8e42d7ba8468 33 MSCFileSystem fs("fs"); // to write to a USB Flash Drive
TickTock 12:8e42d7ba8468 34
TickTock 12:8e42d7ba8468 35 time_t seconds ;
TickTock 12:8e42d7ba8468 36 Beep spkr(p21);
TickTock 12:8e42d7ba8468 37
TickTock 12:8e42d7ba8468 38 Ticker ticker;
TickTock 12:8e42d7ba8468 39 Timer timer;
TickTock 12:8e42d7ba8468 40 DigitalOut led1(LED1);
TickTock 12:8e42d7ba8468 41 DigitalOut led2(LED2);
TickTock 12:8e42d7ba8468 42 DigitalOut led3(LED3);
TickTock 12:8e42d7ba8468 43 DigitalOut led4(LED4);
TickTock 12:8e42d7ba8468 44 PwmOut dled(p24);
TickTock 12:8e42d7ba8468 45
TickTock 12:8e42d7ba8468 46 InterruptIn touchpad(p17);
TickTock 12:8e42d7ba8468 47 CAN can1(p9, p10); // CAN1 (EV) uses pins 9 and 10 (rx, tx) and pin 8 (rs)
TickTock 12:8e42d7ba8468 48 DigitalOut can1SleepMode(p8); // Use pin 8 to control the sleep mode of can2
TickTock 12:8e42d7ba8468 49 CAN can2(p30, p29); // CAN2 (CAR) uses pins 30 and 29 (rx, tx) and pin 28 (rs)
TickTock 12:8e42d7ba8468 50 DigitalOut can2SleepMode(p28); // Use pin 28 to control the sleep mode of can1
TickTock 12:8e42d7ba8468 51
TickTock 12:8e42d7ba8468 52 bool logEn = true,logOpen = false;
TickTock 12:8e42d7ba8468 53 FILE *rfile;
TickTock 12:8e42d7ba8468 54 FILE *file;
TickTock 12:8e42d7ba8468 55 char fileName[35] = "" ;
TickTock 12:8e42d7ba8468 56 char writeBuffer[maxBufLen][13]; // buffer for USB write
TickTock 12:8e42d7ba8468 57 char indexLastMsg[0x800]={0}; // index table for last message
TickTock 12:8e42d7ba8468 58 CANMessage lastMsg[100]; // table to store last message of eachtype
TickTock 12:8e42d7ba8468 59 unsigned char battData[256]={0};
TickTock 12:8e42d7ba8468 60 unsigned char msgChanged[100]; // inidcates which bytes changed
TickTock 12:8e42d7ba8468 61 char c;
TickTock 12:8e42d7ba8468 62 volatile int writePointer = 0;
TickTock 12:8e42d7ba8468 63 volatile int secsNoMsg = 0, secsNoTouch = 0;
TickTock 12:8e42d7ba8468 64 volatile bool canIdle = false, userIdle = false;
TickTock 12:8e42d7ba8468 65 bool touched=0; //flag to read touchscreen
TickTock 12:8e42d7ba8468 66 char counter = 0;
TickTock 12:8e42d7ba8468 67 unsigned char dMode[2] = {7,2}; //display mode
TickTock 12:8e42d7ba8468 68 unsigned char sMode = 0; // setup mode
TickTock 12:8e42d7ba8468 69 unsigned char lastDMode[2] = {0,0}; //last screen mode
TickTock 12:8e42d7ba8468 70 char displayLog[20][40];
TickTock 12:8e42d7ba8468 71 unsigned char displayLoc = 0;
TickTock 12:8e42d7ba8468 72 unsigned char indexOffset = 1;
TickTock 12:8e42d7ba8468 73 bool showCP = false;
TickTock 12:8e42d7ba8468 74 bool pollCP = false;
TickTock 12:8e42d7ba8468 75
TickTock 12:8e42d7ba8468 76 extern "C" {
TickTock 12:8e42d7ba8468 77 void mbed_reset();
TickTock 12:8e42d7ba8468 78 void RTC_IRQHandler() {
TickTock 12:8e42d7ba8468 79 timer.reset(); // zero ms at the-seconds-tic
TickTock 12:8e42d7ba8468 80 canIdle=(++secsNoMsg>canTimeout);
TickTock 12:8e42d7ba8468 81 userIdle=(++secsNoTouch>userTimeout);
TickTock 12:8e42d7ba8468 82 LPC_RTC->ILR |= (1<<0); // clear interrupt to prepare for next
TickTock 12:8e42d7ba8468 83 }
TickTock 12:8e42d7ba8468 84
TickTock 12:8e42d7ba8468 85 extern "C" void RTC_Init (void) {
TickTock 12:8e42d7ba8468 86 LPC_RTC->ILR=0x00; // set up the RTC interrupts
TickTock 12:8e42d7ba8468 87 LPC_RTC->CIIR=0x01; // interrupts each second
TickTock 12:8e42d7ba8468 88 LPC_RTC->CCR = 0x01; // Clock enable
TickTock 12:8e42d7ba8468 89 //NVIC_SetPriority( RTC_IRQn, 10 );
TickTock 12:8e42d7ba8468 90 NVIC_EnableIRQ( RTC_IRQn );
TickTock 12:8e42d7ba8468 91 }
TickTock 12:8e42d7ba8468 92
TickTock 12:8e42d7ba8468 93 void logMsg (char *msg) {
TickTock 12:8e42d7ba8468 94 strcpy(displayLog[displayLoc],msg);
TickTock 12:8e42d7ba8468 95 displayLoc=displayLoc>17?0:displayLoc+1;
TickTock 12:8e42d7ba8468 96 }
TickTock 12:8e42d7ba8468 97
TickTock 12:8e42d7ba8468 98 void touch_ISR(){
TickTock 12:8e42d7ba8468 99 LPC_GPIOINT->IO2IntClr = (LPC_GPIOINT->IO2IntStatR | LPC_GPIOINT->IO2IntStatF);
TickTock 12:8e42d7ba8468 100 secsNoTouch = 0;
TickTock 12:8e42d7ba8468 101 touched=true;
TickTock 12:8e42d7ba8468 102 }
TickTock 12:8e42d7ba8468 103
TickTock 12:8e42d7ba8468 104 unsigned short getTimeStamp() {
TickTock 12:8e42d7ba8468 105 unsigned short msec = timer.read_ms() ; // read ms from the timer
TickTock 12:8e42d7ba8468 106 unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
TickTock 12:8e42d7ba8468 107 unsigned short isecs = secs%60 ; // modulo 60 for 0-59 seconds from RTC
TickTock 12:8e42d7ba8468 108 return ((isecs<<10)+msec) ; // return the two byte time stamp
TickTock 12:8e42d7ba8468 109 }
TickTock 12:8e42d7ba8468 110
TickTock 12:8e42d7ba8468 111 void logCan (char mType, CANMessage canRXmsg) {
TickTock 12:8e42d7ba8468 112 char sTemp[40];
TickTock 12:8e42d7ba8468 113 unsigned short ts = getTimeStamp();
TickTock 12:8e42d7ba8468 114 unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
TickTock 12:8e42d7ba8468 115 static unsigned char ii = 0, lasti = 0; // indexindex
TickTock 12:8e42d7ba8468 116 unsigned char changed,i;
TickTock 12:8e42d7ba8468 117 static unsigned char bdi;
TickTock 12:8e42d7ba8468 118 if(logOpen){
TickTock 12:8e42d7ba8468 119 if(canRXmsg.id>0) {
TickTock 12:8e42d7ba8468 120 writeBuffer[writePointer][0]=mType;
TickTock 12:8e42d7ba8468 121 writeBuffer[writePointer][1]=((secs%60)<<2)+((ts&0x300)>>8);
TickTock 12:8e42d7ba8468 122 writeBuffer[writePointer][2]=ts&0xff;
TickTock 12:8e42d7ba8468 123 writeBuffer[writePointer][3]=canRXmsg.id&0xff;
TickTock 12:8e42d7ba8468 124 writeBuffer[writePointer][4]=(canRXmsg.id>>8)+(canRXmsg.len<<4);
TickTock 12:8e42d7ba8468 125 for(i=5;i<13;i++){
TickTock 12:8e42d7ba8468 126 writeBuffer[writePointer][i]=canRXmsg.data[i-5];
TickTock 12:8e42d7ba8468 127 }
TickTock 12:8e42d7ba8468 128 if (++writePointer >= maxBufLen) {
TickTock 12:8e42d7ba8468 129 writePointer = 0;
TickTock 12:8e42d7ba8468 130 led3 = !led3;
TickTock 12:8e42d7ba8468 131 }
TickTock 12:8e42d7ba8468 132 }
TickTock 12:8e42d7ba8468 133 }//if logOpen
TickTock 12:8e42d7ba8468 134 if(indexLastMsg[canRXmsg.id]==0) { //Check if no entry
TickTock 12:8e42d7ba8468 135 ii=ii<99?ii+1:0;
TickTock 12:8e42d7ba8468 136 indexLastMsg[canRXmsg.id]=ii; //Create entry if first message
TickTock 12:8e42d7ba8468 137 }
TickTock 12:8e42d7ba8468 138 if(dMode[0]==changedScreen||dMode[1]==changedScreen){
TickTock 12:8e42d7ba8468 139 changed=msgChanged[indexLastMsg[canRXmsg.id]];
TickTock 12:8e42d7ba8468 140 for(i=0;i<8;i++){
TickTock 12:8e42d7ba8468 141 if(lastMsg[indexLastMsg[canRXmsg.id]].data[i]!=canRXmsg.data[i]){
TickTock 12:8e42d7ba8468 142 changed |= 1<<i;
TickTock 12:8e42d7ba8468 143 }
TickTock 12:8e42d7ba8468 144 }
TickTock 12:8e42d7ba8468 145 msgChanged[indexLastMsg[canRXmsg.id]]=changed;
TickTock 12:8e42d7ba8468 146 }
TickTock 12:8e42d7ba8468 147 lastMsg[indexLastMsg[canRXmsg.id]]=canRXmsg; //Store in table
TickTock 12:8e42d7ba8468 148 if(mType==1&&canRXmsg.id==0x7bb){ // is battery data? Need to store all responses
TickTock 12:8e42d7ba8468 149 if(canRXmsg.data[0]<0x20){
TickTock 12:8e42d7ba8468 150 if(canRXmsg.data[3]==2){//cellpair data
TickTock 12:8e42d7ba8468 151 bdi=0;
TickTock 12:8e42d7ba8468 152 sprintf(sTemp,"Getting cell pair data\n");
TickTock 12:8e42d7ba8468 153 logMsg(sTemp);
TickTock 12:8e42d7ba8468 154 }else if(canRXmsg.data[3]==4){//temperature data
TickTock 12:8e42d7ba8468 155 bdi=0x20;
TickTock 12:8e42d7ba8468 156 sprintf(sTemp,"Getting temperature data\n");
TickTock 12:8e42d7ba8468 157 logMsg(sTemp);
TickTock 12:8e42d7ba8468 158 }else bdi=0;
TickTock 12:8e42d7ba8468 159 lasti=0;
TickTock 12:8e42d7ba8468 160 }
TickTock 12:8e42d7ba8468 161 i=canRXmsg.data[0]&0x0f; //lower nibble of D0 is index
TickTock 12:8e42d7ba8468 162 if(lasti>i){ //detect rolloever and offset index appropriately
TickTock 12:8e42d7ba8468 163 bdi=0x10;
TickTock 12:8e42d7ba8468 164 }
TickTock 12:8e42d7ba8468 165 lasti=i; //remember the msb to detect rollover next time around
TickTock 12:8e42d7ba8468 166 i+=bdi;
TickTock 12:8e42d7ba8468 167 i*=7;
TickTock 12:8e42d7ba8468 168 if(i<0xfa){
TickTock 12:8e42d7ba8468 169 battData[i+0]=canRXmsg.data[1];
TickTock 12:8e42d7ba8468 170 battData[i+1]=canRXmsg.data[2];
TickTock 12:8e42d7ba8468 171 battData[i+2]=canRXmsg.data[3];
TickTock 12:8e42d7ba8468 172 battData[i+3]=canRXmsg.data[4];
TickTock 12:8e42d7ba8468 173 battData[i+4]=canRXmsg.data[5];
TickTock 12:8e42d7ba8468 174 battData[i+5]=canRXmsg.data[6];
TickTock 12:8e42d7ba8468 175 battData[i+6]=canRXmsg.data[7];
TickTock 12:8e42d7ba8468 176 }
TickTock 12:8e42d7ba8468 177 }//if 0x7bb
TickTock 12:8e42d7ba8468 178 }
TickTock 12:8e42d7ba8468 179
TickTock 12:8e42d7ba8468 180 void logTS () {
TickTock 12:8e42d7ba8468 181 CANMessage tsMsg;
TickTock 12:8e42d7ba8468 182 unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
TickTock 12:8e42d7ba8468 183 tsMsg.id=0xfff;
TickTock 12:8e42d7ba8468 184 tsMsg.len=0xf;
TickTock 12:8e42d7ba8468 185 tsMsg.data[0]=secs&0xff;
TickTock 12:8e42d7ba8468 186 tsMsg.data[1]=(secs>>8)&0xff;
TickTock 12:8e42d7ba8468 187 tsMsg.data[2]=(secs>>16)&0xff;
TickTock 12:8e42d7ba8468 188 tsMsg.data[3]=secs>>24;
TickTock 12:8e42d7ba8468 189 tsMsg.data[4]=0xff;
TickTock 12:8e42d7ba8468 190 tsMsg.data[5]=0xff;
TickTock 12:8e42d7ba8468 191 tsMsg.data[6]=0xff;
TickTock 12:8e42d7ba8468 192 tsMsg.data[7]=0xff;
TickTock 12:8e42d7ba8468 193 logCan(0,tsMsg);
TickTock 12:8e42d7ba8468 194 }
TickTock 12:8e42d7ba8468 195
TickTock 12:8e42d7ba8468 196 void sendCPreq() {
TickTock 12:8e42d7ba8468 197 char i;
TickTock 12:8e42d7ba8468 198 char data[8] = {0x02, 0x21, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff};
TickTock 12:8e42d7ba8468 199 can1.monitor(false); // set to active mode
TickTock 12:8e42d7ba8468 200 can1SleepMode = 0; // enable TX
TickTock 12:8e42d7ba8468 201 can1.write(CANMessage(0x79b, data, 8));
TickTock 12:8e42d7ba8468 202 data[0]=0x30; //change to request next line message
TickTock 12:8e42d7ba8468 203 data[1]=0x01;
TickTock 12:8e42d7ba8468 204 data[2]=0x00;
TickTock 12:8e42d7ba8468 205 for(i=0;i<27;i++){
TickTock 12:8e42d7ba8468 206 wait_ms(16); //wait 16ms
TickTock 12:8e42d7ba8468 207 can1.write(CANMessage(0x79b, data, 8));
TickTock 12:8e42d7ba8468 208 }
TickTock 12:8e42d7ba8468 209 can1SleepMode = 1; // disable TX
TickTock 12:8e42d7ba8468 210 can1.monitor(true); // set to snoop mode
TickTock 12:8e42d7ba8468 211 }
TickTock 12:8e42d7ba8468 212
TickTock 12:8e42d7ba8468 213 void sendTreq() {
TickTock 12:8e42d7ba8468 214 char i;
TickTock 12:8e42d7ba8468 215 char data[8] = {0x02, 0x21, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff};
TickTock 12:8e42d7ba8468 216 can1.monitor(false); // set to active mode
TickTock 12:8e42d7ba8468 217 can1SleepMode = 0; // enable TX
TickTock 12:8e42d7ba8468 218 can1.write(CANMessage(0x79b, data, 8));
TickTock 12:8e42d7ba8468 219 data[0]=0x30; //change to request next line message
TickTock 12:8e42d7ba8468 220 data[1]=0x01;
TickTock 12:8e42d7ba8468 221 data[2]=0x00;
TickTock 12:8e42d7ba8468 222 for(i=0;i<2;i++){
TickTock 12:8e42d7ba8468 223 wait_ms(16); //wait 16ms
TickTock 12:8e42d7ba8468 224 can1.write(CANMessage(0x79b, data, 8));
TickTock 12:8e42d7ba8468 225 }
TickTock 12:8e42d7ba8468 226 can1SleepMode = 1; // disable TX
TickTock 12:8e42d7ba8468 227 can1.monitor(true); // set to snoop mode
TickTock 12:8e42d7ba8468 228 }
TickTock 12:8e42d7ba8468 229
TickTock 12:8e42d7ba8468 230 void tickerISR() { //This is the ticker ISR for auto-polling
TickTock 12:8e42d7ba8468 231 pollCP=true; //Set a flag to do in main loop instead of here
TickTock 12:8e42d7ba8468 232 } //since ticker blocks other interrupts
TickTock 12:8e42d7ba8468 233
TickTock 12:8e42d7ba8468 234 void recieve1() {
TickTock 12:8e42d7ba8468 235 CANMessage msg1;
TickTock 12:8e42d7ba8468 236 secsNoMsg=0; // reset deadman switch
TickTock 12:8e42d7ba8468 237 can1.read(msg1);
TickTock 12:8e42d7ba8468 238 logCan(1, msg1);
TickTock 12:8e42d7ba8468 239 led1 = !led1;
TickTock 12:8e42d7ba8468 240 }
TickTock 12:8e42d7ba8468 241
TickTock 12:8e42d7ba8468 242 void recieve2() {
TickTock 12:8e42d7ba8468 243 CANMessage msg2;
TickTock 12:8e42d7ba8468 244 secsNoMsg=0; // reset deadman switch
TickTock 12:8e42d7ba8468 245 can2.read(msg2);
TickTock 12:8e42d7ba8468 246 logCan(2, msg2);
TickTock 12:8e42d7ba8468 247 led2 = !led2;
TickTock 12:8e42d7ba8468 248 }
TickTock 12:8e42d7ba8468 249 }
TickTock 12:8e42d7ba8468 250
TickTock 12:8e42d7ba8468 251 //LEAF OBD
TickTock 12:8e42d7ba8468 252 //1:
TickTock 12:8e42d7ba8468 253 //2:
TickTock 12:8e42d7ba8468 254 //3: AVCAN-L White/Blue
TickTock 12:8e42d7ba8468 255 //4: VSS-Shield
TickTock 12:8e42d7ba8468 256 //5: VSS Brown,White/Brown
TickTock 12:8e42d7ba8468 257 //6: CARCAN-H Green
TickTock 12:8e42d7ba8468 258 //7:
TickTock 12:8e42d7ba8468 259 //8: 12V-SW Orange,White/Orange
TickTock 12:8e42d7ba8468 260 //9:
TickTock 12:8e42d7ba8468 261 //10:
TickTock 12:8e42d7ba8468 262 //11: AVCAN-H Blue
TickTock 12:8e42d7ba8468 263 //12: EVCAN-L White/Grey
TickTock 12:8e42d7ba8468 264 //13: EVCAN-H Grey
TickTock 12:8e42d7ba8468 265 //14: CARCAN-L White/Green
TickTock 12:8e42d7ba8468 266 //15:
TickTock 12:8e42d7ba8468 267 //16: 12V-AON Red/Blue,Blue/Red
TickTock 12:8e42d7ba8468 268
TickTock 12:8e42d7ba8468 269 //VP230
TickTock 12:8e42d7ba8468 270 //1:D
TickTock 12:8e42d7ba8468 271 //2:GND
TickTock 12:8e42d7ba8468 272 //3:VCC
TickTock 12:8e42d7ba8468 273 //4:R
TickTock 12:8e42d7ba8468 274 //5:Vref
TickTock 12:8e42d7ba8468 275 //6:CANL
TickTock 12:8e42d7ba8468 276 //7:CANH
TickTock 12:8e42d7ba8468 277 //8:RS
TickTock 12:8e42d7ba8468 278
TickTock 12:8e42d7ba8468 279 //LPC1768
TickTock 12:8e42d7ba8468 280 //1: VSS
TickTock 12:8e42d7ba8468 281 //2: NC:VIN (4.5-9V supply)
TickTock 12:8e42d7ba8468 282 //3: NC:VB
TickTock 12:8e42d7ba8468 283 //4: NC:nR
TickTock 12:8e42d7ba8468 284 //5: SPI:CS0
TickTock 12:8e42d7ba8468 285 //6: SPI:CS1
TickTock 12:8e42d7ba8468 286 //7: SPI:Reset
TickTock 12:8e42d7ba8468 287 //8: CAN1:Sleep --> 8:CAN1:RS
TickTock 12:8e42d7ba8468 288 //9: CAN1:RX --> 4:CAN1:R
TickTock 12:8e42d7ba8468 289 //10: CAN1:TX --> 1:CAN1:D
TickTock 12:8e42d7ba8468 290 //11: SPI:MOSI
TickTock 12:8e42d7ba8468 291 //12: SPI:MISO
TickTock 12:8e42d7ba8468 292 //13: SPI:SCLK
TickTock 12:8e42d7ba8468 293 //14: NC:Ain
TickTock 12:8e42d7ba8468 294 //15: MON12V --> 4K to 12V, 1K to VSS (To be implemented)
TickTock 12:8e42d7ba8468 295 //16: TOUCH_X+
TickTock 12:8e42d7ba8468 296 //17: TOUCH_X-
TickTock 12:8e42d7ba8468 297 //18: NC:Aout
TickTock 12:8e42d7ba8468 298 //19: TOUCH_Y+
TickTock 12:8e42d7ba8468 299 //20: TOUCH_Y-
TickTock 12:8e42d7ba8468 300 //21: Spkr+
TickTock 12:8e42d7ba8468 301 //22: Spkr- (optional complimentary output for more volume)
TickTock 12:8e42d7ba8468 302 //23: NC:pwm
TickTock 12:8e42d7ba8468 303 //24: LED
TickTock 12:8e42d7ba8468 304 //25: NC:pwm
TickTock 12:8e42d7ba8468 305 //26: NC:pwm
TickTock 12:8e42d7ba8468 306 //27: NC
TickTock 12:8e42d7ba8468 307 //28: CAN2:Sleep --> 8:CAN2:RS
TickTock 12:8e42d7ba8468 308 //29: CAN2:TX --> 1:CAN2:D
TickTock 12:8e42d7ba8468 309 //30: CAN2:RX --> 4:CAN2:R
TickTock 12:8e42d7ba8468 310 //31: USB_D+
TickTock 12:8e42d7ba8468 311 //32: USB_D-
TickTock 12:8e42d7ba8468 312 //33: NC:Eth_TD+
TickTock 12:8e42d7ba8468 313 //34: NC:Eth_TD-
TickTock 12:8e42d7ba8468 314 //35: NC:Eth_RD+
TickTock 12:8e42d7ba8468 315 //36: NC:Eth_RD-
TickTock 12:8e42d7ba8468 316 //37: NC:IF+
TickTock 12:8e42d7ba8468 317 //38: NC:IF-
TickTock 12:8e42d7ba8468 318 //39: NC:5Vout (only available when connected as USB device)
TickTock 12:8e42d7ba8468 319 //40: VCC3.3