test fork

Dependencies:   SPI_TFTx2 SPI_TFTx2_ILI9341 TFT_fonts TOUCH_TFTx2 mbed

Fork of CANary_9341 by Tick Tock

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