单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 849|回复: 0
收起左侧

51单片机CAN通讯的测试小程序

[复制链接]
oldspring 发表于 2018-11-6 10:03 | 显示全部楼层 |阅读模式
大多数51单片机都有内部的SPI模块,因此,我们可以结合 MCP2515 or MCP2510 等芯片进行CAN通讯。以下是一个51单片机利用内部SPI模块功能进行CAN通讯的测试小程序,希望大家能够喜欢。



First CANSPI node 程序:
  1. unsigned char Can_Init_Flags, Can_Send_Flags, Can_Rcv_Flags; // can flags
  2. unsigned char Rx_Data_Len;                                   // received data length in bytes
  3. char RxTx_Data[8];                                           // can rx/tx data buffer
  4. char Msg_Rcvd;                                               // reception flag
  5. const long ID_1st = 12111, ID_2nd = 3;                       // node IDs
  6. long Rx_ID;

  7. // CANSPI module connections
  8. sbit CanSpi_CS  at P1_0_bit;
  9. sbit CanSpi_Rst at P1_2_bit;
  10. // End CANSPI module connections

  11. void main() {

  12.   Can_Init_Flags = 0;                                         //
  13.   Can_Send_Flags = 0;                                         // clear flags
  14.   Can_Rcv_Flags  = 0;                                         //

  15.   Can_Send_Flags = _CANSPI_TX_PRIORITY_0 &                    // form value to be used
  16.                    _CANSPI_TX_XTD_FRAME &                     //   with CANSPIWrite
  17.                    _CANSPI_TX_NO_RTR_FRAME;

  18.   Can_Init_Flags = _CANSPI_CONFIG_SAMPLE_THRICE &             // Form value to be used
  19.                    _CANSPI_CONFIG_PHSEG2_PRG_ON &             //  with CANSPIInit
  20.                    _CANSPI_CONFIG_XTD_MSG &
  21.                    _CANSPI_CONFIG_DBL_BUFFER_ON &
  22.                    _CANSPI_CONFIG_VALID_XTD_MSG;


  23.   SPI1_Init();                                                     // initialize SPI1 module

  24.   CANSPIInitialize(1,3,3,3,1,Can_Init_Flags);                      // Initialize external CANSPI module

  25.   CANSPISetOperationMode(_CANSPI_MODE_CONFIG,0xFF);                // set CONFIGURATION mode
  26.   CANSPISetMask(_CANSPI_MASK_B1,-1,_CANSPI_CONFIG_XTD_MSG);        // set all mask1 bits to ones
  27.   CANSPISetMask(_CANSPI_MASK_B2,-1,_CANSPI_CONFIG_XTD_MSG);        // set all mask2 bits to ones
  28.   CANSPISetFilter(_CANSPI_FILTER_B2_F4,ID_2nd,_CANSPI_CONFIG_XTD_MSG);// set id of filter B2_F4 to 2nd node ID

  29.   CANSPISetOperationMode(_CANSPI_MODE_NORMAL,0xFF);                // set NORMAL mode

  30.   RxTx_Data[0] = 9;                                                // set initial data to be sent

  31.   CANSPIWrite(ID_1st, RxTx_Data, 1, Can_Send_Flags);               // send initial message

  32.   while(1) {                                                                 // endless loop

  33.     Msg_Rcvd = CANSPIRead(&Rx_ID , RxTx_Data , &Rx_Data_Len, &Can_Rcv_Flags);// receive message

  34.     if ((Rx_ID == ID_2nd) && Msg_Rcvd) {                                     // if message received check id

  35.       P0 = RxTx_Data[0];                                                     // id correct, output data at PORT0
  36.       RxTx_Data[0]++ ;                                                       // increment received data
  37.       Delay_ms(10);
  38.       CANSPIWrite(ID_1st, RxTx_Data, 1, Can_Send_Flags);                     // send incremented data back
  39.     }
  40.   }
  41. }
复制代码

Second CANSPI node 程序:
  1. unsigned char Can_Init_Flags, Can_Send_Flags, Can_Rcv_Flags; // can flags
  2. unsigned char Rx_Data_Len;                                   // received data length in bytes
  3. char RxTx_Data[8];                                           // can rx/tx data buffer
  4. char Msg_Rcvd;                                               // reception flag
  5. const long ID_1st = 12111, ID_2nd = 3;                       // node IDs
  6. long Rx_ID;

  7. // CANSPI module connections
  8. sbit CanSpi_CS  at P1_0_bit;
  9. sbit CanSpi_Rst at P1_2_bit;
  10. // End CANSPI module connections

  11. void main() {
  12.   Can_Init_Flags = 0;                                         //
  13.   Can_Send_Flags = 0;                                         // clear flags
  14.   Can_Rcv_Flags  = 0;                                         //

  15.   Can_Send_Flags = _CANSPI_TX_PRIORITY_0 &                    // form value to be used
  16.                    _CANSPI_TX_XTD_FRAME &                     //   with CANSPIWrite
  17.                    _CANSPI_TX_NO_RTR_FRAME;

  18.   Can_Init_Flags = _CANSPI_CONFIG_SAMPLE_THRICE &             // Form value to be used
  19.                    _CANSPI_CONFIG_PHSEG2_PRG_ON &             //  with CANSPIInit
  20.                    _CANSPI_CONFIG_XTD_MSG &
  21.                    _CANSPI_CONFIG_DBL_BUFFER_ON &
  22.                    _CANSPI_CONFIG_VALID_XTD_MSG &
  23.                    _CANSPI_CONFIG_LINE_FILTER_OFF;

  24.   SPI1_Init();                                                                // initialize SPI1 module
  25.   
  26.   CANSPIInitialize(1,3,3,3,1,Can_Init_Flags);                                 // initialize external CANSPI module
  27.   CANSPISetOperationMode(_CANSPI_MODE_CONFIG,0xFF);                           // set CONFIGURATION mode
  28.   CANSPISetMask(_CANSPI_MASK_B1,-1,_CANSPI_CONFIG_XTD_MSG);                   // set all mask1 bits to ones
  29.   CANSPISetMask(_CANSPI_MASK_B2,-1,_CANSPI_CONFIG_XTD_MSG);                   // set all mask2 bits to ones
  30.   CANSPISetFilter(_CANSPI_FILTER_B2_F3,ID_1st,_CANSPI_CONFIG_XTD_MSG);        // set id of filter B2_F3 to 1st node ID

  31.   CANSPISetOperationMode(_CANSPI_MODE_NORMAL,0xFF);                           // set NORMAL mode

  32.   while (1) {                                                                 // endless loop
  33.     Msg_Rcvd = CANSPIRead(&Rx_ID , RxTx_Data , &Rx_Data_Len, &Can_Rcv_Flags); // receive message
  34.     if ((Rx_ID == ID_1st) && Msg_Rcvd) {                                      // if message received check id
  35.       P0 = RxTx_Data[0];                                                      // id correct, output data at PORT0
  36.       RxTx_Data[0]++ ;                                                        // increment received data
  37.       CANSPIWrite(ID_2nd, RxTx_Data, 1, Can_Send_Flags);                      // send incremented data back
  38.     }
  39.   }
  40. }
复制代码
相关信息:http://www.51hei.com/bbs/dpj-136722-1.html

canspi.jpg




评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51hei电子论坛2群 联系QQ:125739409;技术交流QQ群219535678

Powered by 单片机教程网

快速回复 返回顶部 返回列表