标题:
51单片机CAN通讯的测试小程序
[打印本页]
作者:
oldspring
时间:
2018-11-6 10:03
标题:
51单片机CAN通讯的测试小程序
大多数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.51hei.com/bbs/dpj-136722-1.html
canspi.jpg
(65.95 KB, 下载次数: 75)
下载附件
2018-11-6 10:01 上传
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1