<?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のトピックProblem in FreeRTOS I2C driver for KW4x microcontroller</title>
    <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/Problem-in-FreeRTOS-I2C-driver-for-KW4x-microcontroller/m-p/633561#M6777</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello All,&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I am working on KW41 microcontroller and using KDS for development. I have to do i2c communication, for that I am using FreeRTOS library. I am calling &lt;STRONG&gt;I2C_RTOS_Transfer&lt;/STRONG&gt; to read a register in my I2C device. Please have a look on below defination of &lt;STRONG&gt;I2C_RTOS_Transfer&lt;/STRONG&gt; :&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #008000;"&gt;status_t I2C_RTOS_Transfer(i2c_rtos_handle_t *handle, i2c_master_transfer_t *transfer)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; status_t status;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Lock resource mutex */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (xSemaphoreTake(handle-&amp;gt;mutex, portMAX_DELAY) != pdTRUE)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return kStatus_I2C_Busy;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; status = I2C_MasterTransferNonBlocking(handle-&amp;gt;base, &amp;amp;handle-&amp;gt;drv_handle, transfer);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (status != kStatus_Success)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xSemaphoreGive(handle-&amp;gt;mutex);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return status;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Wait for transfer to finish */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: #ff0000;"&gt;xSemaphoreTake(handle-&amp;gt;sem, portMAX_DELAY);&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Unlock resource mutex */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xSemaphoreGive(handle-&amp;gt;mutex);&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Return status captured by callback function */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return handle-&amp;gt;async_status;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;}&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #000000;"&gt;This program is hanging while executing the &lt;STRONG&gt;xSemaphoreTake&lt;/STRONG&gt; command highlighted with red color.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #000000;"&gt;while looking in code with debugger, the program is going to hang while executing &lt;STRONG&gt;portYIELD_WITHIN_API();&lt;/STRONG&gt; in queue.h library.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #000000;"&gt;Can somebody help me to resolve this problem.&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #000000;"&gt;Thanks,&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #000000;"&gt;Saurabh&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Tue, 14 Feb 2017 13:07:00 GMT</pubDate>
    <dc:creator>saurabhbansal</dc:creator>
    <dc:date>2017-02-14T13:07:00Z</dc:date>
    <item>
      <title>Problem in FreeRTOS I2C driver for KW4x microcontroller</title>
      <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/Problem-in-FreeRTOS-I2C-driver-for-KW4x-microcontroller/m-p/633561#M6777</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello All,&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I am working on KW41 microcontroller and using KDS for development. I have to do i2c communication, for that I am using FreeRTOS library. I am calling &lt;STRONG&gt;I2C_RTOS_Transfer&lt;/STRONG&gt; to read a register in my I2C device. Please have a look on below defination of &lt;STRONG&gt;I2C_RTOS_Transfer&lt;/STRONG&gt; :&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #008000;"&gt;status_t I2C_RTOS_Transfer(i2c_rtos_handle_t *handle, i2c_master_transfer_t *transfer)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; status_t status;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Lock resource mutex */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (xSemaphoreTake(handle-&amp;gt;mutex, portMAX_DELAY) != pdTRUE)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return kStatus_I2C_Busy;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; status = I2C_MasterTransferNonBlocking(handle-&amp;gt;base, &amp;amp;handle-&amp;gt;drv_handle, transfer);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (status != kStatus_Success)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xSemaphoreGive(handle-&amp;gt;mutex);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return status;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Wait for transfer to finish */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: #ff0000;"&gt;xSemaphoreTake(handle-&amp;gt;sem, portMAX_DELAY);&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Unlock resource mutex */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xSemaphoreGive(handle-&amp;gt;mutex);&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Return status captured by callback function */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return handle-&amp;gt;async_status;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="color: #008000;"&gt;}&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #000000;"&gt;This program is hanging while executing the &lt;STRONG&gt;xSemaphoreTake&lt;/STRONG&gt; command highlighted with red color.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #000000;"&gt;while looking in code with debugger, the program is going to hang while executing &lt;STRONG&gt;portYIELD_WITHIN_API();&lt;/STRONG&gt; in queue.h library.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #000000;"&gt;Can somebody help me to resolve this problem.&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #000000;"&gt;Thanks,&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #000000;"&gt;Saurabh&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 14 Feb 2017 13:07:00 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/Problem-in-FreeRTOS-I2C-driver-for-KW4x-microcontroller/m-p/633561#M6777</guid>
      <dc:creator>saurabhbansal</dc:creator>
      <dc:date>2017-02-14T13:07:00Z</dc:date>
    </item>
    <item>
      <title>Re: Problem in FreeRTOS I2C driver for KW4x microcontroller</title>
      <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/Problem-in-FreeRTOS-I2C-driver-for-KW4x-microcontroller/m-p/633562#M6778</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;First, it is generally not good practice to wait indefinitely using portMAX_DELAY, but instead to use a timeout that is just a little longer than the maximum time you would expect to have to wait. &amp;nbsp;That way if the block time expires you know something has gone wrong and you have the opportunity to diagnose and correct the issue. &amp;nbsp;If something goes wrong while you are blocked indefinitely then the blocked task will just hang where it is forever.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Second in most cases it is desirable to use a direct to task notification in place of a semaphore. &amp;nbsp;See the code snippet on the following page for an example:&amp;nbsp;&lt;A class="link-titled" href="http://www.freertos.org/vTaskNotifyGiveFromISR.html" title="http://www.freertos.org/vTaskNotifyGiveFromISR.html"&gt;vTaskNotifyGiveFromISR() RTOS task notification API documentation&lt;/A&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Then to your question - why is the task hanging in the xSemaphoreTake() call: &amp;nbsp;First you have to determine which end is the causing the problem, giving the semaphore or taking the semaphores. &amp;nbsp;If the call to xSemaphoreTake() never completes my first assumption would be that nothing is giving the semaphore. &amp;nbsp;Can you verify that the corresponding call to xSemaphoreGive() (or the ISR equivalent) is completing.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 14 Feb 2017 15:33:48 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/Problem-in-FreeRTOS-I2C-driver-for-KW4x-microcontroller/m-p/633562#M6778</guid>
      <dc:creator>FreeRTOS_org</dc:creator>
      <dc:date>2017-02-14T15:33:48Z</dc:date>
    </item>
    <item>
      <title>Re: Problem in FreeRTOS I2C driver for KW4x microcontroller</title>
      <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/Problem-in-FreeRTOS-I2C-driver-for-KW4x-microcontroller/m-p/633563#M6779</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi, Saurabh,&lt;/P&gt;&lt;P&gt;For the serial bus example based on FreeRTOS platform, for example uart, spi, iic even can, this is the architecture:&lt;/P&gt;&lt;P&gt;the serial bus uses interrupt mode to transfer data, and the example transfer one block of data(the size of block data can be programmed). In the ISR, we have code to check if the predefined number of block of data has been transferred completely, if the block of data has been transferred completely, a callback functiion is called. In the callback function, the so-called &lt;SPAN style="color: #008000;"&gt; xSemaphoreGive&lt;/SPAN&gt;() is posted so that the task which has the code &lt;SPAN style="color: #008000;"&gt;I2C_RTOS_Transfer&lt;/SPAN&gt;() can be unblocked.&lt;/P&gt;&lt;P&gt;Hope it can help you&lt;/P&gt;&lt;P&gt;BR&lt;/P&gt;&lt;P&gt;Xiangjun Rong&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Feb 2017 09:13:30 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/Problem-in-FreeRTOS-I2C-driver-for-KW4x-microcontroller/m-p/633563#M6779</guid>
      <dc:creator>xiangjun_rong</dc:creator>
      <dc:date>2017-02-15T09:13:30Z</dc:date>
    </item>
    <item>
      <title>Re: Problem in FreeRTOS I2C driver for KW4x microcontroller</title>
      <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/Problem-in-FreeRTOS-I2C-driver-for-KW4x-microcontroller/m-p/633564#M6780</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi &lt;SPAN style="color: #000000;"&gt;Saurabh &amp;amp; &lt;/SPAN&gt;Xiangjun Rong&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I think&amp;nbsp;every RTOS-Driver&amp;nbsp;for&amp;nbsp;hardware should have&amp;nbsp;a separate timeout for getting the hardware (mutex) and for end of Transfer (sem). ...&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I reworked the I2C driver as follows:&lt;/P&gt;&lt;P&gt;"fsl_i2c_freertos.h"&lt;/P&gt;&lt;PRE class="language-c line-numbers"&gt;&lt;CODE&gt;&lt;SPAN class="comment token"&gt;/*! @brief I2C FreeRTOS handle */&lt;/SPAN&gt;
