大多數51單片機都有內部的SPI模塊,因此,我們可以結合 MCP2515 or MCP2510 等芯片進行CAN通訊。以下是一個51單片機利用內部SPI模塊功能進行CAN通訊的測試小程序,希望大家能夠喜歡。
First CANSPI node 程序:
- unsigned char Can_Init_Flags, Can_Send_Flags, Can_Rcv_Flags; // can flags
- unsigned char Rx_Data_Len; // received data length in bytes
- char RxTx_Data[8]; // can rx/tx data buffer
- char Msg_Rcvd; // reception flag
- const long ID_1st = 12111, ID_2nd = 3; // node IDs
- long Rx_ID;
- // CANSPI module connections
- sbit CanSpi_CS at P1_0_bit;
- sbit CanSpi_Rst at P1_2_bit;
- // End CANSPI module connections
- void main() {
- Can_Init_Flags = 0; //
- Can_Send_Flags = 0; // clear flags
- Can_Rcv_Flags = 0; //
- Can_Send_Flags = _CANSPI_TX_PRIORITY_0 & // form value to be used
- _CANSPI_TX_XTD_FRAME & // with CANSPIWrite
- _CANSPI_TX_NO_RTR_FRAME;
- Can_Init_Flags = _CANSPI_CONFIG_SAMPLE_THRICE & // Form value to be used
- _CANSPI_CONFIG_PHSEG2_PRG_ON & // with CANSPIInit
- _CANSPI_CONFIG_XTD_MSG &
- _CANSPI_CONFIG_DBL_BUFFER_ON &
- _CANSPI_CONFIG_VALID_XTD_MSG;
- SPI1_Init(); // initialize SPI1 module
- CANSPIInitialize(1,3,3,3,1,Can_Init_Flags); // Initialize external CANSPI module
- CANSPISetOperationMode(_CANSPI_MODE_CONFIG,0xFF); // set CONFIGURATION mode
- CANSPISetMask(_CANSPI_MASK_B1,-1,_CANSPI_CONFIG_XTD_MSG); // set all mask1 bits to ones
- CANSPISetMask(_CANSPI_MASK_B2,-1,_CANSPI_CONFIG_XTD_MSG); // set all mask2 bits to ones
- CANSPISetFilter(_CANSPI_FILTER_B2_F4,ID_2nd,_CANSPI_CONFIG_XTD_MSG);// set id of filter B2_F4 to 2nd node ID
- CANSPISetOperationMode(_CANSPI_MODE_NORMAL,0xFF); // set NORMAL mode
- RxTx_Data[0] = 9; // set initial data to be sent
- CANSPIWrite(ID_1st, RxTx_Data, 1, Can_Send_Flags); // send initial message
- while(1) { // endless loop
- Msg_Rcvd = CANSPIRead(&Rx_ID , RxTx_Data , &Rx_Data_Len, &Can_Rcv_Flags);// receive message
- if ((Rx_ID == ID_2nd) && Msg_Rcvd) { // if message received check id
- P0 = RxTx_Data[0]; // id correct, output data at PORT0
- RxTx_Data[0]++ ; // increment received data
- Delay_ms(10);
- CANSPIWrite(ID_1st, RxTx_Data, 1, Can_Send_Flags); // send incremented data back
- }
- }
- }
復制代碼
Second CANSPI node 程序:
- unsigned char Can_Init_Flags, Can_Send_Flags, Can_Rcv_Flags; // can flags
- unsigned char Rx_Data_Len; // received data length in bytes
- char RxTx_Data[8]; // can rx/tx data buffer
- char Msg_Rcvd; // reception flag
- const long ID_1st = 12111, ID_2nd = 3; // node IDs
- long Rx_ID;
- // CANSPI module connections
- sbit CanSpi_CS at P1_0_bit;
- sbit CanSpi_Rst at P1_2_bit;
- // End CANSPI module connections
- void main() {
- Can_Init_Flags = 0; //
- Can_Send_Flags = 0; // clear flags
- Can_Rcv_Flags = 0; //
- Can_Send_Flags = _CANSPI_TX_PRIORITY_0 & // form value to be used
- _CANSPI_TX_XTD_FRAME & // with CANSPIWrite
- _CANSPI_TX_NO_RTR_FRAME;
- Can_Init_Flags = _CANSPI_CONFIG_SAMPLE_THRICE & // Form value to be used
- _CANSPI_CONFIG_PHSEG2_PRG_ON & // with CANSPIInit
- _CANSPI_CONFIG_XTD_MSG &
- _CANSPI_CONFIG_DBL_BUFFER_ON &
- _CANSPI_CONFIG_VALID_XTD_MSG &
- _CANSPI_CONFIG_LINE_FILTER_OFF;
- SPI1_Init(); // initialize SPI1 module
-
- CANSPIInitialize(1,3,3,3,1,Can_Init_Flags); // initialize external CANSPI module
- CANSPISetOperationMode(_CANSPI_MODE_CONFIG,0xFF); // set CONFIGURATION mode
- CANSPISetMask(_CANSPI_MASK_B1,-1,_CANSPI_CONFIG_XTD_MSG); // set all mask1 bits to ones
- CANSPISetMask(_CANSPI_MASK_B2,-1,_CANSPI_CONFIG_XTD_MSG); // set all mask2 bits to ones
- CANSPISetFilter(_CANSPI_FILTER_B2_F3,ID_1st,_CANSPI_CONFIG_XTD_MSG); // set id of filter B2_F3 to 1st node ID
- CANSPISetOperationMode(_CANSPI_MODE_NORMAL,0xFF); // set NORMAL mode
- while (1) { // endless loop
- Msg_Rcvd = CANSPIRead(&Rx_ID , RxTx_Data , &Rx_Data_Len, &Can_Rcv_Flags); // receive message
- if ((Rx_ID == ID_1st) && Msg_Rcvd) { // if message received check id
- P0 = RxTx_Data[0]; // id correct, output data at PORT0
- RxTx_Data[0]++ ; // increment received data
- CANSPIWrite(ID_2nd, RxTx_Data, 1, Can_Send_Flags); // send incremented data back
- }
- }
- }
復制代碼 相關信息:http://www.zg4o1577.cn/bbs/dpj-136722-1.html
|