Hi, I have a project to make two boards communicate in CAN which using S32K144 & S32K146, and the following is my CAN config and driver.
////////////config
extension_flexcan_rx_fifo_t can_fifo_ext0 = {
.numIdFilters = FLEXCAN_RX_FIFO_ID_FILTERS_8,
.idFormat = FLEXCAN_RX_FIFO_ID_FORMAT_A,
.idFilterTable = NULL
};
can_instance_t can_pal1_instance = {
.instType = CAN_INST_TYPE_FLEXCAN,
.instIdx = 1UL
};
can_user_config_t can_pal1_config = {
.maxBuffNum = 16UL,
.mode = CAN_NORMAL_MODE,
.peClksrc=CAN_CLK_SOURCE_OSC,
.enableFD = false,
.payloadSize = CAN_PAYLOAD_SIZE_8,
.nominalBitrate = {
.propSeg = 7UL,
.phaseSeg1 = 4UL,
.phaseSeg2 = 1UL,
.preDivider = 1UL,
.rJumpwidth = 1UL
},
.dataBitrate = {
.propSeg = 7UL,
.phaseSeg1 = 4UL,
.phaseSeg2 = 1UL,
.preDivider = 1UL,
.rJumpwidth = 1UL
},
.extension = &can_fifo_ext0
};
///////driver
#include "sdk_project_config.h"
#include "printf.h"
#include "status.h"
#include "can.h"
#include "ccan.h"
#include <stdbool.h>
#include <string.h>
#include <interrupt_manager.h>
#include <peripherals_can_pal_1.h>
#define TX_TIMEOUT 0U
#define RX_TIMEOUT 100U
#define DataLength 8
#define IdLength 4U
#define RX_MB 2
#define TX_MB 6
#define NUMBER_OF_ID 1
can_buff_config_t MesgBuffCfg_1 = {
.enableFD = true,
.enableBRS = true,
.fdPadding = 8U,
.idType = CAN_MSG_ID_EXT,
.isRemote = false};
can_message_t rx_message_1 = {
.cs = 0U,
.length = 8};
uint32_t mask1 = 0x0;
int can1_tx(CAN_FRAME* can_tx)
{
//uint8_t i;
int rtn;
can_message_t tx_message_1 = {
.cs = 0U,
.id = can_tx->id,
.data[0] = can_tx->data[0],
.data[1] = can_tx->data[1],
.data[2] = can_tx->data[2],
.data[3] = can_tx->data[3],
.data[4] = can_tx->data[4],
.data[5] = can_tx->data[5],
.data[6] = can_tx->data[6],
.data[7] = can_tx->data[7],
.length = 8};
CAN_ConfigTxBuff(&can_pal1_instance, TX_MB, &MesgBuffCfg_1);
rtn=CAN_SendBlocking(&can_pal1_instance, TX_MB, &tx_message_1,TX_TIMEOUT);
#if 0 //Print TX CAN data
if (rtn==0){
printf("CAN1_TX success ID=0x%x Data=[",tx_message_1.id);
for(i=0; i<8; i++ ){
printf("0x%x ",tx_message_1.data[i]);
}
printf("]\n");
}
else printf("CAN1_TX error.\n");
#endif
return rtn;
}
static int can1_rx(void)
{
uint8_t i;
int rtn;
rtn=CAN_ReceiveBlocking(&can_pal1_instance, RX_MB, &rx_message_1, RX_TIMEOUT);
#if 1 //Print RX CAN data
if (rtn==0){
printf("CAN1_RX success ID=0x%x Data=[",rx_message_1.id);
for(i=0; i<8; i++ ){
printf("0x%x ",rx_message_1.data[i]);
}
printf("]\n");
}
else printf("CAN1_RX error. rtn=%d\n",rtn);
#endif
return rtn;
}
void can1_callback( uint32_t instance,
can_event_t eventType,
uint32_t objIdx,
void *driverState )
{
( void )instance;
( void )objIdx;
( void )driverState;
switch( ( int )eventType ) {
case CAN_EVENT_RX_COMPLETE:
{
CAN_FRAME can_rx= {
.id=rx_message_1.id,
.data[0]=rx_message_1.data[0],
.data[1]=rx_message_1.data[1],
.data[2]=rx_message_1.data[2],
.data[3]=rx_message_1.data[3],
.data[4]=rx_message_1.data[4],
.data[5]=rx_message_1.data[5],
.data[6]=rx_message_1.data[6],
.data[7]=rx_message_1.data[7],
};
DEV_CCAN.interface[ CCAN_INTERFACE_CAN1 ].dev_up_stream( &can_rx );
}
break;
case CAN_EVENT_TX_COMPLETE:
break;
}
}
unsigned int can1_init( unsigned int param1, unsigned int param2 )
{
( void )param1;
( void )param2;
int a;
int b;
uint32_t ID= 0x0;
flexcan_id_table_t filterTable;
filterTable.isRemoteFrame = false;
filterTable.isExtendedFrame = true;
filterTable.id = ID;
can_fifo_ext0.idFilterTable = &filterTable;
a=CAN_Init(&can_pal1_instance, &can_pal1_config);
b=CAN_InstallEventCallback(&can_pal1_instance, can1_callback, NULL);
CAN_SetRxFilter(&can_pal1_instance, CAN_MSG_ID_EXT, RX_MB, ID);
if(a!=0){
printf("CAN1 init fail.");
}
if(b!=0){
printf("callback1 install fail");
}
return 0;
}
unsigned int can1_main( unsigned int param1, unsigned int param2 )
{
( void )param1;
( void )param2;
can1_rx();
return 0;
}
/////////////////////////////
it's weird that the RX FIFO can be use on 144 but not 146, I have sure the hardware having no prob because I can use CAN_ConfigRxBuff to receive on 146 board, does it have anything special to config RX FIFO on 146?
I checked your code and found that the possible problem is caused by the following reasons/
You can modify these codes first, and please let me know if there are any problems.
BR,Jim