1

我正在做项目,我们需要在 4 个节点之间建立 CAN 通信,2 个使用 PIC 18F4580,2 个使用 18F25K80。在所有这些电路中,我使用的是 20MHz 的晶体振荡器。问题是当我测试相同 PIC 之间的通信时,它可以正常工作,但是当我尝试使用两个不同的 PIC 时,它无法正常工作。

我用来测试的代码:对于发射 PIC 18F4580:每 1 秒发射一条 CAN 消息:

int i;

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_cmd = 3, ID_led1 = 2;                       // node IDs
long Rx_ID;

void main() {

ADCON1=0xF;
TRISA=0xFF;
TRISD=0;
PORTD=0;


for(i=0;i<10;i++) {
    PORTD=0xFF ^ PORTD;   //Blinking Leds
    Delay_ms(100);
}

Can_Init_Flags = 0;                                       //
Can_Send_Flags = 0;                                       // clear flags
Can_Rcv_Flags  = 0;                                       //

Can_Send_Flags = _CAN_TX_PRIORITY_0 &                     // form value to be used
                 _CAN_TX_XTD_FRAME &                      //     with CANWrite
                 _CAN_TX_NO_RTR_FRAME;

Can_Init_Flags = _CAN_CONFIG_SAMPLE_THRICE &              // form value to be used
                 _CAN_CONFIG_PHSEG2_PRG_ON &              // with CANInit
                 _CAN_CONFIG_XTD_MSG &
                 _CAN_CONFIG_DBL_BUFFER_ON &
                 _CAN_CONFIG_VALID_XTD_MSG;

CANInitialize(1,3,3,3,1,Can_Init_Flags);                  // Initialize CAN module

CANSetOperationMode(_CAN_MODE_NORMAL,0xFF);               // set NORMAL mode

for(i=0;i<10;i++) {
    PORTD=0xFF ^ PORTD;   //Blinking Leds
    Delay_ms(100);
}

while(1){
    PORTD.F7=PORTA.F0;
    PORTD.F6=PORTA.F1;
    PORTD.F5=PORTA.F2;
    PORTD.F4=PORTA.F3;    //LEDS := SWITCHS

    CANWrite(ID_cmd, RxTx_Data, 1, Can_Send_Flags);                      // send incremented data back
    Delay_ms(1000);


}
}

对于接收节点 PIC 18F25K80:收到任何 CAN 消息后闪烁(应每 1 秒闪烁一次):

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_led1 = 2, ID_cmd = 3;                       // node IDs
long Rx_ID;

void main() {

//OSCCON |= 0b01110010;
TRISC = 0;

Can_Init_Flags = 0;                                       //
Can_Send_Flags = 0;                                       // clear flags
Can_Rcv_Flags  = 0;                                       //

Can_Send_Flags = _CAN_TX_PRIORITY_0 &                     // form value to be used
                 _CAN_TX_XTD_FRAME &                      //     with CANWrite
                 _CAN_TX_NO_RTR_FRAME;

Can_Init_Flags = _CAN_CONFIG_SAMPLE_THRICE &              // form value to be used
                 _CAN_CONFIG_PHSEG2_PRG_ON &              // with CANInit
                 _CAN_CONFIG_XTD_MSG &
                 _CAN_CONFIG_DBL_BUFFER_ON &
                 _CAN_CONFIG_VALID_XTD_MSG;

CANInitialize(1,3,3,3,1,Can_Init_Flags);                  // Initialize CAN module
CANSetOperationMode(_CAN_MODE_CONFIG,0xFF);               // set CONFIGURATION mode
CANSetMask(_CAN_MASK_B1,-1,_CAN_CONFIG_XTD_MSG);          // set all mask1 bits to ones
CANSetMask(_CAN_MASK_B2,-1,_CAN_CONFIG_XTD_MSG);          // set all mask2 bits to ones
CANSetFilter(_CAN_FILTER_B2_F4,ID_cmd,_CAN_CONFIG_XTD_MSG);// set id of filter B2_F4 to 2nd node ID

CANSetOperationMode(_CAN_MODE_NORMAL,0xFF);               // set NORMAL mode


while(1) {                                                               // endless loop
    Msg_Rcvd = CANRead(&Rx_ID , RxTx_Data , &Rx_Data_Len, &Can_Rcv_Flags); // receive message
    if ((Rx_ID == ID_cmd) && Msg_Rcvd) {                                   // if message received check id
        PORTC.F3=!PORTC.F3;
    }
}



}

任何帮助将不胜感激,谢谢。

4

1 回答 1

2

又是我,它起作用了,节点必须具有相同的振荡器值(在我的情况下:20MHz 晶体)。

于 2018-01-21T20:08:36.407 回答