MCP2515 CAN library
Fork of mcp2515 by
CAN3.cpp@13:ff12c7f532f9, 2017-07-24 (annotated)
- Committer:
- driscoll85
- Date:
- Mon Jul 24 18:12:55 2017 +0000
- Revision:
- 13:ff12c7f532f9
- Parent:
- 7:2abb9b7eec25
- Child:
- 14:cf76652389be
Updates to remove needed irq pin
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tecnosys | 1:dbc44582f2f8 | 1 | #include "CAN3.h" |
tecnosys | 1:dbc44582f2f8 | 2 | |
tecnosys | 1:dbc44582f2f8 | 3 | #include "mbed.h" |
tecnosys | 1:dbc44582f2f8 | 4 | #include "mcp2515.h" |
tecnosys | 1:dbc44582f2f8 | 5 | #include "mcp2515_can.h" |
tecnosys | 1:dbc44582f2f8 | 6 | #include "mcp2515_defs.h" |
tecnosys | 1:dbc44582f2f8 | 7 | |
tecnosys | 1:dbc44582f2f8 | 8 | |
driscoll85 | 13:ff12c7f532f9 | 9 | CAN3::CAN3(SPI& _spi, PinName ncs)//, PinName itr) |
driscoll85 | 13:ff12c7f532f9 | 10 | : spi(_spi), _mcp(spi, ncs) {//, _itr(itr) { |
tecnosys | 1:dbc44582f2f8 | 11 | printf("\n\rcan = %d",this); |
tecnosys | 1:dbc44582f2f8 | 12 | |
tecnosys | 1:dbc44582f2f8 | 13 | } |
tecnosys | 1:dbc44582f2f8 | 14 | |
tecnosys | 1:dbc44582f2f8 | 15 | uint8_t CAN3::read(CANMessage *msg) { |
tecnosys | 1:dbc44582f2f8 | 16 | uint8_t stat, res; |
tecnosys | 1:dbc44582f2f8 | 17 | |
tecnosys | 1:dbc44582f2f8 | 18 | stat = _mcp.readStatus(); |
tecnosys | 1:dbc44582f2f8 | 19 | |
tecnosys | 1:dbc44582f2f8 | 20 | if ( stat & MCP_STAT_RX0IF ) { |
tecnosys | 1:dbc44582f2f8 | 21 | // Msg in Buffer 0 |
tecnosys | 1:dbc44582f2f8 | 22 | _mcp.read_canMsg( MCP_RXBUF_0, msg); |
tecnosys | 1:dbc44582f2f8 | 23 | _mcp.modifyRegister(MCP_CANINTF, MCP_RX0IF, 0); |
tecnosys | 1:dbc44582f2f8 | 24 | res = CAN_OK; |
tecnosys | 1:dbc44582f2f8 | 25 | } else if ( stat & MCP_STAT_RX1IF ) { |
tecnosys | 1:dbc44582f2f8 | 26 | // Msg in Buffer 1 |
tecnosys | 1:dbc44582f2f8 | 27 | _mcp.read_canMsg( MCP_RXBUF_1, msg); |
tecnosys | 1:dbc44582f2f8 | 28 | _mcp.modifyRegister(MCP_CANINTF, MCP_RX1IF, 0); |
tecnosys | 1:dbc44582f2f8 | 29 | res = CAN_OK; |
tecnosys | 1:dbc44582f2f8 | 30 | } else { |
tecnosys | 1:dbc44582f2f8 | 31 | res = CAN_NOMSG; |
tecnosys | 1:dbc44582f2f8 | 32 | } |
tecnosys | 1:dbc44582f2f8 | 33 | |
tecnosys | 1:dbc44582f2f8 | 34 | return res; |
tecnosys | 1:dbc44582f2f8 | 35 | } |
tecnosys | 1:dbc44582f2f8 | 36 | |
tecnosys | 1:dbc44582f2f8 | 37 | uint8_t CAN3::checkReceive(void) { |
tecnosys | 1:dbc44582f2f8 | 38 | uint8_t res; |
tecnosys | 1:dbc44582f2f8 | 39 | |
tecnosys | 1:dbc44582f2f8 | 40 | res = _mcp.readStatus(); // RXnIF in Bit 1 and 0 |
tecnosys | 1:dbc44582f2f8 | 41 | if ( res & MCP_STAT_RXIF_MASK ) { |
tecnosys | 1:dbc44582f2f8 | 42 | return CAN_MSGAVAIL; |
tecnosys | 1:dbc44582f2f8 | 43 | } else { |
tecnosys | 1:dbc44582f2f8 | 44 | return CAN_NOMSG; |
tecnosys | 1:dbc44582f2f8 | 45 | } |
tecnosys | 1:dbc44582f2f8 | 46 | } |
tecnosys | 1:dbc44582f2f8 | 47 | |
tecnosys | 1:dbc44582f2f8 | 48 | void CAN3::write(CANMessage* test) { |
tecnosys | 1:dbc44582f2f8 | 49 | uint8_t txbuf_n; |
tecnosys | 1:dbc44582f2f8 | 50 | _mcp.getNextFreeTXBuf(&txbuf_n); |
tecnosys | 1:dbc44582f2f8 | 51 | _mcp.write_canMsg(txbuf_n,test); |
tecnosys | 1:dbc44582f2f8 | 52 | _mcp.start_transmit( txbuf_n ); |
tecnosys | 1:dbc44582f2f8 | 53 | } |
tecnosys | 1:dbc44582f2f8 | 54 | |
tecnosys | 1:dbc44582f2f8 | 55 | void CAN3::rise(void (*fptr)(void)) { |
driscoll85 | 13:ff12c7f532f9 | 56 | // _itr.rise(fptr); |
tecnosys | 1:dbc44582f2f8 | 57 | } |
tecnosys | 1:dbc44582f2f8 | 58 | |
tecnosys | 1:dbc44582f2f8 | 59 | void CAN3::fall(void (*fptr2)(void)) { |
driscoll85 | 13:ff12c7f532f9 | 60 | // _itr.fall(fptr2); |
tecnosys | 1:dbc44582f2f8 | 61 | } |
tecnosys | 1:dbc44582f2f8 | 62 | |
tecnosys | 7:2abb9b7eec25 | 63 | int CAN3::frequency(int canSpeed) { |
tecnosys | 1:dbc44582f2f8 | 64 | |
tecnosys | 1:dbc44582f2f8 | 65 | uint8_t res; |
tecnosys | 1:dbc44582f2f8 | 66 | |
tecnosys | 1:dbc44582f2f8 | 67 | res = _mcp.init(canSpeed); //CAN_500KBPS_8MHZ |
tecnosys | 1:dbc44582f2f8 | 68 | wait(.001); |
tecnosys | 1:dbc44582f2f8 | 69 | |
tecnosys | 1:dbc44582f2f8 | 70 | _mcp.setRegister(MCP_CANINTE, 0x3);//0x3); //MCP_RX_INT); |
tecnosys | 1:dbc44582f2f8 | 71 | _mcp.setRegister(MCP_CANINTF, 0x3);// 0xff); |
tecnosys | 1:dbc44582f2f8 | 72 | |
tecnosys | 1:dbc44582f2f8 | 73 | |
tecnosys | 1:dbc44582f2f8 | 74 | //RX0,1 as rx0,1 digital interrupt outputs |
tecnosys | 1:dbc44582f2f8 | 75 | //_mcp.setRegister(BFPCTRL, 0xf); |
tecnosys | 1:dbc44582f2f8 | 76 | |
tecnosys | 1:dbc44582f2f8 | 77 | //[Set TX0,1,2 as digital inputs |
tecnosys | 1:dbc44582f2f8 | 78 | //_mcp.setRegister(TXRTSCTRL, 0x0); |
tecnosys | 1:dbc44582f2f8 | 79 | |
tecnosys | 7:2abb9b7eec25 | 80 | // printf("Setting Normal-Mode - \n\r "); |
tecnosys | 1:dbc44582f2f8 | 81 | if ( _mcp.setCANCTRL_Mode(MODE_NORMAL) == MCP2515_OK) { //MODE_NORMAL MODE_LOOPBACK |
tecnosys | 7:2abb9b7eec25 | 82 | // printf("OK\n\r"); |
tecnosys | 1:dbc44582f2f8 | 83 | } else { |
driscoll85 | 13:ff12c7f532f9 | 84 | printf("failed\n\r"); |
driscoll85 | 13:ff12c7f532f9 | 85 | return -1; |
tecnosys | 1:dbc44582f2f8 | 86 | } |
tecnosys | 1:dbc44582f2f8 | 87 | |
tecnosys | 1:dbc44582f2f8 | 88 | _mcp.dumpExtendedStatus(); |
tecnosys | 1:dbc44582f2f8 | 89 | wait(.001); |
tecnosys | 7:2abb9b7eec25 | 90 | |
tecnosys | 7:2abb9b7eec25 | 91 | if (res != MCP2515_OK) { |
tecnosys | 7:2abb9b7eec25 | 92 | return 0; |
tecnosys | 7:2abb9b7eec25 | 93 | |
tecnosys | 7:2abb9b7eec25 | 94 | } |
tecnosys | 7:2abb9b7eec25 | 95 | return 1; |
tecnosys | 1:dbc44582f2f8 | 96 | } |