S32K144 & S32K146 CAN rx fifo

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

S32K144 & S32K146 CAN rx fifo

1,520 Views
edt102983
Contributor I

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?

0 Kudos
1 Reply

1,485 Views
Senlent
NXP TechSupport
NXP TechSupport

Hi@edt102983

         I checked your code and found that the possible problem is caused by the following reasons/

Senlent_1-1625621430236.png

 

Senlent_2-1625621430247.png

You can modify these codes first, and please let me know if there are any problems.

BR,Jim

 

0 Kudos