Transplantation from Arduino MCP2515 Library which is made by Kyle Crockett. http://code.google.com/p/canduino/source/browse/trunk/Library/CAN/CAN.h?r=24

Dependents:   DISCO-F746NG_rtos_test

Committer:
FalconOnishi
Date:
Fri Jan 18 17:00:28 2013 +0000
Revision:
0:b65cb1bbf0ce
Add some utility methods

Who changed what in which revision?

UserRevisionLine numberNew contents of line
FalconOnishi 0:b65cb1bbf0ce 1
FalconOnishi 0:b65cb1bbf0ce 2 #include "MCP2515.h"
FalconOnishi 0:b65cb1bbf0ce 3
FalconOnishi 0:b65cb1bbf0ce 4 MCP2515::MCP2515(SPI& spi, PinName cs) : spi(spi), cs(cs)
FalconOnishi 0:b65cb1bbf0ce 5 {
FalconOnishi 0:b65cb1bbf0ce 6 /*
FalconOnishi 0:b65cb1bbf0ce 7 reset = 0; // RESET MCP2515 CONTROLLER
FalconOnishi 0:b65cb1bbf0ce 8 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 9 reset = 1;
FalconOnishi 0:b65cb1bbf0ce 10 wait_ms(100);
FalconOnishi 0:b65cb1bbf0ce 11 */
FalconOnishi 0:b65cb1bbf0ce 12 }
FalconOnishi 0:b65cb1bbf0ce 13
FalconOnishi 0:b65cb1bbf0ce 14 void MCP2515::baudConfig(int bitRate)//sets bitrate for MCP2515 node
FalconOnishi 0:b65cb1bbf0ce 15 {
FalconOnishi 0:b65cb1bbf0ce 16 byte config0 = 0x00;
FalconOnishi 0:b65cb1bbf0ce 17 byte config1 = 0x00;
FalconOnishi 0:b65cb1bbf0ce 18 byte config2 = 0x00;
FalconOnishi 0:b65cb1bbf0ce 19
FalconOnishi 0:b65cb1bbf0ce 20 switch (bitRate)
FalconOnishi 0:b65cb1bbf0ce 21 {
FalconOnishi 0:b65cb1bbf0ce 22 case 10:
FalconOnishi 0:b65cb1bbf0ce 23 config0 = 0x31;
FalconOnishi 0:b65cb1bbf0ce 24 config1 = 0xB8;
FalconOnishi 0:b65cb1bbf0ce 25 config2 = 0x05;
FalconOnishi 0:b65cb1bbf0ce 26 break;
FalconOnishi 0:b65cb1bbf0ce 27
FalconOnishi 0:b65cb1bbf0ce 28 case 20:
FalconOnishi 0:b65cb1bbf0ce 29 config0 = 0x18;
FalconOnishi 0:b65cb1bbf0ce 30 config1 = 0xB8;
FalconOnishi 0:b65cb1bbf0ce 31 config2 = 0x05;
FalconOnishi 0:b65cb1bbf0ce 32 break;
FalconOnishi 0:b65cb1bbf0ce 33
FalconOnishi 0:b65cb1bbf0ce 34 case 50:
FalconOnishi 0:b65cb1bbf0ce 35 config0 = 0x09;
FalconOnishi 0:b65cb1bbf0ce 36 config1 = 0xB8;
FalconOnishi 0:b65cb1bbf0ce 37 config2 = 0x05;
FalconOnishi 0:b65cb1bbf0ce 38 break;
FalconOnishi 0:b65cb1bbf0ce 39
FalconOnishi 0:b65cb1bbf0ce 40 case 100:
FalconOnishi 0:b65cb1bbf0ce 41 config0 = 0x04;
FalconOnishi 0:b65cb1bbf0ce 42 config1 = 0xB8;
FalconOnishi 0:b65cb1bbf0ce 43 config2 = 0x05;
FalconOnishi 0:b65cb1bbf0ce 44 break;
FalconOnishi 0:b65cb1bbf0ce 45
FalconOnishi 0:b65cb1bbf0ce 46 case 125:
FalconOnishi 0:b65cb1bbf0ce 47 config0 = 0x03;
FalconOnishi 0:b65cb1bbf0ce 48 config1 = 0xB8;
FalconOnishi 0:b65cb1bbf0ce 49 config2 = 0x05;
FalconOnishi 0:b65cb1bbf0ce 50 break;
FalconOnishi 0:b65cb1bbf0ce 51
FalconOnishi 0:b65cb1bbf0ce 52 case 250:
FalconOnishi 0:b65cb1bbf0ce 53 config0 = 0x01;
FalconOnishi 0:b65cb1bbf0ce 54 config1 = 0xB8;
FalconOnishi 0:b65cb1bbf0ce 55 config2 = 0x05;
FalconOnishi 0:b65cb1bbf0ce 56 break;
FalconOnishi 0:b65cb1bbf0ce 57
FalconOnishi 0:b65cb1bbf0ce 58 case 500:
FalconOnishi 0:b65cb1bbf0ce 59 config0 = 0x00;
FalconOnishi 0:b65cb1bbf0ce 60 config1 = 0xB8;
FalconOnishi 0:b65cb1bbf0ce 61 config2 = 0x05;
FalconOnishi 0:b65cb1bbf0ce 62 break;
FalconOnishi 0:b65cb1bbf0ce 63 case 1000:
FalconOnishi 0:b65cb1bbf0ce 64 //1 megabit mode added by Patrick Cruce(pcruce_at_igpp.ucla.edu)
FalconOnishi 0:b65cb1bbf0ce 65 //Faster communications enabled by shortening bit timing phases(3 Tq. PS1 & 3 Tq. PS2) Note that this may exacerbate errors due to synchronization or arbitration.
FalconOnishi 0:b65cb1bbf0ce 66 config0 = 0x80;
FalconOnishi 0:b65cb1bbf0ce 67 config1 = 0x90;
FalconOnishi 0:b65cb1bbf0ce 68 config2 = 0x02;
FalconOnishi 0:b65cb1bbf0ce 69 }
FalconOnishi 0:b65cb1bbf0ce 70 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 71 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 72 spi.write(WRITE);
FalconOnishi 0:b65cb1bbf0ce 73 spi.write(CNF0);
FalconOnishi 0:b65cb1bbf0ce 74 spi.write(config0);
FalconOnishi 0:b65cb1bbf0ce 75 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 76 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 77 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 78
FalconOnishi 0:b65cb1bbf0ce 79 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 80 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 81 spi.write(WRITE);
FalconOnishi 0:b65cb1bbf0ce 82 spi.write(CNF1);
FalconOnishi 0:b65cb1bbf0ce 83 spi.write(config1);
FalconOnishi 0:b65cb1bbf0ce 84 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 85 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 86 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 87
FalconOnishi 0:b65cb1bbf0ce 88 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 89 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 90 spi.write(WRITE);
FalconOnishi 0:b65cb1bbf0ce 91 spi.write(CNF2);
FalconOnishi 0:b65cb1bbf0ce 92 spi.write(config2);
FalconOnishi 0:b65cb1bbf0ce 93 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 94 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 95 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 96 }
FalconOnishi 0:b65cb1bbf0ce 97
FalconOnishi 0:b65cb1bbf0ce 98 //Method added to enable testing in loopback mode.(pcruce_at_igpp.ucla.edu)
FalconOnishi 0:b65cb1bbf0ce 99 void MCP2515::setMode(MCP2515Mode mode) { //put MCP2515 controller in one of five modes
FalconOnishi 0:b65cb1bbf0ce 100
FalconOnishi 0:b65cb1bbf0ce 101 //byte writeVal,mask,readVal;
FalconOnishi 0:b65cb1bbf0ce 102 byte writeVal = 0x00;
FalconOnishi 0:b65cb1bbf0ce 103 byte mask = 0x00;
FalconOnishi 0:b65cb1bbf0ce 104
FalconOnishi 0:b65cb1bbf0ce 105 switch(mode) {
FalconOnishi 0:b65cb1bbf0ce 106 case CONFIGURATION:
FalconOnishi 0:b65cb1bbf0ce 107 writeVal = 0x80;
FalconOnishi 0:b65cb1bbf0ce 108 break;
FalconOnishi 0:b65cb1bbf0ce 109 case NORMAL:
FalconOnishi 0:b65cb1bbf0ce 110 writeVal = 0x00;
FalconOnishi 0:b65cb1bbf0ce 111 break;
FalconOnishi 0:b65cb1bbf0ce 112 case SLEEP:
FalconOnishi 0:b65cb1bbf0ce 113 writeVal = 0x20;
FalconOnishi 0:b65cb1bbf0ce 114 break;
FalconOnishi 0:b65cb1bbf0ce 115 case LISTEN:
FalconOnishi 0:b65cb1bbf0ce 116 writeVal = 0x60;
FalconOnishi 0:b65cb1bbf0ce 117 break;
FalconOnishi 0:b65cb1bbf0ce 118 case LOOPBACK:
FalconOnishi 0:b65cb1bbf0ce 119 writeVal = 0x40;
FalconOnishi 0:b65cb1bbf0ce 120 break;
FalconOnishi 0:b65cb1bbf0ce 121 }
FalconOnishi 0:b65cb1bbf0ce 122
FalconOnishi 0:b65cb1bbf0ce 123 mask = 0xE0;
FalconOnishi 0:b65cb1bbf0ce 124
FalconOnishi 0:b65cb1bbf0ce 125 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 126 spi.write(BIT_MODIFY);
FalconOnishi 0:b65cb1bbf0ce 127 spi.write(MCP2515CTRL);
FalconOnishi 0:b65cb1bbf0ce 128 spi.write(mask);
FalconOnishi 0:b65cb1bbf0ce 129 spi.write(writeVal);
FalconOnishi 0:b65cb1bbf0ce 130 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 131
FalconOnishi 0:b65cb1bbf0ce 132 }
FalconOnishi 0:b65cb1bbf0ce 133
FalconOnishi 0:b65cb1bbf0ce 134
FalconOnishi 0:b65cb1bbf0ce 135 void MCP2515::send_0()//transmits buffer 0
FalconOnishi 0:b65cb1bbf0ce 136 {
FalconOnishi 0:b65cb1bbf0ce 137
FalconOnishi 0:b65cb1bbf0ce 138 //wait_mss removed from SEND command(pcruce_at_igpp.ucla.edu)
FalconOnishi 0:b65cb1bbf0ce 139 //In testing we found that any lost data was from PC<->Serial wait_mss,
FalconOnishi 0:b65cb1bbf0ce 140 //Not MCP2515 Controller/AVR wait_mss. Thus removing the wait_mss at this level
FalconOnishi 0:b65cb1bbf0ce 141 //allows maximum flexibility and performance.
FalconOnishi 0:b65cb1bbf0ce 142 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 143 spi.write(SEND_TX_BUF_0);
FalconOnishi 0:b65cb1bbf0ce 144 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 145 }
FalconOnishi 0:b65cb1bbf0ce 146
FalconOnishi 0:b65cb1bbf0ce 147 void MCP2515::send_1()//transmits buffer 1
FalconOnishi 0:b65cb1bbf0ce 148 {
FalconOnishi 0:b65cb1bbf0ce 149 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 150 spi.write(SEND_TX_BUF_1);
FalconOnishi 0:b65cb1bbf0ce 151 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 152 }
FalconOnishi 0:b65cb1bbf0ce 153
FalconOnishi 0:b65cb1bbf0ce 154 void MCP2515::send_2()//transmits buffer 2
FalconOnishi 0:b65cb1bbf0ce 155 {
FalconOnishi 0:b65cb1bbf0ce 156 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 157 spi.write(SEND_TX_BUF_2);
FalconOnishi 0:b65cb1bbf0ce 158 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 159 }
FalconOnishi 0:b65cb1bbf0ce 160
FalconOnishi 0:b65cb1bbf0ce 161 char MCP2515::readID_0()//reads ID in recieve buffer 0
FalconOnishi 0:b65cb1bbf0ce 162 {
FalconOnishi 0:b65cb1bbf0ce 163 char retVal;
FalconOnishi 0:b65cb1bbf0ce 164 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 165 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 166 spi.write(READ_RX_BUF_0_ID);
FalconOnishi 0:b65cb1bbf0ce 167 retVal = spi.write(0xFF);
FalconOnishi 0:b65cb1bbf0ce 168 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 169 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 170 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 171 return retVal;
FalconOnishi 0:b65cb1bbf0ce 172 }
FalconOnishi 0:b65cb1bbf0ce 173
FalconOnishi 0:b65cb1bbf0ce 174 char MCP2515::readID_1()//reads ID in reciever buffer 1
FalconOnishi 0:b65cb1bbf0ce 175 {
FalconOnishi 0:b65cb1bbf0ce 176 char retVal;
FalconOnishi 0:b65cb1bbf0ce 177 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 178 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 179 spi.write(READ_RX_BUF_1_ID);
FalconOnishi 0:b65cb1bbf0ce 180 retVal = spi.write(0xFF);
FalconOnishi 0:b65cb1bbf0ce 181 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 182 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 183 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 184 return retVal;
FalconOnishi 0:b65cb1bbf0ce 185 }
FalconOnishi 0:b65cb1bbf0ce 186
FalconOnishi 0:b65cb1bbf0ce 187 char MCP2515::readDATA_0()//reads DATA in recieve buffer 0
FalconOnishi 0:b65cb1bbf0ce 188 {
FalconOnishi 0:b65cb1bbf0ce 189 char retVal;
FalconOnishi 0:b65cb1bbf0ce 190 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 191 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 192 spi.write( READ_RX_BUF_0_DATA);
FalconOnishi 0:b65cb1bbf0ce 193 retVal = spi.write(0xFF);
FalconOnishi 0:b65cb1bbf0ce 194 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 195 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 196 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 197 return retVal;
FalconOnishi 0:b65cb1bbf0ce 198 }
FalconOnishi 0:b65cb1bbf0ce 199
FalconOnishi 0:b65cb1bbf0ce 200 char MCP2515::readDATA_1()//reads data in recieve buffer 1
FalconOnishi 0:b65cb1bbf0ce 201 {
FalconOnishi 0:b65cb1bbf0ce 202 char retVal;
FalconOnishi 0:b65cb1bbf0ce 203 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 204 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 205 spi.write( READ_RX_BUF_1_DATA);
FalconOnishi 0:b65cb1bbf0ce 206 retVal = spi.write(0xFF);
FalconOnishi 0:b65cb1bbf0ce 207 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 208 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 209 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 210 return retVal;
FalconOnishi 0:b65cb1bbf0ce 211 }
FalconOnishi 0:b65cb1bbf0ce 212
FalconOnishi 0:b65cb1bbf0ce 213 //extending MCP2515 data read to full frames(pcruce_at_igpp.ucla.edu)
FalconOnishi 0:b65cb1bbf0ce 214 //It is the responsibility of the user to allocate memory for output.
FalconOnishi 0:b65cb1bbf0ce 215 //If you don't know what length the bus frames will be, data_out should be 8-bytes
FalconOnishi 0:b65cb1bbf0ce 216 void MCP2515::readDATA_ff_0(byte* length_out,byte *data_out,unsigned short *id_out){
FalconOnishi 0:b65cb1bbf0ce 217
FalconOnishi 0:b65cb1bbf0ce 218 byte len,i;
FalconOnishi 0:b65cb1bbf0ce 219 unsigned short id_h,id_l;
FalconOnishi 0:b65cb1bbf0ce 220
FalconOnishi 0:b65cb1bbf0ce 221 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 222 spi.write(READ_RX_BUF_0_ID);
FalconOnishi 0:b65cb1bbf0ce 223 id_h = (unsigned short) spi.write(0xFF); //id high
FalconOnishi 0:b65cb1bbf0ce 224 id_l = (unsigned short) spi.write(0xFF); //id low
FalconOnishi 0:b65cb1bbf0ce 225 spi.write(0xFF); //extended id high(unused)
FalconOnishi 0:b65cb1bbf0ce 226 spi.write(0xFF); //extended id low(unused)
FalconOnishi 0:b65cb1bbf0ce 227 len = (spi.write(0xFF) & 0x0F); //data length code
FalconOnishi 0:b65cb1bbf0ce 228 for (i = 0;i<len;i++) {
FalconOnishi 0:b65cb1bbf0ce 229 data_out[i] = spi.write(0xFF);
FalconOnishi 0:b65cb1bbf0ce 230 }
FalconOnishi 0:b65cb1bbf0ce 231 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 232 (*length_out) = len;
FalconOnishi 0:b65cb1bbf0ce 233 (*id_out) = ((id_h << 3) + ((id_l & 0xE0) >> 5)); //repack identifier
FalconOnishi 0:b65cb1bbf0ce 234
FalconOnishi 0:b65cb1bbf0ce 235 }
FalconOnishi 0:b65cb1bbf0ce 236
FalconOnishi 0:b65cb1bbf0ce 237 void MCP2515::readDATA_ff_1(byte* length_out,byte *data_out,unsigned short *id_out){
FalconOnishi 0:b65cb1bbf0ce 238
FalconOnishi 0:b65cb1bbf0ce 239 byte id_h,id_l,len,i;
FalconOnishi 0:b65cb1bbf0ce 240
FalconOnishi 0:b65cb1bbf0ce 241 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 242 spi.write(READ_RX_BUF_1_ID);
FalconOnishi 0:b65cb1bbf0ce 243 id_h = spi.write(0xFF); //id high
FalconOnishi 0:b65cb1bbf0ce 244 id_l = spi.write(0xFF); //id low
FalconOnishi 0:b65cb1bbf0ce 245 spi.write(0xFF); //extended id high(unused)
FalconOnishi 0:b65cb1bbf0ce 246 spi.write(0xFF); //extended id low(unused)
FalconOnishi 0:b65cb1bbf0ce 247 len = (spi.write(0xFF) & 0x0F); //data length code
FalconOnishi 0:b65cb1bbf0ce 248 for (i = 0;i<len;i++) {
FalconOnishi 0:b65cb1bbf0ce 249 data_out[i] = spi.write(0xFF);
FalconOnishi 0:b65cb1bbf0ce 250 }
FalconOnishi 0:b65cb1bbf0ce 251 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 252
FalconOnishi 0:b65cb1bbf0ce 253 (*length_out) = len;
FalconOnishi 0:b65cb1bbf0ce 254 (*id_out) = ((((unsigned short) id_h) << 3) + ((id_l & 0xE0) >> 5)); //repack identifier
FalconOnishi 0:b65cb1bbf0ce 255 }
FalconOnishi 0:b65cb1bbf0ce 256
FalconOnishi 0:b65cb1bbf0ce 257 //Adding method to read status register
FalconOnishi 0:b65cb1bbf0ce 258 //MCP2515 be used to determine whether a frame was received.
FalconOnishi 0:b65cb1bbf0ce 259 //(readStatus() & 0x80) == 0x80 means frame in buffer 0
FalconOnishi 0:b65cb1bbf0ce 260 //(readStatus() & 0x40) == 0x40 means frame in buffer 1
FalconOnishi 0:b65cb1bbf0ce 261 byte MCP2515::readStatus()
FalconOnishi 0:b65cb1bbf0ce 262 {
FalconOnishi 0:b65cb1bbf0ce 263 byte retVal;
FalconOnishi 0:b65cb1bbf0ce 264 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 265 spi.write(READ_STATUS);
FalconOnishi 0:b65cb1bbf0ce 266 retVal = spi.write(0xFF);
FalconOnishi 0:b65cb1bbf0ce 267 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 268 return retVal;
FalconOnishi 0:b65cb1bbf0ce 269
FalconOnishi 0:b65cb1bbf0ce 270 }
FalconOnishi 0:b65cb1bbf0ce 271
FalconOnishi 0:b65cb1bbf0ce 272 void MCP2515::load_0(byte identifier, byte data)//loads ID and DATA into transmit buffer 0
FalconOnishi 0:b65cb1bbf0ce 273 {
FalconOnishi 0:b65cb1bbf0ce 274 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 275 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 276 spi.write(LOAD_TX_BUF_0_ID);
FalconOnishi 0:b65cb1bbf0ce 277 spi.write(identifier);
FalconOnishi 0:b65cb1bbf0ce 278 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 279 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 280 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 281
FalconOnishi 0:b65cb1bbf0ce 282 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 283 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 284 spi.write(LOAD_TX_BUF_0_DATA);
FalconOnishi 0:b65cb1bbf0ce 285 spi.write(data);
FalconOnishi 0:b65cb1bbf0ce 286 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 287 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 288 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 289 }
FalconOnishi 0:b65cb1bbf0ce 290
FalconOnishi 0:b65cb1bbf0ce 291 void MCP2515::load_1(byte identifier, byte data)//loads ID and DATA into transmit buffer 1
FalconOnishi 0:b65cb1bbf0ce 292 {
FalconOnishi 0:b65cb1bbf0ce 293 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 294 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 295 spi.write(LOAD_TX_BUF_1_ID);
FalconOnishi 0:b65cb1bbf0ce 296 spi.write(identifier);
FalconOnishi 0:b65cb1bbf0ce 297 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 298 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 299 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 300
FalconOnishi 0:b65cb1bbf0ce 301 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 302 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 303 spi.write(LOAD_TX_BUF_1_DATA);
FalconOnishi 0:b65cb1bbf0ce 304 spi.write(data);
FalconOnishi 0:b65cb1bbf0ce 305 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 306 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 307 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 308 }
FalconOnishi 0:b65cb1bbf0ce 309
FalconOnishi 0:b65cb1bbf0ce 310 void MCP2515::load_2(byte identifier, byte data)//loads ID and DATA into transmit buffer 2
FalconOnishi 0:b65cb1bbf0ce 311 {
FalconOnishi 0:b65cb1bbf0ce 312 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 313 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 314 spi.write(LOAD_TX_BUF_2_ID);
FalconOnishi 0:b65cb1bbf0ce 315 spi.write(identifier);
FalconOnishi 0:b65cb1bbf0ce 316 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 317 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 318 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 319
FalconOnishi 0:b65cb1bbf0ce 320 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 321 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 322 spi.write(LOAD_TX_BUF_2_DATA);
FalconOnishi 0:b65cb1bbf0ce 323 spi.write(data);
FalconOnishi 0:b65cb1bbf0ce 324 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 325 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 326 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 327 }
FalconOnishi 0:b65cb1bbf0ce 328
FalconOnishi 0:b65cb1bbf0ce 329 void MCP2515::load_ff_0(byte length,unsigned short identifier,byte *data)
FalconOnishi 0:b65cb1bbf0ce 330 {
FalconOnishi 0:b65cb1bbf0ce 331
FalconOnishi 0:b65cb1bbf0ce 332 byte i,id_high,id_low;
FalconOnishi 0:b65cb1bbf0ce 333
FalconOnishi 0:b65cb1bbf0ce 334 //generate id bytes before spi write
FalconOnishi 0:b65cb1bbf0ce 335 id_high = (byte) (identifier >> 3);
FalconOnishi 0:b65cb1bbf0ce 336 id_low = (byte) ((identifier << 5) & 0x00E0);
FalconOnishi 0:b65cb1bbf0ce 337
FalconOnishi 0:b65cb1bbf0ce 338 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 339 spi.write(LOAD_TX_BUF_0_ID);
FalconOnishi 0:b65cb1bbf0ce 340 spi.write(id_high); //identifier high bits
FalconOnishi 0:b65cb1bbf0ce 341 spi.write(id_low); //identifier low bits
FalconOnishi 0:b65cb1bbf0ce 342 spi.write(0x00); //extended identifier registers(unused)
FalconOnishi 0:b65cb1bbf0ce 343 spi.write(0x00);
FalconOnishi 0:b65cb1bbf0ce 344 spi.write(length);
FalconOnishi 0:b65cb1bbf0ce 345 for (i=0;i<length;i++) { //load data buffer
FalconOnishi 0:b65cb1bbf0ce 346 spi.write(data[i]);
FalconOnishi 0:b65cb1bbf0ce 347 }
FalconOnishi 0:b65cb1bbf0ce 348
FalconOnishi 0:b65cb1bbf0ce 349 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 350
FalconOnishi 0:b65cb1bbf0ce 351 }
FalconOnishi 0:b65cb1bbf0ce 352
FalconOnishi 0:b65cb1bbf0ce 353 void MCP2515::load_ff_1(byte length,unsigned short identifier,byte *data)
FalconOnishi 0:b65cb1bbf0ce 354 {
FalconOnishi 0:b65cb1bbf0ce 355
FalconOnishi 0:b65cb1bbf0ce 356 byte i,id_high,id_low;
FalconOnishi 0:b65cb1bbf0ce 357
FalconOnishi 0:b65cb1bbf0ce 358 //generate id bytes before spi write
FalconOnishi 0:b65cb1bbf0ce 359 id_high = (byte) (identifier >> 3);
FalconOnishi 0:b65cb1bbf0ce 360 id_low = (byte) ((identifier << 5) & 0x00E0);
FalconOnishi 0:b65cb1bbf0ce 361
FalconOnishi 0:b65cb1bbf0ce 362 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 363 spi.write(LOAD_TX_BUF_1_ID);
FalconOnishi 0:b65cb1bbf0ce 364 spi.write(id_high); //identifier high bits
FalconOnishi 0:b65cb1bbf0ce 365 spi.write(id_low); //identifier low bits
FalconOnishi 0:b65cb1bbf0ce 366 spi.write(0x00); //extended identifier registers(unused)
FalconOnishi 0:b65cb1bbf0ce 367 spi.write(0x00);
FalconOnishi 0:b65cb1bbf0ce 368 spi.write(length);
FalconOnishi 0:b65cb1bbf0ce 369 for (i=0;i<length;i++) { //load data buffer
FalconOnishi 0:b65cb1bbf0ce 370 spi.write(data[i]);
FalconOnishi 0:b65cb1bbf0ce 371 }
FalconOnishi 0:b65cb1bbf0ce 372
FalconOnishi 0:b65cb1bbf0ce 373 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 374
FalconOnishi 0:b65cb1bbf0ce 375
FalconOnishi 0:b65cb1bbf0ce 376 }
FalconOnishi 0:b65cb1bbf0ce 377
FalconOnishi 0:b65cb1bbf0ce 378 void MCP2515::load_ff_2(byte length,unsigned short identifier,byte *data)
FalconOnishi 0:b65cb1bbf0ce 379 {
FalconOnishi 0:b65cb1bbf0ce 380
FalconOnishi 0:b65cb1bbf0ce 381 byte i,id_high,id_low;
FalconOnishi 0:b65cb1bbf0ce 382
FalconOnishi 0:b65cb1bbf0ce 383 //generate id bytes before spi write
FalconOnishi 0:b65cb1bbf0ce 384 id_high = (byte) (identifier >> 3);
FalconOnishi 0:b65cb1bbf0ce 385 id_low = (byte) ((identifier << 5) & 0x00E0);
FalconOnishi 0:b65cb1bbf0ce 386
FalconOnishi 0:b65cb1bbf0ce 387 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 388
FalconOnishi 0:b65cb1bbf0ce 389 spi.write(LOAD_TX_BUF_2_ID);
FalconOnishi 0:b65cb1bbf0ce 390 spi.write(id_high); //identifier high bits
FalconOnishi 0:b65cb1bbf0ce 391 spi.write(id_low); //identifier low bits
FalconOnishi 0:b65cb1bbf0ce 392 spi.write(0x00); //extended identifier registers(unused)
FalconOnishi 0:b65cb1bbf0ce 393 spi.write(0x00);
FalconOnishi 0:b65cb1bbf0ce 394 spi.write(length); //data length code
FalconOnishi 0:b65cb1bbf0ce 395 for (i=0;i<length;i++) { //load data buffer
FalconOnishi 0:b65cb1bbf0ce 396 spi.write(data[i]);
FalconOnishi 0:b65cb1bbf0ce 397 }
FalconOnishi 0:b65cb1bbf0ce 398
FalconOnishi 0:b65cb1bbf0ce 399 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 400
FalconOnishi 0:b65cb1bbf0ce 401 }
FalconOnishi 0:b65cb1bbf0ce 402
FalconOnishi 0:b65cb1bbf0ce 403 //------------------------------------------------------------------------------
FalconOnishi 0:b65cb1bbf0ce 404 //Added for ram
FalconOnishi 0:b65cb1bbf0ce 405 void MCP2515::writeRegister(byte address, byte data)
FalconOnishi 0:b65cb1bbf0ce 406 {
FalconOnishi 0:b65cb1bbf0ce 407 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 408 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 409 spi.write(WRITE);
FalconOnishi 0:b65cb1bbf0ce 410 spi.write(address);
FalconOnishi 0:b65cb1bbf0ce 411 spi.write(data);
FalconOnishi 0:b65cb1bbf0ce 412 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 413 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 414 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 415 }
FalconOnishi 0:b65cb1bbf0ce 416 void MCP2515::readRegister(byte address, byte *data_out)
FalconOnishi 0:b65cb1bbf0ce 417 {
FalconOnishi 0:b65cb1bbf0ce 418 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 419 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 420 spi.write(READ);
FalconOnishi 0:b65cb1bbf0ce 421 spi.write(address);
FalconOnishi 0:b65cb1bbf0ce 422 *data_out = spi.write(0xFF);
FalconOnishi 0:b65cb1bbf0ce 423 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 424 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 425 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 426 }
FalconOnishi 0:b65cb1bbf0ce 427
FalconOnishi 0:b65cb1bbf0ce 428 void MCP2515::reset()
FalconOnishi 0:b65cb1bbf0ce 429 {
FalconOnishi 0:b65cb1bbf0ce 430 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 431 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 432 spi.write(RESET_REG);
FalconOnishi 0:b65cb1bbf0ce 433 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 434 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 435 wait_ms(10);
FalconOnishi 0:b65cb1bbf0ce 436 }
FalconOnishi 0:b65cb1bbf0ce 437
FalconOnishi 0:b65cb1bbf0ce 438 byte MCP2515::readRXStatus()
FalconOnishi 0:b65cb1bbf0ce 439 {
FalconOnishi 0:b65cb1bbf0ce 440 byte retVal;
FalconOnishi 0:b65cb1bbf0ce 441 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 442 spi.write(RX_STATUS);
FalconOnishi 0:b65cb1bbf0ce 443 retVal = spi.write(0xFF);
FalconOnishi 0:b65cb1bbf0ce 444 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 445 return retVal;
FalconOnishi 0:b65cb1bbf0ce 446 }
FalconOnishi 0:b65cb1bbf0ce 447
FalconOnishi 0:b65cb1bbf0ce 448 void MCP2515::bitModify(byte address, byte mask, byte data)
FalconOnishi 0:b65cb1bbf0ce 449 {
FalconOnishi 0:b65cb1bbf0ce 450 cs = 0;
FalconOnishi 0:b65cb1bbf0ce 451 spi.write(BIT_MODIFY);
FalconOnishi 0:b65cb1bbf0ce 452 spi.write(address);
FalconOnishi 0:b65cb1bbf0ce 453 spi.write(mask);
FalconOnishi 0:b65cb1bbf0ce 454 spi.write(data);
FalconOnishi 0:b65cb1bbf0ce 455 cs = 1;
FalconOnishi 0:b65cb1bbf0ce 456 }
FalconOnishi 0:b65cb1bbf0ce 457
FalconOnishi 0:b65cb1bbf0ce 458 void MCP2515::setMask(unsigned short identifier)
FalconOnishi 0:b65cb1bbf0ce 459 {
FalconOnishi 0:b65cb1bbf0ce 460 setMask_0(identifier);
FalconOnishi 0:b65cb1bbf0ce 461 setMask_1(identifier);
FalconOnishi 0:b65cb1bbf0ce 462 }
FalconOnishi 0:b65cb1bbf0ce 463
FalconOnishi 0:b65cb1bbf0ce 464 void MCP2515::setMask_0(unsigned short identifier)
FalconOnishi 0:b65cb1bbf0ce 465 {
FalconOnishi 0:b65cb1bbf0ce 466 writeRegister(RXM0SIDH, (byte)(identifier>>3));
FalconOnishi 0:b65cb1bbf0ce 467 writeRegister(RXM0SIDL, (byte)(identifier<<5));
FalconOnishi 0:b65cb1bbf0ce 468 }
FalconOnishi 0:b65cb1bbf0ce 469
FalconOnishi 0:b65cb1bbf0ce 470 void MCP2515::setMask_1(unsigned short identifier)
FalconOnishi 0:b65cb1bbf0ce 471 {
FalconOnishi 0:b65cb1bbf0ce 472 writeRegister(RXM1SIDH, (byte)(identifier>>3));
FalconOnishi 0:b65cb1bbf0ce 473 writeRegister(RXM1SIDL, (byte)(identifier<<5));
FalconOnishi 0:b65cb1bbf0ce 474 }