Saludos a todos los participantes del foro, veo que tienen una excelente información. Estoy iniciando con el BusCan con el dsPIC30F4011, ya tengo los transceiver MCP2551, y trato de hacer una prueba sencilla con dos nodos usando el código de ejemplo que provee el programa MikroC 5.0, pero no he logrado comunicación. El código es el siguiente no se si vean algún detalle que no he considerado. El cristal que uso es de 4MHz.
Nodo 1
unsigned int Can_Init_Flags, Can_Send_Flags, Can_Rcv_Flags; // can flags
unsigned int Rx_Data_Len; // received data length in bytes
char RxTx_Data[8]; // can rx/tx data buffer
char Msg_Rcvd; // reception flag
unsigned long Tx_ID, Rx_ID; // can rx and tx ID
void main() {
ADPCFG = 0xFFFF;
PORTB = 0;
TRISB = 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 CAN2Write
_CAN_TX_NO_RTR_FRAME;
Can_Init_Flags = _CAN_CONFIG_SAMPLE_THRICE & // Form value to be used
_CAN_CONFIG_PHSEG2_PRG_ON & // with CAN2Initialize
_CAN_CONFIG_XTD_MSG &
_CAN_CONFIG_DBL_BUFFER_ON &
_CAN_CONFIG_MATCH_MSG_TYPE &
_CAN_CONFIG_LINE_FILTER_OFF;
RxTx_Data[0] = 9; // set initial data to be sent
CAN2Initialize(1,3,3,3,1,Can_Init_Flags); // initialize CAN2
CAN2SetOperationMode(_CAN_MODE_CONFIG,0xFF); // set CONFIGURATION mode
CAN2SetMask(_CAN_MASK_B1,-1,_CAN_CONFIG_MATCH_MSG_TYPE & _CAN_CONFIG_XTD_MSG); // set all mask1 bits to ones
CAN2SetMask(_CAN_MASK_B2,-1,_CAN_CONFIG_MATCH_MSG_TYPE & _CAN_CONFIG_XTD_MSG); // set all mask2 bits to ones
CAN2SetFilter(_CAN_FILTER_B2_F3,3,_CAN_CONFIG_XTD_MSG); // set id of filter B1_F1 to 3
CAN2SetOperationMode(_CAN_MODE_NORMAL,0xFF); // set NORMAL mode
Tx_ID = 12111; // set transmit ID
CAN2Write(Tx_ID, RxTx_Data, 1, Can_Send_Flags); // send initial message
while(1) { // endless loop
Msg_Rcvd = CAN2Read(&Rx_ID , RxTx_Data , &Rx_Data_Len, &Can_Rcv_Flags); // receive message
if ((Rx_ID == 3u) && Msg_Rcvd) { // if message received check id
PORTB = RxTx_Data[0]; // id correct, output data at PORTB
RxTx_Data[0]++; // increment received data
Delay_ms(10);
CAN2Write(Tx_ID, RxTx_Data, 1, Can_Send_Flags); // send incremented data back
}
}
}
Nodo 2
unsigned int Can_Init_Flags, Can_Send_Flags, Can_Rcv_Flags; // can flags
unsigned int Rx_Data_Len; // received data length in bytes
char RxTx_Data[8]; // can rx/tx data buffer
char Msg_Rcvd; // reception flag
unsigned long Tx_ID, Rx_ID; // can rx and tx ID
void main() {
ADPCFG = 0xFFFF;
PORTB = 0;
TRISB = 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 CAN2Write
_CAN_TX_NO_RTR_FRAME;
Can_Init_Flags = _CAN_CONFIG_SAMPLE_THRICE & // Form value to be used
_CAN_CONFIG_PHSEG2_PRG_ON & // with CAN2Initialize
_CAN_CONFIG_XTD_MSG &
_CAN_CONFIG_DBL_BUFFER_ON &
_CAN_CONFIG_MATCH_MSG_TYPE &
_CAN_CONFIG_LINE_FILTER_OFF;
CAN2Initialize(1,3,3,3,1,Can_Init_Flags); // initialize CAN2
CAN2SetOperationMode(_CAN_MODE_CONFIG,0xFF); // set CONFIGURATION mode
CAN2SetMask(_CAN_MASK_B1,-1,_CAN_CONFIG_MATCH_MSG_TYPE & _CAN_CONFIG_XTD_MSG); // set all mask1 bits to ones
CAN2SetMask(_CAN_MASK_B2,-1,_CAN_CONFIG_MATCH_MSG_TYPE & _CAN_CONFIG_XTD_MSG); // set all mask2 bits to ones
CAN2SetFilter(_CAN_FILTER_B1_F1,12111,_CAN_CONFIG_XTD_MSG); // set id of filter B1_F1 to 12111
CAN2SetOperationMode(_CAN_MODE_NORMAL,0xFF); // set NORMAL mode
Tx_ID = 3; // set tx ID
while(1) { // endless loop
Msg_Rcvd = CAN2Read(&Rx_ID , RxTx_Data , &Rx_Data_Len, &Can_Rcv_Flags); // receive message
if ((Rx_ID == 12111u) && Msg_Rcvd) { // if message received check id
PORTB = RxTx_Data[0]; // id correct, output data at PORTB
RxTx_Data[0]++; // increment received data
CAN2Write(Tx_ID, RxTx_Data, 1, Can_Send_Flags); // send incremented data back
}
}
}