Peter Cooper
/
diags
test code for our MBED board
can.c@1:6877bb99aa17, 2011-05-04 (annotated)
- Committer:
- lolpcc
- Date:
- Wed May 04 08:30:52 2011 +0000
- Revision:
- 1:6877bb99aa17
- Parent:
- 0:9edfcca7cd25
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lolpcc | 0:9edfcca7cd25 | 1 | #include "mbed.h" |
lolpcc | 1:6877bb99aa17 | 2 | #include "useful.h" |
lolpcc | 1:6877bb99aa17 | 3 | #include "led.h" |
lolpcc | 1:6877bb99aa17 | 4 | #include "cmd.h" /* used to get at the command code */ |
lolpcc | 1:6877bb99aa17 | 5 | #include "can_layer.h" |
lolpcc | 1:6877bb99aa17 | 6 | #include "can.h" |
lolpcc | 0:9edfcca7cd25 | 7 | |
lolpcc | 0:9edfcca7cd25 | 8 | // CAN_RS pin at Philips PCA82C250 can bus controller. |
lolpcc | 0:9edfcca7cd25 | 9 | // activate transceiver by pulling this pin to GND. |
lolpcc | 0:9edfcca7cd25 | 10 | // (Rise and fall slope controlled by resistor R_s) |
lolpcc | 0:9edfcca7cd25 | 11 | // (+5V result in tranceiver standby mode) |
lolpcc | 0:9edfcca7cd25 | 12 | // For further information see datasheet page 4 |
lolpcc | 0:9edfcca7cd25 | 13 | DigitalOut can_Pca82c250SlopePin(p28); |
lolpcc | 0:9edfcca7cd25 | 14 | |
lolpcc | 0:9edfcca7cd25 | 15 | // We use can on mbed pins 29(CAN_TXD) and 30(CAN_RXD). |
lolpcc | 0:9edfcca7cd25 | 16 | CAN can(p30, p29); |
lolpcc | 0:9edfcca7cd25 | 17 | |
lolpcc | 0:9edfcca7cd25 | 18 | int can_cnt=0; |
lolpcc | 1:6877bb99aa17 | 19 | extern char station_id; |
lolpcc | 1:6877bb99aa17 | 20 | char *can_str; |
lolpcc | 0:9edfcca7cd25 | 21 | |
lolpcc | 0:9edfcca7cd25 | 22 | /******************************************/ |
lolpcc | 0:9edfcca7cd25 | 23 | /* */ |
lolpcc | 1:6877bb99aa17 | 24 | /* Can Bus Send a string to remote add */ |
lolpcc | 1:6877bb99aa17 | 25 | /* */ |
lolpcc | 1:6877bb99aa17 | 26 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 27 | void can_send_string(char remote, char *str) |
lolpcc | 1:6877bb99aa17 | 28 | { |
lolpcc | 1:6877bb99aa17 | 29 | unsigned char buf[0x8]; |
lolpcc | 1:6877bb99aa17 | 30 | int len = strlen(str); |
lolpcc | 1:6877bb99aa17 | 31 | int id; |
lolpcc | 1:6877bb99aa17 | 32 | int cnt = 0; |
lolpcc | 1:6877bb99aa17 | 33 | int sub; |
lolpcc | 1:6877bb99aa17 | 34 | int pt = 0; |
lolpcc | 1:6877bb99aa17 | 35 | |
lolpcc | 1:6877bb99aa17 | 36 | if(len > 128){ |
lolpcc | 1:6877bb99aa17 | 37 | lprintf("Max string lenght of 128 bytes, current string %d bytes long, not sending\n",len); |
lolpcc | 1:6877bb99aa17 | 38 | return; |
lolpcc | 1:6877bb99aa17 | 39 | } |
lolpcc | 1:6877bb99aa17 | 40 | |
lolpcc | 1:6877bb99aa17 | 41 | /* Set up the TX buffer for start packet */ |
lolpcc | 1:6877bb99aa17 | 42 | can_clear_data(buf); |
lolpcc | 1:6877bb99aa17 | 43 | buf[0] = station_id; /* who we are */ |
lolpcc | 1:6877bb99aa17 | 44 | buf[1] = len; /* number of bytes been sent, overall */ |
lolpcc | 1:6877bb99aa17 | 45 | buf[2] = (len/8)+1; /* guess at how many packets it should be */ |
lolpcc | 1:6877bb99aa17 | 46 | |
lolpcc | 1:6877bb99aa17 | 47 | id = can_build_id(station_id,remote,CAN_SPRT); |
lolpcc | 1:6877bb99aa17 | 48 | if(!can.write(CANMessage(id, (char *)buf, 8))) { |
lolpcc | 1:6877bb99aa17 | 49 | lprintf("Error sending %s packet (%03x),",cancmd[CAN_SPRT],id); |
lolpcc | 1:6877bb99aa17 | 50 | can_dump_buffer(buf); |
lolpcc | 1:6877bb99aa17 | 51 | lprintf("\n"); |
lolpcc | 1:6877bb99aa17 | 52 | return; |
lolpcc | 1:6877bb99aa17 | 53 | } |
lolpcc | 1:6877bb99aa17 | 54 | /* About to send the data */ |
lolpcc | 1:6877bb99aa17 | 55 | sub = 1; |
lolpcc | 1:6877bb99aa17 | 56 | pt = 0; |
lolpcc | 1:6877bb99aa17 | 57 | while(sub > 0){ |
lolpcc | 1:6877bb99aa17 | 58 | can_clear_data(buf); |
lolpcc | 1:6877bb99aa17 | 59 | sub = can_build_data(len,pt,(unsigned char*)str,buf); |
lolpcc | 1:6877bb99aa17 | 60 | id = can_build_id(station_id,remote,CAN_PRT); |
lolpcc | 1:6877bb99aa17 | 61 | if(!can.write(CANMessage(id | cnt, (char *)buf, 8))) { |
lolpcc | 1:6877bb99aa17 | 62 | lprintf("Error sending %s packet PRT (%03x),",cancmd[CAN_PRT],id); |
lolpcc | 1:6877bb99aa17 | 63 | can_dump_buffer(buf); |
lolpcc | 1:6877bb99aa17 | 64 | lprintf("\n"); |
lolpcc | 1:6877bb99aa17 | 65 | } else { |
lolpcc | 1:6877bb99aa17 | 66 | pt = sub; |
lolpcc | 1:6877bb99aa17 | 67 | } |
lolpcc | 1:6877bb99aa17 | 68 | wait(0.1); |
lolpcc | 1:6877bb99aa17 | 69 | cnt++; |
lolpcc | 1:6877bb99aa17 | 70 | } |
lolpcc | 1:6877bb99aa17 | 71 | |
lolpcc | 1:6877bb99aa17 | 72 | /* Set up the TX buffer for end packet */ |
lolpcc | 1:6877bb99aa17 | 73 | can_clear_data(buf); |
lolpcc | 1:6877bb99aa17 | 74 | buf[0] = station_id; /* Who we are */ |
lolpcc | 1:6877bb99aa17 | 75 | buf[1] = len; /* number of bytes sent */ |
lolpcc | 1:6877bb99aa17 | 76 | buf[2] = cnt; /* atual packet count */ |
lolpcc | 1:6877bb99aa17 | 77 | id = can_build_id(station_id,remote,CAN_EPRT); |
lolpcc | 1:6877bb99aa17 | 78 | if(!can.write(CANMessage(id, (char *)buf, 8))) { |
lolpcc | 1:6877bb99aa17 | 79 | lprintf("Error sending %s packet EPRT (%03x),",cancmd[CAN_EPRT],id); |
lolpcc | 1:6877bb99aa17 | 80 | can_dump_buffer(buf); |
lolpcc | 1:6877bb99aa17 | 81 | lprintf("\n"); |
lolpcc | 1:6877bb99aa17 | 82 | return; |
lolpcc | 1:6877bb99aa17 | 83 | } |
lolpcc | 1:6877bb99aa17 | 84 | } |
lolpcc | 1:6877bb99aa17 | 85 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 86 | /* */ |
lolpcc | 1:6877bb99aa17 | 87 | /* Can Bus Send raw data to remote add */ |
lolpcc | 1:6877bb99aa17 | 88 | /* */ |
lolpcc | 1:6877bb99aa17 | 89 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 90 | void can_send_raw(char remote, char *str) |
lolpcc | 1:6877bb99aa17 | 91 | { |
lolpcc | 1:6877bb99aa17 | 92 | lprintf("In Can Send String with '%02x%02x%02x%02x%02x%02x%02x%02x' going to %d\n", |
lolpcc | 1:6877bb99aa17 | 93 | str[0],str[1],str[2],str[3],str[4],str[5],str[6],str[7], remote); |
lolpcc | 1:6877bb99aa17 | 94 | } |
lolpcc | 1:6877bb99aa17 | 95 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 96 | /* */ |
lolpcc | 1:6877bb99aa17 | 97 | /* Can Bus Send BUS Reset */ |
lolpcc | 1:6877bb99aa17 | 98 | /* */ |
lolpcc | 1:6877bb99aa17 | 99 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 100 | void can_send_sync(void) |
lolpcc | 1:6877bb99aa17 | 101 | { |
lolpcc | 1:6877bb99aa17 | 102 | unsigned char buf[0x8]; |
lolpcc | 1:6877bb99aa17 | 103 | int id; |
lolpcc | 1:6877bb99aa17 | 104 | |
lolpcc | 1:6877bb99aa17 | 105 | can_clear_data(buf); |
lolpcc | 1:6877bb99aa17 | 106 | id = can_build_id(0,0,CAN_SYNC); |
lolpcc | 1:6877bb99aa17 | 107 | if(!can.write(CANMessage(id, (char *)buf, 8))) { |
lolpcc | 1:6877bb99aa17 | 108 | lprintf("Error sending %s packet SYNC (%03x),",cancmd[CAN_SYNC],id); |
lolpcc | 1:6877bb99aa17 | 109 | lprintf("\n"); |
lolpcc | 1:6877bb99aa17 | 110 | return; |
lolpcc | 1:6877bb99aa17 | 111 | } |
lolpcc | 1:6877bb99aa17 | 112 | } |
lolpcc | 1:6877bb99aa17 | 113 | /******************************************/ |
lolpcc | 0:9edfcca7cd25 | 114 | /* */ |
lolpcc | 1:6877bb99aa17 | 115 | /* Can Bus Send Intger to remote add */ |
lolpcc | 1:6877bb99aa17 | 116 | /* mode = 0, Int, mode = 1, Time */ |
lolpcc | 0:9edfcca7cd25 | 117 | /* */ |
lolpcc | 1:6877bb99aa17 | 118 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 119 | void can_send_int(int remote,int value,char mode) |
lolpcc | 1:6877bb99aa17 | 120 | { |
lolpcc | 1:6877bb99aa17 | 121 | unsigned char buf[0x8]; |
lolpcc | 1:6877bb99aa17 | 122 | int id; |
lolpcc | 1:6877bb99aa17 | 123 | |
lolpcc | 1:6877bb99aa17 | 124 | can_clear_data(buf); |
lolpcc | 1:6877bb99aa17 | 125 | if(mode==0) |
lolpcc | 1:6877bb99aa17 | 126 | id = can_build_id(station_id,remote,CAN_INT); |
lolpcc | 1:6877bb99aa17 | 127 | else if(mode == 1) |
lolpcc | 1:6877bb99aa17 | 128 | id = can_build_id(station_id,remote,CAN_TIME); |
lolpcc | 1:6877bb99aa17 | 129 | else { |
lolpcc | 1:6877bb99aa17 | 130 | lprintf("can_send_int: unknown mode with %d\n",mode); |
lolpcc | 1:6877bb99aa17 | 131 | return; |
lolpcc | 1:6877bb99aa17 | 132 | } |
lolpcc | 1:6877bb99aa17 | 133 | buf[0]=value & 0x000000ff; |
lolpcc | 1:6877bb99aa17 | 134 | buf[1]=(value >> 8) & 0x000000ff; |
lolpcc | 1:6877bb99aa17 | 135 | buf[2]=(value >> 16) & 0x000000ff; |
lolpcc | 1:6877bb99aa17 | 136 | buf[3]=(value >> 24) & 0x000000ff; |
lolpcc | 1:6877bb99aa17 | 137 | if(!can.write(CANMessage(id, (char *)buf, 8))) { |
lolpcc | 1:6877bb99aa17 | 138 | lprintf("Error sending %s packet INT (%03x),",cancmd[CAN_INT],id); |
lolpcc | 1:6877bb99aa17 | 139 | can_dump_buffer(buf); |
lolpcc | 1:6877bb99aa17 | 140 | lprintf("\n"); |
lolpcc | 1:6877bb99aa17 | 141 | return; |
lolpcc | 1:6877bb99aa17 | 142 | } |
lolpcc | 1:6877bb99aa17 | 143 | } |
lolpcc | 1:6877bb99aa17 | 144 | /******************************************/ |
lolpcc | 0:9edfcca7cd25 | 145 | /* */ |
lolpcc | 1:6877bb99aa17 | 146 | /* Can Bus Send Who is Out there mes */ |
lolpcc | 1:6877bb99aa17 | 147 | /* */ |
lolpcc | 1:6877bb99aa17 | 148 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 149 | void can_send_who(void) |
lolpcc | 1:6877bb99aa17 | 150 | { |
lolpcc | 1:6877bb99aa17 | 151 | unsigned char buf[0x8]; |
lolpcc | 1:6877bb99aa17 | 152 | int id; |
lolpcc | 1:6877bb99aa17 | 153 | |
lolpcc | 1:6877bb99aa17 | 154 | can_clear_data(buf); |
lolpcc | 1:6877bb99aa17 | 155 | buf[0]=station_id; |
lolpcc | 1:6877bb99aa17 | 156 | id = can_build_id(station_id,0,CAN_WHOIS); |
lolpcc | 1:6877bb99aa17 | 157 | if(!can.write(CANMessage(id, (char *)buf, 8))) { |
lolpcc | 1:6877bb99aa17 | 158 | lprintf("Error sending %s packet WhoIs (%03x),",cancmd[CAN_WHOIS],id); |
lolpcc | 1:6877bb99aa17 | 159 | can_dump_buffer(buf); |
lolpcc | 1:6877bb99aa17 | 160 | lprintf("\n"); |
lolpcc | 1:6877bb99aa17 | 161 | return; |
lolpcc | 1:6877bb99aa17 | 162 | } |
lolpcc | 1:6877bb99aa17 | 163 | } |
lolpcc | 1:6877bb99aa17 | 164 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 165 | /* */ |
lolpcc | 1:6877bb99aa17 | 166 | /* Can Bus Send I Am Out there mes */ |
lolpcc | 1:6877bb99aa17 | 167 | /* */ |
lolpcc | 1:6877bb99aa17 | 168 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 169 | void can_send_iam(int from) |
lolpcc | 1:6877bb99aa17 | 170 | { |
lolpcc | 1:6877bb99aa17 | 171 | unsigned char buf[0x8]; |
lolpcc | 1:6877bb99aa17 | 172 | int id; |
lolpcc | 1:6877bb99aa17 | 173 | |
lolpcc | 1:6877bb99aa17 | 174 | can_clear_data(buf); |
lolpcc | 1:6877bb99aa17 | 175 | buf[0]=station_id; |
lolpcc | 1:6877bb99aa17 | 176 | buf[1]=from; |
lolpcc | 1:6877bb99aa17 | 177 | id = can_build_id(station_id,from,CAN_IAM); |
lolpcc | 1:6877bb99aa17 | 178 | if(!can.write(CANMessage(id, (char *)buf, 8))) { |
lolpcc | 1:6877bb99aa17 | 179 | lprintf("Error sending %s packet I'm Here (%03x),",cancmd[CAN_IAM],id); |
lolpcc | 1:6877bb99aa17 | 180 | can_dump_buffer(buf); |
lolpcc | 1:6877bb99aa17 | 181 | lprintf("\n"); |
lolpcc | 1:6877bb99aa17 | 182 | return; |
lolpcc | 1:6877bb99aa17 | 183 | } |
lolpcc | 1:6877bb99aa17 | 184 | } |
lolpcc | 1:6877bb99aa17 | 185 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 186 | /* */ |
lolpcc | 1:6877bb99aa17 | 187 | /* CAN Bus Send a ticker message */ |
lolpcc | 1:6877bb99aa17 | 188 | /* */ |
lolpcc | 1:6877bb99aa17 | 189 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 190 | void can_ticker_tx(int v) |
lolpcc | 1:6877bb99aa17 | 191 | { |
lolpcc | 1:6877bb99aa17 | 192 | unsigned char buf[0x8]; |
lolpcc | 1:6877bb99aa17 | 193 | int id; |
lolpcc | 1:6877bb99aa17 | 194 | |
lolpcc | 1:6877bb99aa17 | 195 | can_clear_data(buf); |
lolpcc | 1:6877bb99aa17 | 196 | buf[0]=station_id; |
lolpcc | 1:6877bb99aa17 | 197 | buf[4]=v; |
lolpcc | 1:6877bb99aa17 | 198 | id = can_build_id(station_id,0,CAN_IAM); |
lolpcc | 1:6877bb99aa17 | 199 | if(!can.write(CANMessage(id, (char *)buf, 8))) { |
lolpcc | 1:6877bb99aa17 | 200 | lprintf("Error sending %s packet CAN Ticker (%03x),",cancmd[CAN_IAM],id); |
lolpcc | 1:6877bb99aa17 | 201 | can_dump_buffer(buf); |
lolpcc | 1:6877bb99aa17 | 202 | lprintf("\n"); |
lolpcc | 1:6877bb99aa17 | 203 | return; |
lolpcc | 1:6877bb99aa17 | 204 | } |
lolpcc | 1:6877bb99aa17 | 205 | } |
lolpcc | 1:6877bb99aa17 | 206 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 207 | /* */ |
lolpcc | 1:6877bb99aa17 | 208 | /* CAN Bus receiver, show the messages */ |
lolpcc | 0:9edfcca7cd25 | 209 | /* */ |
lolpcc | 0:9edfcca7cd25 | 210 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 211 | void can_receive(void) |
lolpcc | 1:6877bb99aa17 | 212 | { |
lolpcc | 1:6877bb99aa17 | 213 | CANMessage msg; |
lolpcc | 1:6877bb99aa17 | 214 | int pt; |
lolpcc | 1:6877bb99aa17 | 215 | time_t seconds; |
lolpcc | 1:6877bb99aa17 | 216 | |
lolpcc | 1:6877bb99aa17 | 217 | if(can.read(msg)) { |
lolpcc | 1:6877bb99aa17 | 218 | switch(can_decode_id(msg.id,CAN_GET_CMD)){ |
lolpcc | 1:6877bb99aa17 | 219 | case CAN_SYNC : |
lolpcc | 1:6877bb99aa17 | 220 | lprintf("CAN SYNC MESSAGE< what do we do :-)\n"); |
lolpcc | 1:6877bb99aa17 | 221 | break; |
lolpcc | 1:6877bb99aa17 | 222 | case CAN_RAW : |
lolpcc | 1:6877bb99aa17 | 223 | break; |
lolpcc | 1:6877bb99aa17 | 224 | case CAN_SPRT : |
lolpcc | 1:6877bb99aa17 | 225 | if(can_str != NULL){ |
lolpcc | 1:6877bb99aa17 | 226 | lprintf("trying to start a string packet, when the buffer is in use\n"); |
lolpcc | 1:6877bb99aa17 | 227 | } else { |
lolpcc | 1:6877bb99aa17 | 228 | can_str = can_buffer_create(msg.data[1]+2); |
lolpcc | 1:6877bb99aa17 | 229 | } |
lolpcc | 1:6877bb99aa17 | 230 | break; |
lolpcc | 1:6877bb99aa17 | 231 | case CAN_EPRT : |
lolpcc | 1:6877bb99aa17 | 232 | find_cmd(can_str); |
lolpcc | 1:6877bb99aa17 | 233 | free(can_str); |
lolpcc | 1:6877bb99aa17 | 234 | can_str = NULL; |
lolpcc | 1:6877bb99aa17 | 235 | break; |
lolpcc | 1:6877bb99aa17 | 236 | case CAN_INT : |
lolpcc | 1:6877bb99aa17 | 237 | lprintf("Recieved an int 0x%08x\n", msg.data[0] | msg.data[1]<<8 | msg.data[2]<<16 | msg.data[3]<<24); |
lolpcc | 1:6877bb99aa17 | 238 | break; |
lolpcc | 1:6877bb99aa17 | 239 | case CAN_TIME : |
lolpcc | 1:6877bb99aa17 | 240 | seconds = msg.data[0] | msg.data[1]<<8 | msg.data[2]<<16 | msg.data[3]<<24; |
lolpcc | 1:6877bb99aa17 | 241 | set_time(seconds); |
lolpcc | 1:6877bb99aa17 | 242 | break; |
lolpcc | 1:6877bb99aa17 | 243 | case CAN_WHOIS : |
lolpcc | 1:6877bb99aa17 | 244 | wait(station_id/10); |
lolpcc | 1:6877bb99aa17 | 245 | can_send_iam(msg.data[0]); |
lolpcc | 1:6877bb99aa17 | 246 | break; |
lolpcc | 1:6877bb99aa17 | 247 | case CAN_IAM : |
lolpcc | 1:6877bb99aa17 | 248 | lprintf("Can_I_AM responce station id %02x, you where %02x\n", |
lolpcc | 1:6877bb99aa17 | 249 | msg.data[0],msg.data[1]); |
lolpcc | 1:6877bb99aa17 | 250 | break; |
lolpcc | 1:6877bb99aa17 | 251 | case CAN_PRT : |
lolpcc | 1:6877bb99aa17 | 252 | pt = can_decode_id(msg.id,CAN_GET_CNT); |
lolpcc | 1:6877bb99aa17 | 253 | can_str[(pt*8)+0] = msg.data[0]; |
lolpcc | 1:6877bb99aa17 | 254 | can_str[(pt*8)+1] = msg.data[1]; |
lolpcc | 1:6877bb99aa17 | 255 | can_str[(pt*8)+2] = msg.data[2]; |
lolpcc | 1:6877bb99aa17 | 256 | can_str[(pt*8)+3] = msg.data[3]; |
lolpcc | 1:6877bb99aa17 | 257 | can_str[(pt*8)+4] = msg.data[4]; |
lolpcc | 1:6877bb99aa17 | 258 | can_str[(pt*8)+5] = msg.data[5]; |
lolpcc | 1:6877bb99aa17 | 259 | can_str[(pt*8)+6] = msg.data[6]; |
lolpcc | 1:6877bb99aa17 | 260 | can_str[(pt*8)+7] = msg.data[7]; |
lolpcc | 1:6877bb99aa17 | 261 | break; |
lolpcc | 1:6877bb99aa17 | 262 | default : |
lolpcc | 1:6877bb99aa17 | 263 | lprintf("CAN receive, unknown message %d\n",can_decode_id(msg.id,CAN_GET_CMD)); |
lolpcc | 1:6877bb99aa17 | 264 | } |
lolpcc | 0:9edfcca7cd25 | 265 | } |
lolpcc | 0:9edfcca7cd25 | 266 | } |
lolpcc | 1:6877bb99aa17 | 267 | |
lolpcc | 1:6877bb99aa17 | 268 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 269 | /* */ |
lolpcc | 1:6877bb99aa17 | 270 | /* Setup the CAN bus for use */ |
lolpcc | 1:6877bb99aa17 | 271 | /* */ |
lolpcc | 1:6877bb99aa17 | 272 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 273 | void can_init(void) |
lolpcc | 0:9edfcca7cd25 | 274 | { |
lolpcc | 0:9edfcca7cd25 | 275 | // 500kbit/s |
lolpcc | 1:6877bb99aa17 | 276 | // can.frequency(500000); |
lolpcc | 1:6877bb99aa17 | 277 | // 10kbits/s, for testing |
lolpcc | 1:6877bb99aa17 | 278 | can.frequency(10000); |
lolpcc | 0:9edfcca7cd25 | 279 | // activate external can transceiver |
lolpcc | 0:9edfcca7cd25 | 280 | can_Pca82c250SlopePin = 0; |
lolpcc | 1:6877bb99aa17 | 281 | can_str = NULL; /* Mark the input buffer as free */ |
lolpcc | 1:6877bb99aa17 | 282 | } |
lolpcc | 1:6877bb99aa17 | 283 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 284 | /* */ |
lolpcc | 1:6877bb99aa17 | 285 | /* Setup the CAN message ID */ |
lolpcc | 1:6877bb99aa17 | 286 | /* */ |
lolpcc | 1:6877bb99aa17 | 287 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 288 | int can_build_id(char station, char dest, int cmd) |
lolpcc | 1:6877bb99aa17 | 289 | { |
lolpcc | 1:6877bb99aa17 | 290 | int add, dst,c = 0,id = 0; |
lolpcc | 1:6877bb99aa17 | 291 | add = station << 8; |
lolpcc | 1:6877bb99aa17 | 292 | dst = dest << 4; |
lolpcc | 0:9edfcca7cd25 | 293 | |
lolpcc | 1:6877bb99aa17 | 294 | switch(cmd) { |
lolpcc | 1:6877bb99aa17 | 295 | case CAN_SYNC : |
lolpcc | 1:6877bb99aa17 | 296 | c = 0; |
lolpcc | 1:6877bb99aa17 | 297 | add = 0; |
lolpcc | 1:6877bb99aa17 | 298 | dst = 0; |
lolpcc | 1:6877bb99aa17 | 299 | break; |
lolpcc | 1:6877bb99aa17 | 300 | case CAN_RAW : |
lolpcc | 1:6877bb99aa17 | 301 | c = 1; |
lolpcc | 1:6877bb99aa17 | 302 | break; |
lolpcc | 1:6877bb99aa17 | 303 | case CAN_SPRT : |
lolpcc | 1:6877bb99aa17 | 304 | c = 2; |
lolpcc | 1:6877bb99aa17 | 305 | break; |
lolpcc | 1:6877bb99aa17 | 306 | case CAN_EPRT : |
lolpcc | 1:6877bb99aa17 | 307 | c = 3; |
lolpcc | 1:6877bb99aa17 | 308 | break; |
lolpcc | 1:6877bb99aa17 | 309 | case CAN_INT : |
lolpcc | 1:6877bb99aa17 | 310 | c = 4; |
lolpcc | 1:6877bb99aa17 | 311 | break; |
lolpcc | 1:6877bb99aa17 | 312 | case CAN_TIME : |
lolpcc | 1:6877bb99aa17 | 313 | c = 5; |
lolpcc | 1:6877bb99aa17 | 314 | break; |
lolpcc | 1:6877bb99aa17 | 315 | case CAN_S2 : |
lolpcc | 1:6877bb99aa17 | 316 | c = 6; |
lolpcc | 1:6877bb99aa17 | 317 | break; |
lolpcc | 1:6877bb99aa17 | 318 | case CAN_S3 : |
lolpcc | 1:6877bb99aa17 | 319 | c = 7; |
lolpcc | 1:6877bb99aa17 | 320 | break; |
lolpcc | 1:6877bb99aa17 | 321 | case CAN_S4 : |
lolpcc | 1:6877bb99aa17 | 322 | c = 8; |
lolpcc | 1:6877bb99aa17 | 323 | break; |
lolpcc | 1:6877bb99aa17 | 324 | case CAN_S5 : |
lolpcc | 1:6877bb99aa17 | 325 | c = 9; |
lolpcc | 1:6877bb99aa17 | 326 | break; |
lolpcc | 1:6877bb99aa17 | 327 | case CAN_S6 : |
lolpcc | 1:6877bb99aa17 | 328 | c = 0xa; |
lolpcc | 1:6877bb99aa17 | 329 | break; |
lolpcc | 1:6877bb99aa17 | 330 | case CAN_S7 : |
lolpcc | 1:6877bb99aa17 | 331 | c = 0xb; |
lolpcc | 1:6877bb99aa17 | 332 | break; |
lolpcc | 1:6877bb99aa17 | 333 | case CAN_S8 : |
lolpcc | 1:6877bb99aa17 | 334 | c = 0xc; |
lolpcc | 1:6877bb99aa17 | 335 | break; |
lolpcc | 1:6877bb99aa17 | 336 | case CAN_S9 : |
lolpcc | 1:6877bb99aa17 | 337 | c = 0xd; |
lolpcc | 1:6877bb99aa17 | 338 | break; |
lolpcc | 1:6877bb99aa17 | 339 | case CAN_WHOIS : |
lolpcc | 1:6877bb99aa17 | 340 | c = 0xe; |
lolpcc | 1:6877bb99aa17 | 341 | break; |
lolpcc | 1:6877bb99aa17 | 342 | case CAN_IAM : |
lolpcc | 1:6877bb99aa17 | 343 | c = 0xf; |
lolpcc | 1:6877bb99aa17 | 344 | break; |
lolpcc | 1:6877bb99aa17 | 345 | case CAN_PRT : |
lolpcc | 1:6877bb99aa17 | 346 | c = 0x80; |
lolpcc | 1:6877bb99aa17 | 347 | break; |
lolpcc | 1:6877bb99aa17 | 348 | default : |
lolpcc | 1:6877bb99aa17 | 349 | lprintf("CAN Message Selector switch, unknown message %d\n",cmd); |
lolpcc | 1:6877bb99aa17 | 350 | return(-1); |
lolpcc | 1:6877bb99aa17 | 351 | } |
lolpcc | 1:6877bb99aa17 | 352 | /* Build the message ID */ |
lolpcc | 1:6877bb99aa17 | 353 | id = c | add | dst; |
lolpcc | 1:6877bb99aa17 | 354 | return(id); |
lolpcc | 1:6877bb99aa17 | 355 | } |
lolpcc | 1:6877bb99aa17 | 356 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 357 | /* */ |
lolpcc | 1:6877bb99aa17 | 358 | /* Get the data from the can message ID */ |
lolpcc | 1:6877bb99aa17 | 359 | /* */ |
lolpcc | 1:6877bb99aa17 | 360 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 361 | int can_decode_id(int id, int what) |
lolpcc | 1:6877bb99aa17 | 362 | { |
lolpcc | 1:6877bb99aa17 | 363 | switch(what){ |
lolpcc | 1:6877bb99aa17 | 364 | case CAN_SENDER_ID : /* Who sent the message */ |
lolpcc | 1:6877bb99aa17 | 365 | return((id & 0xf00)>>8); |
lolpcc | 1:6877bb99aa17 | 366 | case CAN_OUR_ID : /* who is it for */ |
lolpcc | 1:6877bb99aa17 | 367 | return((id &0x070)>>4); |
lolpcc | 1:6877bb99aa17 | 368 | case CAN_IS_PRT : /* is it a string packet */ |
lolpcc | 1:6877bb99aa17 | 369 | return((id &0x080)); |
lolpcc | 1:6877bb99aa17 | 370 | case CAN_GET_CNT : /* Get the packet count value */ |
lolpcc | 1:6877bb99aa17 | 371 | return((id & 0x00f)); |
lolpcc | 1:6877bb99aa17 | 372 | case CAN_GET_CMD : /* count and cmd live on the first 4 bits */ |
lolpcc | 1:6877bb99aa17 | 373 | if(can_decode_id(id,CAN_IS_PRT)) |
lolpcc | 1:6877bb99aa17 | 374 | return(CAN_PRT); |
lolpcc | 1:6877bb99aa17 | 375 | return((id & 0x00f)); |
lolpcc | 1:6877bb99aa17 | 376 | default : |
lolpcc | 1:6877bb99aa17 | 377 | lprintf("Unknown CAN Id decode request %02x\n",what); |
lolpcc | 1:6877bb99aa17 | 378 | return(0); |
lolpcc | 1:6877bb99aa17 | 379 | } |
lolpcc | 1:6877bb99aa17 | 380 | } |
lolpcc | 1:6877bb99aa17 | 381 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 382 | /* */ |
lolpcc | 1:6877bb99aa17 | 383 | /* Build a buffer for transmit, from a */ |
lolpcc | 1:6877bb99aa17 | 384 | /* source buffer, of variable length */ |
lolpcc | 1:6877bb99aa17 | 385 | /* this code is re-entrant, state held */ |
lolpcc | 1:6877bb99aa17 | 386 | /* in the parent routine */ |
lolpcc | 1:6877bb99aa17 | 387 | /* Safe for raw, and string data */ |
lolpcc | 1:6877bb99aa17 | 388 | /* */ |
lolpcc | 1:6877bb99aa17 | 389 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 390 | int can_build_data(int len, int pt, unsigned char *data, unsigned char *buffer) |
lolpcc | 1:6877bb99aa17 | 391 | { |
lolpcc | 1:6877bb99aa17 | 392 | int a = 0; |
lolpcc | 1:6877bb99aa17 | 393 | int px; |
lolpcc | 1:6877bb99aa17 | 394 | |
lolpcc | 1:6877bb99aa17 | 395 | px = pt; |
lolpcc | 1:6877bb99aa17 | 396 | |
lolpcc | 1:6877bb99aa17 | 397 | while(a!=MAX_CAN_BUF){ |
lolpcc | 1:6877bb99aa17 | 398 | if(px<=len){ |
lolpcc | 1:6877bb99aa17 | 399 | buffer[a] = data[px]; |
lolpcc | 1:6877bb99aa17 | 400 | px++; |
lolpcc | 1:6877bb99aa17 | 401 | } else { |
lolpcc | 1:6877bb99aa17 | 402 | buffer[a] = 0x00; |
lolpcc | 1:6877bb99aa17 | 403 | } |
lolpcc | 1:6877bb99aa17 | 404 | a++; |
lolpcc | 1:6877bb99aa17 | 405 | } |
lolpcc | 1:6877bb99aa17 | 406 | if(px <= len) |
lolpcc | 1:6877bb99aa17 | 407 | return(px); |
lolpcc | 1:6877bb99aa17 | 408 | else |
lolpcc | 1:6877bb99aa17 | 409 | return(0); |
lolpcc | 1:6877bb99aa17 | 410 | } |
lolpcc | 1:6877bb99aa17 | 411 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 412 | /* */ |
lolpcc | 1:6877bb99aa17 | 413 | /* Clear the TX buffer to Zero's */ |
lolpcc | 1:6877bb99aa17 | 414 | /* Safe for raw, and string data */ |
lolpcc | 1:6877bb99aa17 | 415 | /* */ |
lolpcc | 1:6877bb99aa17 | 416 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 417 | void can_clear_data(unsigned char *buffer) |
lolpcc | 1:6877bb99aa17 | 418 | { |
lolpcc | 1:6877bb99aa17 | 419 | int a = 0; |
lolpcc | 1:6877bb99aa17 | 420 | while(a != MAX_CAN_BUF){ |
lolpcc | 1:6877bb99aa17 | 421 | buffer[a] = 0x00; |
lolpcc | 1:6877bb99aa17 | 422 | a++; |
lolpcc | 1:6877bb99aa17 | 423 | } |
lolpcc | 1:6877bb99aa17 | 424 | } |
lolpcc | 1:6877bb99aa17 | 425 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 426 | /* */ |
lolpcc | 1:6877bb99aa17 | 427 | /* Dump the TX buffer to the user */ |
lolpcc | 1:6877bb99aa17 | 428 | /* Safe for raw, and string data */ |
lolpcc | 1:6877bb99aa17 | 429 | /* */ |
lolpcc | 1:6877bb99aa17 | 430 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 431 | void can_dump_buffer(unsigned char *buffer) |
lolpcc | 1:6877bb99aa17 | 432 | { |
lolpcc | 1:6877bb99aa17 | 433 | int a = 0; |
lolpcc | 1:6877bb99aa17 | 434 | lprintf(" "); |
lolpcc | 1:6877bb99aa17 | 435 | while(a != MAX_CAN_BUF){ |
lolpcc | 1:6877bb99aa17 | 436 | lprintf("%02x",buffer[a]); |
lolpcc | 1:6877bb99aa17 | 437 | if(buffer[a] > 0x20 & buffer[a] < 0x7f) |
lolpcc | 1:6877bb99aa17 | 438 | lprintf("(%c),",buffer[a]); |
lolpcc | 1:6877bb99aa17 | 439 | else |
lolpcc | 1:6877bb99aa17 | 440 | lprintf(", "); |
lolpcc | 1:6877bb99aa17 | 441 | a++; |
lolpcc | 1:6877bb99aa17 | 442 | } |
lolpcc | 1:6877bb99aa17 | 443 | } |
lolpcc | 1:6877bb99aa17 | 444 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 445 | /* */ |
lolpcc | 1:6877bb99aa17 | 446 | /* Create a new string buffer for can RX */ |
lolpcc | 1:6877bb99aa17 | 447 | /* */ |
lolpcc | 1:6877bb99aa17 | 448 | /******************************************/ |
lolpcc | 1:6877bb99aa17 | 449 | char *can_buffer_create(int size) |
lolpcc | 1:6877bb99aa17 | 450 | { |
lolpcc | 1:6877bb99aa17 | 451 | char *str; |
lolpcc | 1:6877bb99aa17 | 452 | int pt; |
lolpcc | 1:6877bb99aa17 | 453 | |
lolpcc | 1:6877bb99aa17 | 454 | str = (char *)malloc(sizeof(char)*size); |
lolpcc | 1:6877bb99aa17 | 455 | pt = 0; |
lolpcc | 1:6877bb99aa17 | 456 | while(pt!=size){ |
lolpcc | 1:6877bb99aa17 | 457 | str[pt]='\0'; |
lolpcc | 1:6877bb99aa17 | 458 | pt++; |
lolpcc | 1:6877bb99aa17 | 459 | } |
lolpcc | 1:6877bb99aa17 | 460 | return(str); |
lolpcc | 1:6877bb99aa17 | 461 | } |
lolpcc | 1:6877bb99aa17 | 462 |