标题: 51单片机CAN通讯的测试小程序 [打印本页]

作者: oldspring    时间: 2018-11-6 10:03
标题: 51单片机CAN通讯的测试小程序
大多数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










欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1