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.h
- Committer:
- FalconOnishi
- Date:
- 2013-01-18
- Revision:
- 0:b65cb1bbf0ce
File content as of revision 0:b65cb1bbf0ce:
#include "mbed.h" /* Created by: Kyle Crockett For MCP2515duino with 16MHz oscillator. CNFx register values. use preprocessor command "_XXkbps" "XX" is the baud rate. 10 kbps CNF1/BRGCON1 b'00110001' 0x31 CNF2/BRGCON2 b'10111000' 0xB8 CNF3/BRGCON3 b'00000101' 0x05 20 kbps CNF1/BRGCON1 b'00011000' 0x18 CNF2/BRGCON2 b'10111000' 0xB8 CNF3/BRGCON3 b'00000101' 0x05 50 kbps CNF1/BRGCON1 b'00001001' 0x09 CNF2/BRGCON2 b'10111000' 0xB8 CNF3/BRGCON3 b'00000101' 0x05 100 kbps CNF1/BRGCON1 b'00000100' 0x04 CNF2/BRGCON2 b'10111000' 0xB8 CNF3/BRGCON3 b'00000101' 0x05 125 kbps CNF1/BRGCON1 b'00000011' 0x03 CNF2/BRGCON2 b'10111000' 0xB8 CNF3/BRGCON3 b'00000101' 0x05 250 kbps CNF1/BRGCON1 b'00000001' 0x01 CNF2/BRGCON2 b'10111000' 0xB8 CNF3/BRGCON3 b'00000101' 0x05 500 kbps CNF1/BRGCON1 b'00000000' 0x00 CNF2/BRGCON2 b'10111000' 0xB8 CNF3/BRGCON3 b'00000101' 0x05 800 kbps Not yet supported 1000 kbps Settings added by Patrick Cruce(pcruce_at_igpp.ucla.edu) CNF1=b'10000000'=0x80 = SJW = 3 Tq. & BRP = 0 CNF2=b'10010000'=0x90 = BLTMode = 1 & SAM = 0 & PS1 = 3 & PR = 1 CNF3=b'00000010'=0x02 = SOF = 0 & WAKFIL = 0 & PS2 = 3 */ #ifndef MCP2515_h #define MCP2515_h #define SCK 13 //spi #define MISO 12 #define MOSI 11 #define SS 10 #define RESET 2//reset pin #define RESET_REG 0xc0 #define READ 0x03 #define WRITE 0x02 //read and write comands for SPI #define READ_RX_BUF_0_ID 0x90 #define READ_RX_BUF_0_DATA 0x92 #define READ_RX_BUF_1_ID 0x94 #define READ_RX_BUF_1_DATA 0x96 //SPI commands for reading MCP2515 RX buffers #define LOAD_TX_BUF_0_ID 0x40 #define LOAD_TX_BUF_0_DATA 0x41 #define LOAD_TX_BUF_1_ID 0x42 #define LOAD_TX_BUF_1_DATA 0x43 #define LOAD_TX_BUF_2_ID 0x44 #define LOAD_TX_BUF_2_DATA 0x45 //SPI commands for loading MCP2515 TX buffers #define SEND_TX_BUF_0 0x81 #define SEND_TX_BUF_1 0x82 #define SEND_TX_BUF_2 0x83 //SPI commands for transmitting MCP2515 TX buffers #define READ_STATUS 0xA0 #define RX_STATUS 0xB0 #define BIT_MODIFY 0x05 //Other commands //Registers #define CNF0 0x2A #define CNF1 0x29 #define CNF2 0x28 #define TXB0CTRL 0x30 #define TXB1CTRL 0x40 #define TXB2CTRL 0x50 //TRANSMIT BUFFER CONTROL REGISTER #define TXB0DLC 0x35 //Data length code registers #define TXB1DLC 0x45 #define TXB2DLC 0x55 #define MCP2515CTRL 0x0F //Mode control register #define MCP2515STAT 0x0E //Mode status register //------------------------------------------------------------------------------ //Added for ram // Register Bit Masks // MCP2515STAT #define MODE_CONFIG 0x80 #define MODE_LISTEN 0x60 #define MODE_LOOPBACK 0x40 #define MODE_SLEEP 0x20 #define MODE_NORMAL 0x00 //MCP2515 bus error counter #define TEC 0x1C #define REC 0x1D //Mask 0 #define RXM0SIDH 0x20 //Mask0 normal ID high #define RXM0SIDL 0x21 //Mask0 normal ID low #define RXM0EID8 0x22 //Mask0 extended ID high #define RXM0EID0 0x23 //Mask0 extended ID low //Mask 1 #define RXM1SIDH 0x24 //Mask1 normal ID high #define RXM1SIDL 0x25 //Mask1 normal ID low #define RXM1EID8 0x26 //Mask1 extended ID high #define RXM1EID0 0x27 //Mask1 extended ID low #define MCP2515INTE 0x2B //Interept permission #define MCP2515INTF 0x2C //Interept flag #define EFLG 0x2D //Error flag #define MASK_SID_ALL_HIT 0x0000 //Mask all #define MASK_SID_CPL_MATCH 0x07FF //Disable mask #define MCP2515_RTS 0x80 #define MCP2515_READ_BUFFER 0x90 #define MCP2515_LOAD_BUFFER 0X40 //.............................................................................. //test // MCP2515INTF #define RX0IF 0x01 #define RX1IF 0x02 #define TX0IF 0x04 #define TX1IF 0x08 #define TX2IF 0x10 #define ERRIF 0x20 #define WAKIF 0x40 #define MERRF 0x80 // Configuration Registers #define BFPCTRL 0x0C #define TXRTSCTRL 0x0D // TX Buffer 0 #define TXB0CTRL 0x30 #define TXB0SIDH 0x31 #define TXB0SIDL 0x32 #define TXB0EID8 0x33 #define TXB0EID0 0x34 #define TXB0DLC 0x35 // TX Buffer 1 #define TXB1CTRL 0x40 #define TXB1SIDH 0x41 #define TXB1SIDL 0x42 #define TXB1EID8 0x43 #define TXB1EID0 0x44 #define TXB1DLC 0x45 // TX Buffer 2 #define TXB2CTRL 0x50 #define TXB2SIDH 0x51 #define TXB2SIDL 0x52 #define TXB2EID8 0x53 #define TXB2EID0 0x54 #define TXB2DLC 0x55 // RX Buffer 0 #define RXB0CTRL 0x60 #define RXB0SIDH 0x61 #define RXB0SIDL 0x62 #define RXB0EID8 0x63 #define RXB0EID0 0x64 #define RXB0DLC 0x65 // RX Buffer 1 #define RXB1CTRL 0x70 #define RXB1SIDH 0x71 #define RXB1SIDL 0x72 #define RXB1EID8 0x73 #define RXB1EID0 0x74 #define RXB1DLC 0x75 // Buffer Bit Masks #define RXB0 0x00 #define RXB1 0x02 #define TXB0 0x01 #define TXB1 0x02 #define TXB2 0x04 #define TXB_ALL TXB0 | TXB1 | TXB2 #define RXB_RX_STDEXT 0x00 #define RXB_RX_MASK 0x60 #define RXB_BUKT_MASK (1<<2) typedef unsigned char byte; enum MCP2515Mode {CONFIGURATION,NORMAL,SLEEP,LISTEN,LOOPBACK}; class MCP2515 { public: MCP2515(SPI& spi, PinName cs); //void begin();//sets up MCP2515 void baudConfig(int bitRate);//sets up baud //Method added to enable testing in loopback mode.(pcruce_at_igpp.ucla.edu) void setMode(MCP2515Mode mode) ;//put MCP2515 controller in one of five modes void send_0();//request to transmit buffer X void send_1(); void send_2(); char readID_0();//read ID/DATA of recieve buffer X char readID_1(); char readDATA_0(); char readDATA_1(); //extending MCP2515 data read to full frames(pcruce_at_igpp.ucla.edu) //data_out should be array of 8-bytes or frame length. void readDATA_ff_0(byte* length_out,byte *data_out,unsigned short *id_out); void readDATA_ff_1(byte* length_out,byte *data_out,unsigned short *id_out); //Adding MCP2515 to read status register(pcruce_at_igpp.ucla.edu) //MCP2515 be used to determine whether a frame was received. //(readStatus() & 0x80) == 0x80 means frame in buffer 0 //(readStatus() & 0x40) == 0x40 means frame in buffer 1 byte readStatus(); void load_0(byte identifier, byte data);//load transmit buffer X void load_1(byte identifier, byte data); void load_2(byte identifier, byte data); //extending MCP2515 write to full frame(pcruce_at_igpp.ucla.edu) //Identifier should be a value between 0 and 2^11-1, longer identifiers will be truncated(ie does not support extended frames) void load_ff_0(byte length,unsigned short identifier,byte *data); void load_ff_1(byte length,unsigned short identifier,byte *data); void load_ff_2(byte length,unsigned short identifier,byte *data); //-------------------------------------------------------------------------- //Added for ram void writeRegister(byte address, byte data); void readRegister(byte address, byte *data_out); void reset(); byte readRXStatus(); void bitModify(byte address, byte mask, byte data); void setMask(unsigned short identifier); void setMask_0(unsigned short identifier); void setMask_1(unsigned short identifier); private: DigitalOut cs; SPI &spi; }; #endif