CAN Code with Non Blocking Functionality

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

CAN Code with Non Blocking Functionality

1,717 次查看
Dilip1441
Contributor I

Hi,

I'm Using can_pal_s32k144 Example Code.

In that code if i didn't receive any message from other end, The Code is blocked at

/* Wait until the previous FlexCAN receive is completed */
while(CAN_GetTransferStatus(INST_CAN_PAL1, RX_MAILBOX) == STATUS_BUSY);

Can you please Suggest to Achieve the Both Cases

1.When ever the CAN Msg Received it need to have the Capable of Reading without any issue.

2.When ever the CAN Msg didn't Received, It'll move forward for the next Functionalities without blocking at CAN_GetTransferStatus

 

 

Thank you

0 项奖励
回复
4 回复数

1,579 次查看
Dilip1441
Contributor I

Hi,

 

In below function RX_MSG_ID indicates only one particular CAN Message ID to Receive.

Ex: RX_MSG_ID = 7; it'll receive CAN Message ID 7 only, If send Message ID 6,5,8 It won't receive.

 

/* Configure RX buffer with index RX_MAILBOX */
CAN_ConfigRxBuff(INST_CAN_PAL1, RX_MAILBOX, &buffCfg, RX_MSG_ID);

 

 

Can you please suggest me to receive all messages which i sent from other end.

 

and what is TX_MAILBOX and RX_MAILBOX?

0 项奖励
回复

1,712 次查看
PetrS
NXP TechSupport
NXP TechSupport

Hi,

instead of while statement use if condition

if(CAN_GetTransferStatus(INST_CAN_PAL1, RX_MAILBOX) != STATUS_BUSY)
{
     // read data from receive buffer
     // call Receive function again
}

BR, Petr

0 项奖励
回复

1,707 次查看
Dilip1441
Contributor I

Hi,
Thanks for the Reply.

Currently the code is for Rx is like below.

while(1)

{

   CAN_Receive(INST_CAN_PAL1, RX_MAILBOX, &recvMsg);

   /* Wait until the previous FlexCAN receive is completed */
   while(CAN_GetTransferStatus(INST_CAN_PAL1, RX_MAILBOX) == STATUS_BUSY);//If no message received it's blocking on Here

   /* Check the received message ID and payload */
   if((recvMsg.data[0] == LED0_CHANGE_REQUESTED) &&
   recvMsg.id == RX_MSG_ID)
   {
          /* Toggle output value LED1 */
          PINS_DRV_TogglePins(GPIO_PORT, (1 << LED0));

   }

}

If i removed the while condition, The LED Toggling is not working

also if i changed the code like below also the Toggling is not working.

 

CAN_Receive(INST_CAN_PAL1, RX_MAILBOX, &recvMsg);

if(CAN_GetTransferStatus(INST_CAN_PAL1, RX_MAILBOX) != STATUS_BUSY)
{
     // read data from receive buffer

     CAN_Receive(INST_CAN_PAL1, RX_MAILBOX, &recvMsg);

}

0 项奖励
回复

1,671 次查看
PetrS
NXP TechSupport
NXP TechSupport

Hi,

code should be rather below...

CAN_Receive(INST_CAN_PAL1, RX_MAILBOX, &recvMsg);

while(1)
{

   /* check if FlexCAN receive is completed */
   if(CAN_GetTransferStatus(INST_CAN_PAL1, RX_MAILBOX) != STATUS_BUSY)
   {
        /* Check the received message ID and payload */
        if((recvMsg.data[0] == LED0_CHANGE_REQUESTED) &&recvMsg.id == RX_MSG_ID)
        {
              /* Toggle output value LED1 */
              PINS_DRV_TogglePins(GPIO_PORT, (1 << LED0));

        }
        CAN_Receive(INST_CAN_PAL1, RX_MAILBOX, &recvMsg);
    }

}

BR, Petr

0 项奖励
回复