├── .gitattributes ├── .gitignore └── CAN_BUS_Shield ├── example ├── receive │ └── receive.ino └── send │ └── send.ino ├── keywords.txt ├── mcp_can.cpp ├── mcp_can.h └── mcp_can_dfs.h /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | *.sln merge=union 7 | *.csproj merge=union 8 | *.vbproj merge=union 9 | *.fsproj merge=union 10 | *.dbproj merge=union 11 | 12 | # Standard to msysgit 13 | *.doc diff=astextplain 14 | *.DOC diff=astextplain 15 | *.docx diff=astextplain 16 | *.DOCX diff=astextplain 17 | *.dot diff=astextplain 18 | *.DOT diff=astextplain 19 | *.pdf diff=astextplain 20 | *.PDF diff=astextplain 21 | *.rtf diff=astextplain 22 | *.RTF diff=astextplain 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ################# 2 | ## Eclipse 3 | ################# 4 | 5 | *.pydevproject 6 | .project 7 | .metadata 8 | bin/ 9 | tmp/ 10 | *.tmp 11 | *.bak 12 | *.swp 13 | *~.nib 14 | local.properties 15 | .classpath 16 | .settings/ 17 | .loadpath 18 | 19 | # External tool builders 20 | .externalToolBuilders/ 21 | 22 | # Locally stored "Eclipse launch configurations" 23 | *.launch 24 | 25 | # CDT-specific 26 | .cproject 27 | 28 | # PDT-specific 29 | .buildpath 30 | 31 | 32 | ################# 33 | ## Visual Studio 34 | ################# 35 | 36 | ## Ignore Visual Studio temporary files, build results, and 37 | ## files generated by popular Visual Studio add-ons. 38 | 39 | # User-specific files 40 | *.suo 41 | *.user 42 | *.sln.docstates 43 | 44 | # Build results 45 | [Dd]ebug/ 46 | [Rr]elease/ 47 | *_i.c 48 | *_p.c 49 | *.ilk 50 | *.meta 51 | *.obj 52 | *.pch 53 | *.pdb 54 | *.pgc 55 | *.pgd 56 | *.rsp 57 | *.sbr 58 | *.tlb 59 | *.tli 60 | *.tlh 61 | *.tmp 62 | *.vspscc 63 | .builds 64 | *.dotCover 65 | 66 | ## TODO: If you have NuGet Package Restore enabled, uncomment this 67 | #packages/ 68 | 69 | # Visual C++ cache files 70 | ipch/ 71 | *.aps 72 | *.ncb 73 | *.opensdf 74 | *.sdf 75 | 76 | # Visual Studio profiler 77 | *.psess 78 | *.vsp 79 | 80 | # ReSharper is a .NET coding add-in 81 | _ReSharper* 82 | 83 | # Installshield output folder 84 | [Ee]xpress 85 | 86 | # DocProject is a documentation generator add-in 87 | DocProject/buildhelp/ 88 | DocProject/Help/*.HxT 89 | DocProject/Help/*.HxC 90 | DocProject/Help/*.hhc 91 | DocProject/Help/*.hhk 92 | DocProject/Help/*.hhp 93 | DocProject/Help/Html2 94 | DocProject/Help/html 95 | 96 | # Click-Once directory 97 | publish 98 | 99 | # Others 100 | [Bb]in 101 | [Oo]bj 102 | sql 103 | TestResults 104 | *.Cache 105 | ClientBin 106 | stylecop.* 107 | ~$* 108 | *.dbmdl 109 | Generated_Code #added for RIA/Silverlight projects 110 | 111 | # Backup & report files from converting an old project file to a newer 112 | # Visual Studio version. Backup files are not needed, because we have git ;-) 113 | _UpgradeReport_Files/ 114 | Backup*/ 115 | UpgradeLog*.XML 116 | 117 | 118 | 119 | ############ 120 | ## Windows 121 | ############ 122 | 123 | # Windows image file caches 124 | Thumbs.db 125 | 126 | # Folder config file 127 | Desktop.ini 128 | 129 | 130 | ############# 131 | ## Python 132 | ############# 133 | 134 | *.py[co] 135 | 136 | # Packages 137 | *.egg 138 | *.egg-info 139 | dist 140 | build 141 | eggs 142 | parts 143 | bin 144 | var 145 | sdist 146 | develop-eggs 147 | .installed.cfg 148 | 149 | # Installer logs 150 | pip-log.txt 151 | 152 | # Unit test / coverage reports 153 | .coverage 154 | .tox 155 | 156 | #Translations 157 | *.mo 158 | 159 | #Mr Developer 160 | .mr.developer.cfg 161 | 162 | # Mac crap 163 | .DS_Store 164 | -------------------------------------------------------------------------------- /CAN_BUS_Shield/example/receive/receive.ino: -------------------------------------------------------------------------------- 1 | // demo: CAN-BUS Shield, receive data 2 | #include "mcp_can.h" 3 | #include 4 | #include 5 | #define INT8U unsigned char 6 | 7 | INT8U Flag_Recv = 0; 8 | INT8U len = 0; 9 | INT8U buf[8]; 10 | char str[20]; 11 | void setup() 12 | { 13 | CAN.begin(CAN_500KBPS); // init can bus : baudrate = 500k 14 | attachInterrupt(0, MCP2515_ISR, FALLING); // start interrupt 15 | Serial.begin(115200); 16 | } 17 | 18 | void MCP2515_ISR() 19 | { 20 | Flag_Recv = 1; 21 | } 22 | 23 | void loop() 24 | { 25 | if(Flag_Recv) // check if get data 26 | { 27 | Flag_Recv = 0; // clear flag 28 | CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf 29 | Serial.println("CAN_BUS GET DATA!"); 30 | Serial.print("data len = ");Serial.println(len); 31 | for(int i = 0; i 3 | #include 4 | 5 | void setup() 6 | { 7 | Serial.begin(115200); 8 | // init can bus, baudrate: 500k 9 | if(CAN.begin(CAN_500KBPS) ==CAN_OK) Serial.print("can init ok!!\r\n"); 10 | else Serial.print("Can init fail!!\r\n"); 11 | } 12 | 13 | unsigned char stmp[8] = {0, 1, 2, 3, 4, 5, 6, 7}; 14 | void loop() 15 | { 16 | // send data: id = 0x00, standrad flame, data len = 8, stmp: data buf 17 | CAN.sendMsgBuf(0x00, 0, 8, stmp); 18 | delay(100); 19 | } 20 | 21 | -------------------------------------------------------------------------------- /CAN_BUS_Shield/keywords.txt: -------------------------------------------------------------------------------- 1 | ####################################### 2 | # Syntax Coloring Map For debug_lvc 3 | ####################################### 4 | 5 | ####################################### 6 | # Datatypes (KEYWORD1) 7 | ####################################### 8 | MCP_CAN KEYWORD1 9 | CAN KEYWORD1 10 | mcp_can_dfs KEYWORD1 11 | mcp_can KEYWORD1 12 | 13 | ####################################### 14 | # Methods and Functions (KEYWORD2) 15 | ####################################### 16 | begin KEYWORD2 17 | init_Mask KEYWORD2 18 | init_Filt KEYWORD2 19 | sendMsgBuf KEYWORD2 20 | readMsgBuf KEYWORD2 21 | checkReceive KEYWORD2 22 | checkError KEYWORD2 23 | getCanId KEYWORD2 24 | 25 | ####################################### 26 | # Constants (LITERAL1) 27 | ####################################### 28 | CAN_5KBPS LITERAL1 29 | CAN_10KBPS LITERAL1 30 | CAN_20KBPS LITERAL1 31 | CAN_40KBPS LITERAL1 32 | CAN_50KBPS LITERAL1 33 | CAN_80KBPS LITERAL1 34 | CAN_100KBPS LITERAL1 35 | CAN_125KBPS LITERAL1 36 | CAN_200KBPS LITERAL1 37 | CAN_250KBPS LITERAL1 38 | CAN_500KBPS LITERAL1 39 | CAN_OK LITERAL1 40 | CAN_FAILINIT LITERAL1 41 | CAN_FAILTX LITERAL1 42 | CAN_MSGAVAIL LITERAL1 43 | CAN_NOMSG LITERAL1 44 | CAN_CTRLERROR LITERAL1 45 | CAN_GETTXBFTIMEOUT LITERAL1 46 | CAN_SENDMSGTIMEOUT LITERAL1 47 | CAN_FAIL LITERAL1 48 | -------------------------------------------------------------------------------- /CAN_BUS_Shield/mcp_can.cpp: -------------------------------------------------------------------------------- 1 | /****************************************Copyright (c)**************************************************** 2 | ** Shenzhen SeeedStudio Co.,LTD. 3 | ** 4 | ** http://www.seeedstudio.com 5 | ** 6 | **--------------File Info--------------------------------------------------------------------------------- 7 | ** File name: mcp_can.cpp 8 | ** Latest modified Date: 2012-4-24 9 | ** Latest Version: v0.1 10 | ** Descriptions: 11 | ** 12 | **-------------------------------------------------------------------------------------------------------- 13 | ** Created by: loovee 14 | ** Created date: 2012-4-24 15 | ** Version: v0.1 16 | ** Descriptions: mcp2515 class 17 | 18 | *********************************************************************************************************/ 19 | #include "mcp_can.h" 20 | 21 | #define spi_readwrite SPI.transfer 22 | #define spi_read() spi_readwrite(0x00) 23 | 24 | MCP_CAN CAN; 25 | /********************************************************************************************************* 26 | ** Function name: mcp2515_reset 27 | ** Descriptions: reset the device 28 | ** input parameters: NONE 29 | ** Output parameters: NONE 30 | ** Returned value: NONE 31 | *********************************************************************************************************/ 32 | 33 | void MCP_CAN::mcp2515_reset(void) 34 | { 35 | MCP2515_SELECT(); 36 | spi_readwrite(MCP_RESET); 37 | MCP2515_UNSELECT(); 38 | delay(10); 39 | } 40 | 41 | /********************************************************************************************************* 42 | ** Function name: mcp2515_readRegister 43 | ** Descriptions: read register 44 | ** input parameters: address : register address 45 | ** Output parameters: NONE 46 | ** Returned value: if success 47 | *********************************************************************************************************/ 48 | INT8U MCP_CAN::mcp2515_readRegister(const INT8U address) 49 | { 50 | INT8U ret; 51 | 52 | MCP2515_SELECT(); 53 | spi_readwrite(MCP_READ); 54 | spi_readwrite(address); 55 | ret = spi_read(); 56 | MCP2515_UNSELECT(); 57 | 58 | return ret; 59 | } 60 | 61 | /********************************************************************************************************* 62 | ** Function name: mcp2515_readRegisterS 63 | ** Descriptions: read registerS 64 | ** input parameters: address : register address 65 | ** Output parameters: NONE 66 | ** Returned value: if success 67 | *********************************************************************************************************/ 68 | void MCP_CAN::mcp2515_readRegisterS(const INT8U address, 69 | INT8U values[], 70 | const INT8U n) 71 | { 72 | INT8U i; 73 | MCP2515_SELECT(); 74 | spi_readwrite(MCP_READ); 75 | spi_readwrite(address); 76 | // mcp2515 has auto-increment of address-pointer 77 | for (i=0; i TXBnD7 */ 312 | a1 = MCP_TXB0CTRL; 313 | a2 = MCP_TXB1CTRL; 314 | a3 = MCP_TXB2CTRL; 315 | for (i = 0; i < 14; i++) { /* in-buffer loop */ 316 | mcp2515_setRegister(a1, 0); 317 | mcp2515_setRegister(a2, 0); 318 | mcp2515_setRegister(a3, 0); 319 | a1++; 320 | a2++; 321 | a3++; 322 | } 323 | mcp2515_setRegister(MCP_RXB0CTRL, 0); 324 | mcp2515_setRegister(MCP_RXB1CTRL, 0); 325 | } 326 | 327 | /********************************************************************************************************* 328 | ** Function name: mcp2515_init 329 | ** Descriptions: init the device 330 | ** input parameters: canSpeed : boadrate 331 | ** Output parameters: NONE 332 | ** Returned value: if success 333 | *********************************************************************************************************/ 334 | INT8U MCP_CAN::mcp2515_init(const INT8U canSpeed) /* mcp2515init */ 335 | { 336 | 337 | INT8U res; 338 | 339 | mcp2515_reset(); 340 | 341 | res = mcp2515_setCANCTRL_Mode(MODE_CONFIG); 342 | if(res > 0) 343 | { 344 | #if DEBUG_MODE 345 | Serial.print("Enter setting mode fall\r\n"); 346 | #endif 347 | return res; 348 | } 349 | #if DEBUG_MODE 350 | Serial.print("Enter setting mode success \r\n"); 351 | #endif 352 | 353 | /* set boadrate */ 354 | if(mcp2515_configRate(canSpeed)) 355 | { 356 | #if DEBUG_MODE 357 | Serial.print("set rate fall!!\r\n"); 358 | #endif 359 | return res; 360 | } 361 | #if DEBUG_MODE 362 | Serial.print("set rate success!!\r\n"); 363 | #endif 364 | 365 | if ( res == MCP2515_OK ) { 366 | 367 | /* init canbuffers */ 368 | mcp2515_initCANBuffers(); 369 | 370 | /* interrupt mode */ 371 | mcp2515_setRegister(MCP_CANINTE, MCP_RX0IF | MCP_RX1IF); 372 | 373 | #if (DEBUG_RXANY==1) 374 | /* enable both receive-buffers */ 375 | /* to receive any message */ 376 | /* and enable rollover */ 377 | mcp2515_modifyRegister(MCP_RXB0CTRL, 378 | MCP_RXB_RX_MASK | MCP_RXB_BUKT_MASK, 379 | MCP_RXB_RX_ANY | MCP_RXB_BUKT_MASK); 380 | mcp2515_modifyRegister(MCP_RXB1CTRL, MCP_RXB_RX_MASK, 381 | MCP_RXB_RX_ANY); 382 | #else 383 | /* enable both receive-buffers */ 384 | /* to receive messages */ 385 | /* with std. and ext. identifie */ 386 | /* rs */ 387 | /* and enable rollover */ 388 | mcp2515_modifyRegister(MCP_RXB0CTRL, 389 | MCP_RXB_RX_MASK | MCP_RXB_BUKT_MASK, 390 | MCP_RXB_RX_STDEXT | MCP_RXB_BUKT_MASK ); 391 | mcp2515_modifyRegister(MCP_RXB1CTRL, MCP_RXB_RX_MASK, 392 | MCP_RXB_RX_STDEXT); 393 | #endif 394 | /* enter normal mode */ 395 | res = mcp2515_setCANCTRL_Mode(MODE_NORMAL); 396 | if(res) 397 | { 398 | #if DEBUG_MODE 399 | Serial.print("Enter Normal Mode Fall!!\r\n"); 400 | #endif 401 | return res; 402 | } 403 | 404 | 405 | #if DEBUG_MODE 406 | Serial.print("Enter Normal Mode Success!!\r\n"); 407 | #endif 408 | 409 | } 410 | return res; 411 | 412 | } 413 | 414 | /********************************************************************************************************* 415 | ** Function name: mcp2515_write_id 416 | ** Descriptions: write can id 417 | ** input parameters: NONE 418 | ** Output parameters: NONE 419 | ** Returned value: NONE 420 | *********************************************************************************************************/ 421 | void MCP_CAN::mcp2515_write_id( const INT8U mcp_addr, 422 | const INT8U ext, 423 | const INT32U id ) 424 | { 425 | uint16_t canid; 426 | INT8U tbufdata[4]; 427 | 428 | canid = (uint16_t)(id & 0x0FFFF); 429 | 430 | if ( ext == 1) { 431 | tbufdata[MCP_EID0] = (INT8U) (canid & 0xFF); 432 | tbufdata[MCP_EID8] = (INT8U) (canid / 256); 433 | canid = (uint16_t)( id / 0x10000L ); 434 | tbufdata[MCP_SIDL] = (INT8U) (canid & 0x03); 435 | tbufdata[MCP_SIDL] += (INT8U) ((canid & 0x1C )*8); 436 | tbufdata[MCP_SIDL] |= MCP_TXB_EXIDE_M; 437 | tbufdata[MCP_SIDH] = (INT8U) (canid / 32 ); 438 | } 439 | else { 440 | tbufdata[MCP_SIDH] = (INT8U) (canid / 8 ); 441 | tbufdata[MCP_SIDL] = (INT8U) ((canid & 0x07 )<<5); 442 | tbufdata[MCP_EID0] = 0; 443 | tbufdata[MCP_EID8] = 0; 444 | } 445 | mcp2515_setRegisterS( mcp_addr, tbufdata, 4 ); 446 | } 447 | 448 | /********************************************************************************************************* 449 | ** Function name: mcp2515_read_id 450 | ** Descriptions: read can id 451 | ** input parameters: NONE 452 | ** Output parameters: NONE 453 | ** Returned value: if success 454 | *********************************************************************************************************/ 455 | void MCP_CAN::mcp2515_read_id( const INT8U mcp_addr, 456 | INT8U* ext, 457 | INT32U* id ) 458 | { 459 | INT8U tbufdata[4]; 460 | 461 | *ext = 0; 462 | *id = 0; 463 | 464 | mcp2515_readRegisterS( mcp_addr, tbufdata, 4 ); 465 | 466 | *id = (tbufdata[MCP_SIDH]<<3) + (tbufdata[MCP_SIDL]>>5); 467 | 468 | if ( (tbufdata[MCP_SIDL] & MCP_TXB_EXIDE_M) == MCP_TXB_EXIDE_M ) { 469 | /* extended id */ 470 | *id = (*id<<2) + (tbufdata[MCP_SIDL] & 0x03); 471 | *id <<= 16; 472 | *id = *id +(tbufdata[MCP_EID8]<<8) + tbufdata[MCP_EID0]; 473 | *ext = 1; 474 | } 475 | } 476 | 477 | /********************************************************************************************************* 478 | ** Function name: mcp2515_write_canMsg 479 | ** Descriptions: write msg 480 | ** input parameters: NONE 481 | ** Output parameters: NONE 482 | ** Returned value: NONE 483 | *********************************************************************************************************/ 484 | void MCP_CAN::mcp2515_write_canMsg( const INT8U buffer_sidh_addr) 485 | { 486 | INT8U mcp_addr; 487 | mcp_addr = buffer_sidh_addr; 488 | mcp2515_setRegisterS(mcp_addr+5, m_nDta, m_nDlc ); /* write data bytes */ 489 | if ( m_nRtr == 1) m_nDlc |= MCP_RTR_MASK; /* if RTR set bit in byte */ 490 | mcp2515_setRegister( (mcp_addr+4), m_nDlc ); /* write the RTR and DLC */ 491 | mcp2515_write_id( mcp_addr, m_nExtFlg, m_nID ); /* write CAN id */ 492 | 493 | } 494 | 495 | /********************************************************************************************************* 496 | ** Function name: mcp2515_read_canMsg 497 | ** Descriptions: read message 498 | ** input parameters: NONE 499 | ** Output parameters: NONE 500 | ** Returned value: NONE 501 | *********************************************************************************************************/ 502 | void MCP_CAN::mcp2515_read_canMsg( const INT8U buffer_sidh_addr) /* read can msg */ 503 | { 504 | INT8U mcp_addr, ctrl; 505 | 506 | mcp_addr = buffer_sidh_addr; 507 | 508 | mcp2515_read_id( mcp_addr, &m_nExtFlg,&m_nID ); 509 | 510 | ctrl = mcp2515_readRegister( mcp_addr-1 ); 511 | m_nDlc = mcp2515_readRegister( mcp_addr+4 ); 512 | 513 | if ((ctrl & 0x08)) { 514 | m_nRtr = 1; 515 | } 516 | else { 517 | m_nRtr = 0; 518 | } 519 | 520 | m_nDlc &= MCP_DLC_MASK; 521 | mcp2515_readRegisterS( mcp_addr+5, &(m_nDta[0]), m_nDlc ); 522 | } 523 | 524 | /********************************************************************************************************* 525 | ** Function name: sendMsg 526 | ** Descriptions: send message 527 | ** input parameters: NONE 528 | ** Output parameters: NONE 529 | ** Returned value: if success 530 | *********************************************************************************************************/ 531 | void MCP_CAN::mcp2515_start_transmit(const INT8U mcp_addr) /* start transmit */ 532 | { 533 | mcp2515_modifyRegister( mcp_addr-1 , MCP_TXB_TXREQ_M, MCP_TXB_TXREQ_M ); 534 | } 535 | 536 | /********************************************************************************************************* 537 | ** Function name: sendMsg 538 | ** Descriptions: send message 539 | ** input parameters: NONE 540 | ** Output parameters: NONE 541 | ** Returned value: if success 542 | *********************************************************************************************************/ 543 | INT8U MCP_CAN::mcp2515_getNextFreeTXBuf(INT8U *txbuf_n) /* get Next free txbuf */ 544 | { 545 | INT8U res, i, ctrlval; 546 | INT8U ctrlregs[MCP_N_TXBUFFERS] = { MCP_TXB0CTRL, MCP_TXB1CTRL, MCP_TXB2CTRL }; 547 | 548 | res = MCP_ALLTXBUSY; 549 | *txbuf_n = 0x00; 550 | 551 | /* check all 3 TX-Buffers */ 552 | for (i=0; i 0){ 598 | #if DEBUG_MODE 599 | Serial.print("Enter setting mode fall\r\n"); 600 | #endif 601 | return res; 602 | } 603 | 604 | if (num == 0){ 605 | mcp2515_write_id(MCP_RXM0SIDH, ext, ulData); 606 | 607 | } 608 | else if(num == 1){ 609 | mcp2515_write_id(MCP_RXM1SIDH, ext, ulData); 610 | } 611 | else res = MCP2515_FAIL; 612 | 613 | res = mcp2515_setCANCTRL_Mode(MODE_NORMAL); 614 | if(res > 0){ 615 | #if DEBUG_MODE 616 | Serial.print("Enter normal mode fall\r\n"); 617 | #endif 618 | return res; 619 | } 620 | #if DEBUG_MODE 621 | Serial.print("set Mask success!!\r\n"); 622 | #endif 623 | return res; 624 | } 625 | 626 | /********************************************************************************************************* 627 | ** Function name: init_Filt 628 | ** Descriptions: init canid filters 629 | ** input parameters: num : Filters number 630 | ext : if ext id 631 | ulData: data 632 | ** Output parameters: NONE 633 | ** Returned value: ifsuccess 634 | *********************************************************************************************************/ 635 | INT8U MCP_CAN::init_Filt(INT8U num, INT8U ext, INT32U ulData) 636 | { 637 | INT8U res = MCP2515_OK; 638 | #if DEBUG_MODE 639 | Serial.print("Begin to set Filter!!\r\n"); 640 | #endif 641 | res = mcp2515_setCANCTRL_Mode(MODE_CONFIG); 642 | if(res > 0) 643 | { 644 | #if DEBUG_MODE 645 | Serial.print("Enter setting mode fall\r\n"); 646 | #endif 647 | return res; 648 | } 649 | 650 | switch( num ) 651 | { 652 | case 0: 653 | mcp2515_write_id(MCP_RXF0SIDH, ext, ulData); 654 | break; 655 | 656 | case 1: 657 | mcp2515_write_id(MCP_RXF1SIDH, ext, ulData); 658 | break; 659 | 660 | case 2: 661 | mcp2515_write_id(MCP_RXF2SIDH, ext, ulData); 662 | break; 663 | 664 | case 3: 665 | mcp2515_write_id(MCP_RXF3SIDH, ext, ulData); 666 | break; 667 | 668 | case 4: 669 | mcp2515_write_id(MCP_RXF4SIDH, ext, ulData); 670 | break; 671 | 672 | case 5: 673 | mcp2515_write_id(MCP_RXF5SIDH, ext, ulData); 674 | break; 675 | 676 | default: 677 | res = MCP2515_FAIL; 678 | } 679 | 680 | res = mcp2515_setCANCTRL_Mode(MODE_NORMAL); 681 | if(res > 0) 682 | { 683 | #if DEBUG_MODE 684 | Serial.print("Enter normal mode fall\r\nSet filter fail!!\r\n"); 685 | #endif 686 | return res; 687 | } 688 | #if DEBUG_MODE 689 | Serial.print("set Filter success!!\r\n"); 690 | #endif 691 | 692 | return res; 693 | } 694 | 695 | /********************************************************************************************************* 696 | ** Function name: setMsg 697 | ** Descriptions: set can message, such as dlc, id, dta[] and so on 698 | ** input parameters: NONE 699 | ** Output parameters: NONE 700 | ** Returned value: if success 701 | *********************************************************************************************************/ 702 | INT8U MCP_CAN::setMsg(INT32U id, INT8U ext, INT8U len, INT8U *pData) 703 | { 704 | int i = 0; 705 | m_nExtFlg = ext; 706 | m_nID = id; 707 | m_nDlc = len; 708 | for(i = 0; i 23 | #include 24 | #include 25 | 26 | #ifndef INT32U 27 | #define INT32U unsigned long 28 | #endif 29 | 30 | #ifndef INT8U 31 | #define INT8U unsigned char 32 | #endif 33 | 34 | // if print debug information 35 | #define DEBUG_MODE 1 36 | /* 37 | * Begin mt 38 | */ 39 | #define TIMEOUTVALUE 50 40 | #define MCP_SIDH 0 41 | #define MCP_SIDL 1 42 | #define MCP_EID8 2 43 | #define MCP_EID0 3 44 | 45 | #define MCP_TXB_EXIDE_M 0x08 /* In TXBnSIDL */ 46 | #define MCP_DLC_MASK 0x0F /* 4 LSBits */ 47 | #define MCP_RTR_MASK 0x40 /* (1<<6) Bit 6 */ 48 | 49 | #define MCP_RXB_RX_ANY 0x60 50 | #define MCP_RXB_RX_EXT 0x40 51 | #define MCP_RXB_RX_STD 0x20 52 | #define MCP_RXB_RX_STDEXT 0x00 53 | #define MCP_RXB_RX_MASK 0x60 54 | #define MCP_RXB_BUKT_MASK (1<<2) 55 | 56 | /* 57 | ** Bits in the TXBnCTRL registers. 58 | */ 59 | #define MCP_TXB_TXBUFE_M 0x80 60 | #define MCP_TXB_ABTF_M 0x40 61 | #define MCP_TXB_MLOA_M 0x20 62 | #define MCP_TXB_TXERR_M 0x10 63 | #define MCP_TXB_TXREQ_M 0x08 64 | #define MCP_TXB_TXIE_M 0x04 65 | #define MCP_TXB_TXP10_M 0x03 66 | 67 | #define MCP_TXB_RTR_M 0x40 /* In TXBnDLC */ 68 | #define MCP_RXB_IDE_M 0x08 /* In RXBnSIDL */ 69 | #define MCP_RXB_RTR_M 0x40 /* In RXBnDLC */ 70 | 71 | #define MCP_STAT_RXIF_MASK (0x03) 72 | #define MCP_STAT_RX0IF (1<<0) 73 | #define MCP_STAT_RX1IF (1<<1) 74 | 75 | #define MCP_EFLG_RX1OVR (1<<7) 76 | #define MCP_EFLG_RX0OVR (1<<6) 77 | #define MCP_EFLG_TXBO (1<<5) 78 | #define MCP_EFLG_TXEP (1<<4) 79 | #define MCP_EFLG_RXEP (1<<3) 80 | #define MCP_EFLG_TXWAR (1<<2) 81 | #define MCP_EFLG_RXWAR (1<<1) 82 | #define MCP_EFLG_EWARN (1<<0) 83 | #define MCP_EFLG_ERRORMASK (0xF8) /* 5 MS-Bits */ 84 | 85 | 86 | /* 87 | * Define MCP2515 register addresses 88 | */ 89 | 90 | #define MCP_RXF0SIDH 0x00 91 | #define MCP_RXF0SIDL 0x01 92 | #define MCP_RXF0EID8 0x02 93 | #define MCP_RXF0EID0 0x03 94 | #define MCP_RXF1SIDH 0x04 95 | #define MCP_RXF1SIDL 0x05 96 | #define MCP_RXF1EID8 0x06 97 | #define MCP_RXF1EID0 0x07 98 | #define MCP_RXF2SIDH 0x08 99 | #define MCP_RXF2SIDL 0x09 100 | #define MCP_RXF2EID8 0x0A 101 | #define MCP_RXF2EID0 0x0B 102 | #define MCP_CANSTAT 0x0E 103 | #define MCP_CANCTRL 0x0F 104 | #define MCP_RXF3SIDH 0x10 105 | #define MCP_RXF3SIDL 0x11 106 | #define MCP_RXF3EID8 0x12 107 | #define MCP_RXF3EID0 0x13 108 | #define MCP_RXF4SIDH 0x14 109 | #define MCP_RXF4SIDL 0x15 110 | #define MCP_RXF4EID8 0x16 111 | #define MCP_RXF4EID0 0x17 112 | #define MCP_RXF5SIDH 0x18 113 | #define MCP_RXF5SIDL 0x19 114 | #define MCP_RXF5EID8 0x1A 115 | #define MCP_RXF5EID0 0x1B 116 | #define MCP_TEC 0x1C 117 | #define MCP_REC 0x1D 118 | #define MCP_RXM0SIDH 0x20 119 | #define MCP_RXM0SIDL 0x21 120 | #define MCP_RXM0EID8 0x22 121 | #define MCP_RXM0EID0 0x23 122 | #define MCP_RXM1SIDH 0x24 123 | #define MCP_RXM1SIDL 0x25 124 | #define MCP_RXM1EID8 0x26 125 | #define MCP_RXM1EID0 0x27 126 | #define MCP_CNF3 0x28 127 | #define MCP_CNF2 0x29 128 | #define MCP_CNF1 0x2A 129 | #define MCP_CANINTE 0x2B 130 | #define MCP_CANINTF 0x2C 131 | #define MCP_EFLG 0x2D 132 | #define MCP_TXB0CTRL 0x30 133 | #define MCP_TXB1CTRL 0x40 134 | #define MCP_TXB2CTRL 0x50 135 | #define MCP_RXB0CTRL 0x60 136 | #define MCP_RXB0SIDH 0x61 137 | #define MCP_RXB1CTRL 0x70 138 | #define MCP_RXB1SIDH 0x71 139 | 140 | 141 | #define MCP_TX_INT 0x1C /* Enable all transmit interrup */ 142 | /* ts */ 143 | #define MCP_TX01_INT 0x0C /* Enable TXB0 and TXB1 interru */ 144 | /* pts */ 145 | #define MCP_RX_INT 0x03 /* Enable receive interrupts */ 146 | #define MCP_NO_INT 0x00 /* Disable all interrupts */ 147 | 148 | #define MCP_TX01_MASK 0x14 149 | #define MCP_TX_MASK 0x54 150 | 151 | /* 152 | * Define SPI Instruction Set 153 | */ 154 | 155 | #define MCP_WRITE 0x02 156 | 157 | #define MCP_READ 0x03 158 | 159 | #define MCP_BITMOD 0x05 160 | 161 | #define MCP_LOAD_TX0 0x40 162 | #define MCP_LOAD_TX1 0x42 163 | #define MCP_LOAD_TX2 0x44 164 | 165 | #define MCP_RTS_TX0 0x81 166 | #define MCP_RTS_TX1 0x82 167 | #define MCP_RTS_TX2 0x84 168 | #define MCP_RTS_ALL 0x87 169 | 170 | #define MCP_READ_RX0 0x90 171 | #define MCP_READ_RX1 0x94 172 | 173 | #define MCP_READ_STATUS 0xA0 174 | 175 | #define MCP_RX_STATUS 0xB0 176 | 177 | #define MCP_RESET 0xC0 178 | 179 | 180 | /* 181 | * CANCTRL Register Values 182 | */ 183 | 184 | #define MODE_NORMAL 0x00 185 | #define MODE_SLEEP 0x20 186 | #define MODE_LOOPBACK 0x40 187 | #define MODE_LISTENONLY 0x60 188 | #define MODE_CONFIG 0x80 189 | #define MODE_POWERUP 0xE0 190 | #define MODE_MASK 0xE0 191 | #define ABORT_TX 0x10 192 | #define MODE_ONESHOT 0x08 193 | #define CLKOUT_ENABLE 0x04 194 | #define CLKOUT_DISABLE 0x00 195 | #define CLKOUT_PS1 0x00 196 | #define CLKOUT_PS2 0x01 197 | #define CLKOUT_PS4 0x02 198 | #define CLKOUT_PS8 0x03 199 | 200 | 201 | /* 202 | * CNF1 Register Values 203 | */ 204 | 205 | #define SJW1 0x00 206 | #define SJW2 0x40 207 | #define SJW3 0x80 208 | #define SJW4 0xC0 209 | 210 | 211 | /* 212 | * CNF2 Register Values 213 | */ 214 | 215 | #define BTLMODE 0x80 216 | #define SAMPLE_1X 0x00 217 | #define SAMPLE_3X 0x40 218 | 219 | 220 | /* 221 | * CNF3 Register Values 222 | */ 223 | 224 | #define SOF_ENABLE 0x80 225 | #define SOF_DISABLE 0x00 226 | #define WAKFIL_ENABLE 0x40 227 | #define WAKFIL_DISABLE 0x00 228 | 229 | 230 | /* 231 | * CANINTF Register Bits 232 | */ 233 | 234 | #define MCP_RX0IF 0x01 235 | #define MCP_RX1IF 0x02 236 | #define MCP_TX0IF 0x04 237 | #define MCP_TX1IF 0x08 238 | #define MCP_TX2IF 0x10 239 | #define MCP_ERRIF 0x20 240 | #define MCP_WAKIF 0x40 241 | #define MCP_MERRF 0x80 242 | 243 | /* 244 | * speed 16M 245 | */ 246 | #define MCP_16MHz_500kBPS_CFG1 (0x00) 247 | #define MCP_16MHz_500kBPS_CFG2 (0xb0) 248 | #define MCP_16MHz_500kBPS_CFG3 (0x06) 249 | 250 | #define MCP_16MHz_250kBPS_CFG1 (0x01) 251 | #define MCP_16MHz_250kBPS_CFG2 (0xb0) 252 | #define MCP_16MHz_250kBPS_CFG3 (0x06) 253 | 254 | #define MCP_16MHz_200kBPS_CFG1 (0x00) 255 | #define MCP_16MHz_200kBPS_CFG2 (0xba) 256 | #define MCP_16MHz_200kBPS_CFG3 (0x07) 257 | 258 | #define MCP_16MHz_125kBPS_CFG1 (0x03) 259 | #define MCP_16MHz_125kBPS_CFG2 (0xac) 260 | #define MCP_16MHz_125kBPS_CFG3 (0x03) 261 | 262 | #define MCP_16MHz_100kBPS_CFG1 (0x03) 263 | #define MCP_16MHz_100kBPS_CFG2 (0xba) 264 | #define MCP_16MHz_100kBPS_CFG3 (0x07) 265 | 266 | #define MCP_16MHz_80kBPS_CFG1 (0x03) 267 | #define MCP_16MHz_80kBPS_CFG2 (0xbf) 268 | #define MCP_16MHz_80kBPS_CFG3 (0x07) 269 | 270 | #define MCP_16MHz_50kBPS_CFG1 (0x07) 271 | #define MCP_16MHz_50kBPS_CFG2 (0xba) 272 | #define MCP_16MHz_50kBPS_CFG3 (0x07) 273 | 274 | #define MCP_16MHz_40kBPS_CFG1 (0x07) 275 | #define MCP_16MHz_40kBPS_CFG2 (0xbf) 276 | #define MCP_16MHz_40kBPS_CFG3 (0x07) 277 | 278 | #define MCP_16MHz_20kBPS_CFG1 (0x0f) 279 | #define MCP_16MHz_20kBPS_CFG2 (0xbf) 280 | #define MCP_16MHz_20kBPS_CFG3 (0x07) 281 | 282 | #define MCP_16MHz_10kBPS_CFG1 (0x1f) 283 | #define MCP_16MHz_10kBPS_CFG2 (0xbf) 284 | #define MCP_16MHz_10kBPS_CFG3 (0x07) 285 | 286 | #define MCP_16MHz_5kBPS_CFG1 (0x3f) 287 | #define MCP_16MHz_5kBPS_CFG2 (0xbf) 288 | #define MCP_16MHz_5kBPS_CFG3 (0x07) 289 | 290 | 291 | 292 | #define MCPDEBUG (0) 293 | #define MCPDEBUG_TXBUF (0) 294 | #define MCP_N_TXBUFFERS (3) 295 | 296 | #define MCP_RXBUF_0 (MCP_RXB0SIDH) 297 | #define MCP_RXBUF_1 (MCP_RXB1SIDH) 298 | 299 | #define SPICS 10 300 | #define MCP2515_SELECT() digitalWrite(SPICS, LOW) 301 | #define MCP2515_UNSELECT() digitalWrite(SPICS, HIGH) 302 | 303 | #define MCP2515_OK (0) 304 | #define MCP2515_FAIL (1) 305 | #define MCP_ALLTXBUSY (2) 306 | 307 | #define CANDEBUG 1 308 | 309 | #define CANUSELOOP 0 310 | 311 | #define CANSENDTIMEOUT (200) /* milliseconds */ 312 | 313 | /* 314 | * initial value of gCANAutoProcess 315 | */ 316 | #define CANAUTOPROCESS (1) 317 | #define CANAUTOON (1) 318 | #define CANAUTOOFF (0) 319 | 320 | #define CAN_STDID (0) 321 | #define CAN_EXTID (1) 322 | 323 | #define CANDEFAULTIDENT (0x55CC) 324 | #define CANDEFAULTIDENTEXT (CAN_EXTID) 325 | 326 | #define CAN_5KBPS 1 327 | #define CAN_10KBPS 2 328 | #define CAN_20KBPS 3 329 | #define CAN_40KBPS 4 330 | #define CAN_50KBPS 5 331 | #define CAN_80KBPS 6 332 | #define CAN_100KBPS 7 333 | #define CAN_125KBPS 8 334 | #define CAN_200KBPS 9 335 | #define CAN_250KBPS 10 336 | #define CAN_500KBPS 11 337 | 338 | #define CAN_OK (0) 339 | #define CAN_FAILINIT (1) 340 | #define CAN_FAILTX (2) 341 | #define CAN_MSGAVAIL (3) 342 | #define CAN_NOMSG (4) 343 | #define CAN_CTRLERROR (5) 344 | #define CAN_GETTXBFTIMEOUT (6) 345 | #define CAN_SENDMSGTIMEOUT (7) 346 | #define CAN_FAIL (0xff) 347 | 348 | #define CAN_MAX_CHAR_IN_MESSAGE (8) 349 | 350 | #endif 351 | /********************************************************************************************************* 352 | END FILE 353 | *********************************************************************************************************/ 354 | --------------------------------------------------------------------------------