&lt;SPAN class="keyword token"&gt;typedef&lt;/SPAN&gt; &lt;SPAN class="keyword token"&gt;struct&lt;/SPAN&gt; _i2c_rtos_handle
&lt;SPAN class="punctuation token"&gt;{&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C_Type &lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;base&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="comment token"&gt;/*!&amp;lt; I2C base address */&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; i2c_master_handle_t drv_handle&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt; &lt;SPAN class="comment token"&gt;/*!&amp;lt; Handle of the underlying driver, treated as opaque by the RTOS layer */&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; status_t async_status&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SemaphoreHandle_t mutex&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt; &lt;SPAN class="comment token"&gt;/*!&amp;lt; Mutex to lock the handle during a trasfer */&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; TickType_t xTicsToWaitForMutex&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt; &lt;SPAN class="comment token"&gt;// by MS --&amp;gt; timeout for getting the hardware&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SemaphoreHandle_t sem&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;SPAN class="comment token"&gt;/*!&amp;lt; Semaphore to notify and unblock task when transfer ends */&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; TickType_t xTicsToWaitForSem&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt; &lt;SPAN class="comment token"&gt;// by MS --&amp;gt; timeout for device response&lt;/SPAN&gt;
&lt;SPAN class="punctuation token"&gt;}&lt;/SPAN&gt; i2c_rtos_handle_t&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;"fsl_i2c_freertos.c"&lt;/P&gt;&lt;PRE class="language-c line-numbers"&gt;&lt;CODE&gt;status_t &lt;SPAN class="token function"&gt;I2C_RTOS_Transfer&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;i2c_rtos_handle_t &lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;handle&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; i2c_master_transfer_t &lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;transfer&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;
&lt;SPAN class="punctuation token"&gt;{&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; status_t status&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="comment token"&gt;/* Lock resource mutex */&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;if&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;xSemaphoreTake&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;handle&lt;SPAN class="operator token"&gt;-&amp;gt;&lt;/SPAN&gt;mutex&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; handle&lt;SPAN class="operator token"&gt;-&amp;gt;&lt;/SPAN&gt;xTicsToWaitForMutex&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;!=&lt;/SPAN&gt; pdTRUE&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="punctuation token"&gt;{&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;return&lt;/SPAN&gt; kStatus_I2C_Busy&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="punctuation token"&gt;}&lt;/SPAN&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; status &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;I2C_MasterTransferNonBlocking&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;handle&lt;SPAN class="operator token"&gt;-&amp;gt;&lt;/SPAN&gt;base&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;&amp;amp;&lt;/SPAN&gt;handle&lt;SPAN class="operator token"&gt;-&amp;gt;&lt;/SPAN&gt;drv_handle&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; transfer&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;if&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;status &lt;SPAN class="operator token"&gt;!=&lt;/SPAN&gt; kStatus_Success&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="punctuation token"&gt;{&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="token function"&gt;xSemaphoreGive&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;handle&lt;SPAN class="operator token"&gt;-&amp;gt;&lt;/SPAN&gt;mutex&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;return&lt;/SPAN&gt; status&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="punctuation token"&gt;}&lt;/SPAN&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="comment token"&gt;/* Wait for transfer to finish */&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;if&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;xSemaphoreTake&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;handle&lt;SPAN class="operator token"&gt;-&amp;gt;&lt;/SPAN&gt;sem&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; handle&lt;SPAN class="operator token"&gt;-&amp;gt;&lt;/SPAN&gt;xTicsToWaitForSem&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;!=&lt;/SPAN&gt; pdTRUE&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="punctuation token"&gt;{&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="comment token"&gt;/* Unlock resource mutex */&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="token function"&gt;xSemaphoreGive&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;handle&lt;SPAN class="operator token"&gt;-&amp;gt;&lt;/SPAN&gt;mutex&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;return&lt;/SPAN&gt; kStatus_I2C_Timeout&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="punctuation token"&gt;}&lt;/SPAN&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="comment token"&gt;/* Unlock resource mutex */&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="token function"&gt;xSemaphoreGive&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;handle&lt;SPAN class="operator token"&gt;-&amp;gt;&lt;/SPAN&gt;mutex&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="comment token"&gt;/* Return status captured by callback function */&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;return&lt;/SPAN&gt; handle&lt;SPAN class="operator token"&gt;-&amp;gt;&lt;/SPAN&gt;async_status&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="punctuation token"&gt;}&lt;/SPAN&gt;
&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best regards&lt;/P&gt;&lt;P&gt;Manfred&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 16 Feb 2017 12:20:49 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/Problem-in-FreeRTOS-I2C-driver-for-KW4x-microcontroller/m-p/633564#M6780</guid>
      <dc:creator>manfredschnell</dc:creator>
      <dc:date>2017-02-16T12:20:49Z</dc:date>
    </item>
    <item>
      <title>Re: Problem in FreeRTOS I2C driver for KW4x microcontroller</title>
      <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/Problem-in-FreeRTOS-I2C-driver-for-KW4x-microcontroller/m-p/633565#M6781</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thanks for your help. I was able to resolve this issue.&lt;/P&gt;&lt;P&gt;It was because of 2 problems:&lt;/P&gt;&lt;P&gt;1.&amp;nbsp;&amp;nbsp; Debugger was showing different places for hanging each time(I am using J-Link for this).&lt;/P&gt;&lt;P&gt;2.&amp;nbsp;&amp;nbsp; There was wrong clock initialisation, because I was porting the code from other microcontroller, but clock part was left same by mistake.&lt;/P&gt;&lt;P&gt;@Xiangjun Rong thanks for clarifying the point of clearing the semaphore in callback.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 16 Feb 2017 13:33:26 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/Problem-in-FreeRTOS-I2C-driver-for-KW4x-microcontroller/m-p/633565#M6781</guid>
      <dc:creator>saurabhbansal</dc:creator>
      <dc:date>2017-02-16T13:33:26Z</dc:date>
    </item>
  </channel>
</rss>

