CAN Code with Non Blocking Functionality

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

CAN Code with Non Blocking Functionality

1,026件の閲覧回数
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 返答(返信)

888件の閲覧回数
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,021件の閲覧回数
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,016件の閲覧回数
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 件の賞賛
返信

980件の閲覧回数
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 件の賞賛
返信