Hi,
I'm working on a receive only CAN application that reads data from a sensor but am not able to receive anything so far.
The setup
I have a tilt sensor attached to my uC CAN module (PTB18 & PTB19) that continuously sends out frames at 250kbit/s. I have a CAN analyzer connected with which I can see the frames on the bus.
The plan is to use Kinetis to read these frames for further processing.
I planned to retrieve data with FLEXCAN_TransferReceiveNonBlocking but realized that statusis constantly set to kStatus_FLEXCAN_RxBusy even with the sensor disconnected.
A call to FLEXCAN_TransferHandleIRQ(EXAMPLE_CAN, &flexcanHandle); will invoke the callback with status set to kStatus_FLEXCAN_UnHandled.
mbState of the mailbox is set to 1 (kFLEXCAN_StateRxData).
The callback never is invoked with status = kStatus_FLEXCAN_RxIdle
Code:
globals:
#define EXAMPLE_CAN CAN0
#define EXAMPLE_CAN_CLK_SOURCE (kFLEXCAN_ClkSrc1)
#define EXAMPLE_CAN_CLK_FREQ CLOCK_GetFreq(kCLOCK_BusClk)
#define RX_MESSAGE_BUFFER_NUM (9)
#define DLC (8)
#define SET_CAN_QUANTUM (0)
#define PSEG1 (3)
#define PSEG2 (2)
#define PROPSEG (1)
#define LOG_INFO (void)PRINTF
volatile bool rxComplete = false;
flexcan_frame_t rxFrame;
flexcan_mb_transfer_t rxXfer;
flexcan_handle_t flexcanHandle;
CAN setup:
FLEXCAN_GetDefaultConfig(&flexcanConfig);
#if defined(EXAMPLE_CAN_CLK_SOURCE)
flexcanConfig.clksrc=EXAMPLE_CAN_CLK_SOURCE;
#endif
flexcanConfig.enableListenOnlyMode = true;
flexcanConfig.baudRate = 250000U;
//flexcanConfig.enableLoopBack = true;
FLEXCAN_Init(EXAMPLE_CAN, &flexcanConfig, EXAMPLE_CAN_CLK_FREQ);
/* Create FlexCAN handle structure and set call back function. */
FLEXCAN_TransferCreateHandle(EXAMPLE_CAN, &flexcanHandle, flexcan_callback, NULL);
/* Setup Rx Message Buffer. */
mbConfig.format = kFLEXCAN_FrameFormatStandard;
mbConfig.type = kFLEXCAN_FrameTypeData;
mbConfig.id = FLEXCAN_ID_STD(0x10FF53C2);
FLEXCAN_SetRxMbConfig(EXAMPLE_CAN, RX_MESSAGE_BUFFER_NUM, &mbConfig, true);
/* Start receive data through Rx Message Buffer. */
rxXfer.mbIdx = (uint8_t)RX_MESSAGE_BUFFER_NUM;
rxXfer.frame = &rxFrame;
the callback:
static void flexcan_callback(CAN_Type *base, flexcan_handle_t *handle, status_t status, uint32_t result, void *userData)
{
switch (status)
{
/* Process FlexCAN Rx event. */
case kStatus_FLEXCAN_RxIdle:
if (RX_MESSAGE_BUFFER_NUM == result) {
rxComplete = true;
}
LOG_INFO("kStatus_FLEXCAN_RxIdle\r\n");
break;
case kStatus_FLEXCAN_UnHandled:
LOG_INFO("kStatus_FLEXCAN_UnHandled\r\n");
break;
default:
LOG_INFO("in flexcan_cb, status 0x%x(%d)\r\n",status,status);
}
}
receiving loop:
while (!rxComplete) {
(void)FLEXCAN_TransferReceiveNonBlocking(EXAMPLE_CAN, &flexcanHandle, &rxXfer);
FLEXCAN_TransferHandleIRQ(EXAMPLE_CAN, &flexcanHandle);
}
I also did attach flexcan_test.c that contains the above code.