Dependents:   Kamal_CAN ReadFromSerial446 USNA-UMBC-KF-02_v3-noise USNA-UMBC-KF-01

Committer:
tecnosys
Date:
Mon Oct 18 13:40:02 2010 +0000
Revision:
8:872137b3a8a8
Parent:
7:2abb9b7eec25
0.1

Who changed what in which revision?

UserRevisionLine numberNew 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
tecnosys 1:dbc44582f2f8 9 CAN3::CAN3(SPI& _spi, PinName ncs, PinName itr)
tecnosys 1:dbc44582f2f8 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)) {
tecnosys 1:dbc44582f2f8 56 _itr.rise(fptr);
tecnosys 1:dbc44582f2f8 57 }
tecnosys 1:dbc44582f2f8 58
tecnosys 1:dbc44582f2f8 59 void CAN3::fall(void (*fptr2)(void)) {
tecnosys 1:dbc44582f2f8 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 {
tecnosys 7:2abb9b7eec25 84 error("failed\n\r");
tecnosys 1:dbc44582f2f8 85 }
tecnosys 1:dbc44582f2f8 86
tecnosys 1:dbc44582f2f8 87 _mcp.dumpExtendedStatus();
tecnosys 1:dbc44582f2f8 88 wait(.001);
tecnosys 7:2abb9b7eec25 89
tecnosys 7:2abb9b7eec25 90 if (res != MCP2515_OK) {
tecnosys 7:2abb9b7eec25 91 return 0;
tecnosys 7:2abb9b7eec25 92
tecnosys 7:2abb9b7eec25 93 }
tecnosys 7:2abb9b7eec25 94 return 1;
tecnosys 1:dbc44582f2f8 95 }