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