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
MCP2515.cpp@0:b65cb1bbf0ce, 2013-01-18 (annotated)
- Committer:
- FalconOnishi
- Date:
- Fri Jan 18 17:00:28 2013 +0000
- Revision:
- 0:b65cb1bbf0ce
Add some utility methods
Who changed what in which revision?
User | Revision | Line number | New 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 | } |