<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Kinetis Software Development Kit中的主题 Re: kinetis k10 flexcan FIFO usage</title>
    <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/kinetis-k10-flexcan-FIFO-usage/m-p/547889#M5618</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;I have exactly same questions. Is there anyone can give answer. Previously there was such a interrupt function&lt;/P&gt;&lt;P&gt;void ComCAN_OnFullRxBuffer(LDD_TUserData *UserDataPtr, LDD_CAN_TMBIndex BufferIdx)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp; /* Write your code here ... */&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;handleRxBuffer(BufferIdx);&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;and since I knew the bufferID, I was getting frame with the function below&lt;BR /&gt;ComCAN_ReadFrame(canPtr, BufferIdx, &amp;amp;(canMsgList[bufferID].frame));&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Now, how can I know which message buffer has new message.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Okan,&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Fri, 16 Sep 2016 13:06:40 GMT</pubDate>
    <dc:creator>okaner</dc:creator>
    <dc:date>2016-09-16T13:06:40Z</dc:date>
    <item>
      <title>kinetis k10 flexcan FIFO usage</title>
      <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/kinetis-k10-flexcan-FIFO-usage/m-p/547888#M5617</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;BR /&gt;hello, i'm using KSDK 1.3 on MK10DX256VLQ10 microcontroller.&lt;/P&gt;&lt;P&gt;i'd like to have some clarifications on the usage of flexcan RX fifo.&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;here's my setup code:&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE class="c++" name="code"&gt; /*number of can 2 rx fifo filters id*/ #define CAN_2_RX_FIFO_ID_FILTER_NUM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; kFlexCanRxFifoIDFilters_8&amp;nbsp;&amp;nbsp;&amp;nbsp; /*number of elements of can 2 rx fifo filters id array*/ #define CAN_2_RX_FIFO_ID_FILTER_ARRAY_SIZE&amp;nbsp; (CAN_2_RX_FIFO_ID_FILTER_NUM + 1) * 8&amp;nbsp;&amp;nbsp; static flexcan_user_config_t can_2_config = { &amp;nbsp; 16, &amp;nbsp; CAN_2_RX_FIFO_ID_FILTER_NUM, &amp;nbsp; true, &amp;nbsp; kFlexCanNormalMode };&amp;nbsp;&amp;nbsp; static flexcan_state_t can_2_state; static flexcan_msgbuff_t can_2_fifo; static flexcan_id_table_t can_2_fifo_id_table; static uint32_t can_2_rx_fifo_id[CAN_2_RX_FIFO_ID_FILTER_ARRAY_SIZE];&amp;nbsp;&amp;nbsp; static uint32_t can_2_rx_msg_ids[] = /*MUST be smaller than can_2_rx_fifo_id array*/ { &amp;nbsp;&amp;nbsp;&amp;nbsp; CAN_2_MSG_ID_1, &amp;nbsp;&amp;nbsp;&amp;nbsp; CAN_2_MSG_ID_2, &amp;nbsp;&amp;nbsp;&amp;nbsp; CAN_2_MSG_ID_3, &amp;nbsp;&amp;nbsp;&amp;nbsp; CAN_2_MSG_ID_4, &amp;nbsp;&amp;nbsp;&amp;nbsp; CAN_2_MSG_ID_5, &amp;nbsp;&amp;nbsp;&amp;nbsp; CAN_2_MSG_ID_6 };&amp;nbsp;&amp;nbsp; void CAN_Init() { &amp;nbsp;&amp;nbsp;&amp;nbsp; configure_flexcan_pins(CAN_2_INSTANCE);&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FLEXCAN_DRV_Init(CAN_2_INSTANCE, &amp;amp;can_2_state, &amp;amp;can_2_config);&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FLEXCAN_DRV_SetBitrate(CAN_2_INSTANCE, &amp;amp;can_bit_rate_500kbs_50Mhz); /* 500kbs */&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FLEXCAN_DRV_SetRxMaskType(CAN_2_INSTANCE, kFlexCanRxMaskGlobal);&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FLEXCAN_DRV_SetRxFifoGlobalMask(CAN_2_INSTANCE, kFlexCanMsgIdStd, 0x7FF);&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; /*initialize can 2 fifo*/ &amp;nbsp;&amp;nbsp;&amp;nbsp; can_2_fifo_id_table.isExtendedFrame = false; &amp;nbsp;&amp;nbsp;&amp;nbsp; can_2_fifo_id_table.isRemoteFrame = false; &amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0; i&amp;lt; NUM_ELEMS(can_2_rx_msg_ids) ;i++) &amp;nbsp;&amp;nbsp;&amp;nbsp; { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; can_2_rx_fifo_id[i] = can_2_rx_msg_ids[i]; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; can_2_fifo_id_table.idFilter = can_2_rx_fifo_id; &amp;nbsp;&amp;nbsp;&amp;nbsp; FLEXCAN_DRV_ConfigRxFifo(CAN_2_INSTANCE, kFlexCanRxFifoIdElementFormatA, &amp;amp;can_2_fifo_id_table); }&amp;nbsp;&amp;nbsp; void CAN_Receive() { &amp;nbsp;&amp;nbsp;&amp;nbsp; if(FLEXCAN_DRV_GetReceiveStatus(CAN_2_INSTANCE) == kStatus_FLEXCAN_Success) &amp;nbsp;&amp;nbsp;&amp;nbsp; { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FLEXCAN_DRV_RxFifo(CAN_2_INSTANCE, &amp;amp;can_2_fifo);&amp;nbsp; &amp;nbsp; /* process message here...*/ &amp;nbsp;&amp;nbsp;&amp;nbsp; } }&amp;nbsp;&amp;nbsp; void CAN_Task() {&amp;nbsp; &amp;nbsp; CAN_Init(); &amp;nbsp;&amp;nbsp;&amp;nbsp; /*trigger MSG reception*/ &amp;nbsp;&amp;nbsp;&amp;nbsp; FLEXCAN_DRV_RxFifo(CAN_2_INSTANCE, &amp;amp;can_2_fifo); &amp;nbsp;&amp;nbsp;&amp;nbsp; for (;;) &amp;nbsp;&amp;nbsp;&amp;nbsp; { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CAN_Receive(); &amp;nbsp;&amp;nbsp;&amp;nbsp; } }&amp;nbsp;&amp;nbsp; /* Implementation of CAN0 handler named in startup code. */ void CAN1_ORed_Message_buffer_IRQHandler(void) { &amp;nbsp;&amp;nbsp;&amp;nbsp; FLEXCAN_DRV_IRQHandler(1); }&lt;/PRE&gt;&lt;DIV style="display:none;"&gt; &lt;/DIV&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;i'm using freeRTOS and the CAN_Task() has a 10ms periodicity.&lt;/P&gt;&lt;P&gt;here's what i'm trying to achieve:&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;Setup RX FIFO filters on order to trigger reception only on msg ID's listed inside can_2_rx_msg_ids[] array&lt;/LI&gt;&lt;LI&gt;When the task gets scheduled, empty the FIFO and process ALL the arrived messages&lt;/LI&gt;&lt;LI&gt;Setup an interrupt that notifies me when the FIFO is almost full and needs to be emptied (just in case the task is not fast enough to empty the FIFO when it's scheduled&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;i successfully got the &lt;STRONG&gt;&lt;EM&gt;CAN1_ORed_Message_buffer_IRQHandler&lt;/EM&gt; &lt;/STRONG&gt;interrupt to be called and i saw that when the task runs, it passed the check &lt;EM&gt;&lt;STRONG&gt;FLEXCAN_DRV_GetReceiveStatus == kStatus_FLEXCAN_Success&lt;/STRONG&gt;&lt;/EM&gt; and &lt;EM&gt;&lt;STRONG&gt;FLEXCAN_DRV_RxFifo&lt;/STRONG&gt; &lt;/EM&gt;returns me the msg received which i'm able to process.&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;here's some questions and doubts:&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;Is &lt;STRONG&gt;&lt;EM&gt;CAN_Init()&lt;/EM&gt;&lt;/STRONG&gt; function correctly implemented considering the above requirements?&lt;/LI&gt;&lt;LI&gt;How do i empty the FIFO? i saw that&amp;nbsp; a call to the &lt;EM&gt;&lt;STRONG&gt;FLEXCAN_DRV_RxFifo&lt;/STRONG&gt;&lt;/EM&gt; function fills the &lt;STRONG&gt;&lt;EM&gt;can_2_fifo&lt;/EM&gt;&lt;/STRONG&gt;&lt;EM&gt; &lt;/EM&gt;with the received message. but what happens if there are two or more messages to be processed? shall i iterate over &lt;EM&gt;&lt;STRONG&gt;FLEXCAN_DRV_RxFifo?&lt;/STRONG&gt;&lt;/EM&gt;&lt;/LI&gt;&lt;LI&gt;Any suggestion on how to know how many messages are stored in the FIFO?&lt;/LI&gt;&lt;LI&gt;Do you see any potential problem in the approach i used? (it's based on the examples i found inside KSDK)&lt;/LI&gt;&lt;/OL&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you so much for your support, feel free to point me to any other discussions in the forum or to useful documentation.&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Simone&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 28 Jul 2016 08:45:50 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/kinetis-k10-flexcan-FIFO-usage/m-p/547888#M5617</guid>
      <dc:creator>simonebonetti</dc:creator>
      <dc:date>2016-07-28T08:45:50Z</dc:date>
    </item>
    <item>
      <title>Re: kinetis k10 flexcan FIFO usage</title>
      <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/kinetis-k10-flexcan-FIFO-usage/m-p/547889#M5618</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;I have exactly same questions. Is there anyone can give answer. Previously there was such a interrupt function&lt;/P&gt;&lt;P&gt;void ComCAN_OnFullRxBuffer(LDD_TUserData *UserDataPtr, LDD_CAN_TMBIndex BufferIdx)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp; /* Write your code here ... */&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;handleRxBuffer(BufferIdx);&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;and since I knew the bufferID, I was getting frame with the function below&lt;BR /&gt;ComCAN_ReadFrame(canPtr, BufferIdx, &amp;amp;(canMsgList[bufferID].frame));&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Now, how can I know which message buffer has new message.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Okan,&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 16 Sep 2016 13:06:40 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/kinetis-k10-flexcan-FIFO-usage/m-p/547889#M5618</guid>
      <dc:creator>okaner</dc:creator>
      <dc:date>2016-09-16T13:06:40Z</dc:date>
    </item>
  </channel>
</rss>

