<?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>topic bug in i2c driver for kinetis? in Kinetis Software Development Kit</title>
    <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/bug-in-i2c-driver-for-kinetis/m-p/604941#M6237</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I'm refering to KSDK 2.2 for Kinetis K64&lt;/P&gt;&lt;P&gt;I you try to do an empty transfer the stop condition is never issued.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;the case is:&lt;/P&gt;&lt;PRE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; i2c_master_transfer_t masterXfer;

&amp;nbsp;&amp;nbsp; &amp;nbsp;masterXfer.slaveAddress = I2C_EEPROM_ADDRESS;
&amp;nbsp;&amp;nbsp; &amp;nbsp;masterXfer.direction = kI2C_Write;
&amp;nbsp;&amp;nbsp; &amp;nbsp;masterXfer.subaddress = 0;
&amp;nbsp;&amp;nbsp; &amp;nbsp;masterXfer.subaddressSize = 0;
&amp;nbsp;&amp;nbsp; &amp;nbsp;masterXfer.data = NULL;
&amp;nbsp;&amp;nbsp; &amp;nbsp;masterXfer.dataSize = 0;
&amp;nbsp;&amp;nbsp; &amp;nbsp;masterXfer.flags = kI2C_TransferDefaultFlag;

&amp;nbsp;&amp;nbsp; &amp;nbsp;I2C_MasterTransferBlocking(I2C0, &amp;amp;masterXfer);&lt;/PRE&gt;&lt;P&gt;this is useful to detect busy status of 24cXX i2c memories.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;at the end of I2C_MasterTransferBlocking() funtion there is:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Transmit data. */
&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((xfer-&amp;gt;direction == kI2C_Write) &amp;amp;&amp;amp; (xfer-&amp;gt;dataSize &amp;gt; 0))
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Send Data. */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = I2C_MasterWriteBlocking(base, xfer-&amp;gt;data, xfer-&amp;gt;dataSize, xfer-&amp;gt;flags);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Receive Data. */
&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((xfer-&amp;gt;direction == kI2C_Read) &amp;amp;&amp;amp; (xfer-&amp;gt;dataSize &amp;gt; 0))
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = I2C_MasterReadBlocking(base, xfer-&amp;gt;data, xfer-&amp;gt;dataSize, xfer-&amp;gt;flags);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; return result;
}&lt;/PRE&gt;&lt;P&gt;in case xfer-&amp;gt;dataSize is zero there is no explicit or implicit call to I2C_MasterStop(), so I have solved adding this:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Transmit data. */
&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((xfer-&amp;gt;direction == kI2C_Write) &amp;amp;&amp;amp; (xfer-&amp;gt;dataSize &amp;gt; 0))
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Send Data. */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = I2C_MasterWriteBlocking(base, xfer-&amp;gt;data, xfer-&amp;gt;dataSize, xfer-&amp;gt;flags);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Receive Data. */
&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((xfer-&amp;gt;direction == kI2C_Read) &amp;amp;&amp;amp; (xfer-&amp;gt;dataSize &amp;gt; 0))
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = I2C_MasterReadBlocking(base, xfer-&amp;gt;data, xfer-&amp;gt;dataSize, xfer-&amp;gt;flags);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; /* In case no data has to be transfer we have to send stop condition */
&amp;nbsp;&amp;nbsp;&amp;nbsp; if( 0 == xfer-&amp;gt;dataSize )
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;result = I2C_MasterStop(base);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; return result;
}&lt;/PRE&gt;&lt;P&gt;Can this patch be considered to be merge in the official source tree?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;best regards&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 12 Apr 2017 15:38:25 GMT</pubDate>
    <dc:creator>mastupristi</dc:creator>
    <dc:date>2017-04-12T15:38:25Z</dc:date>
    <item>
      <title>bug in i2c driver for kinetis?</title>
      <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/bug-in-i2c-driver-for-kinetis/m-p/604941#M6237</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I'm refering to KSDK 2.2 for Kinetis K64&lt;/P&gt;&lt;P&gt;I you try to do an empty transfer the stop condition is never issued.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;the case is:&lt;/P&gt;&lt;PRE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; i2c_master_transfer_t masterXfer;

&amp;nbsp;&amp;nbsp; &amp;nbsp;masterXfer.slaveAddress = I2C_EEPROM_ADDRESS;
&amp;nbsp;&amp;nbsp; &amp;nbsp;masterXfer.direction = kI2C_Write;
&amp;nbsp;&amp;nbsp; &amp;nbsp;masterXfer.subaddress = 0;
&amp;nbsp;&amp;nbsp; &amp;nbsp;masterXfer.subaddressSize = 0;
&amp;nbsp;&amp;nbsp; &amp;nbsp;masterXfer.data = NULL;
&amp;nbsp;&amp;nbsp; &amp;nbsp;masterXfer.dataSize = 0;
&amp;nbsp;&amp;nbsp; &amp;nbsp;masterXfer.flags = kI2C_TransferDefaultFlag;

&amp;nbsp;&amp;nbsp; &amp;nbsp;I2C_MasterTransferBlocking(I2C0, &amp;amp;masterXfer);&lt;/PRE&gt;&lt;P&gt;this is useful to detect busy status of 24cXX i2c memories.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;at the end of I2C_MasterTransferBlocking() funtion there is:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Transmit data. */
&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((xfer-&amp;gt;direction == kI2C_Write) &amp;amp;&amp;amp; (xfer-&amp;gt;dataSize &amp;gt; 0))
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Send Data. */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = I2C_MasterWriteBlocking(base, xfer-&amp;gt;data, xfer-&amp;gt;dataSize, xfer-&amp;gt;flags);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Receive Data. */
&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((xfer-&amp;gt;direction == kI2C_Read) &amp;amp;&amp;amp; (xfer-&amp;gt;dataSize &amp;gt; 0))
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = I2C_MasterReadBlocking(base, xfer-&amp;gt;data, xfer-&amp;gt;dataSize, xfer-&amp;gt;flags);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; return result;
}&lt;/PRE&gt;&lt;P&gt;in case xfer-&amp;gt;dataSize is zero there is no explicit or implicit call to I2C_MasterStop(), so I have solved adding this:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Transmit data. */
&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((xfer-&amp;gt;direction == kI2C_Write) &amp;amp;&amp;amp; (xfer-&amp;gt;dataSize &amp;gt; 0))
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Send Data. */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = I2C_MasterWriteBlocking(base, xfer-&amp;gt;data, xfer-&amp;gt;dataSize, xfer-&amp;gt;flags);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Receive Data. */
&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((xfer-&amp;gt;direction == kI2C_Read) &amp;amp;&amp;amp; (xfer-&amp;gt;dataSize &amp;gt; 0))
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = I2C_MasterReadBlocking(base, xfer-&amp;gt;data, xfer-&amp;gt;dataSize, xfer-&amp;gt;flags);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; /* In case no data has to be transfer we have to send stop condition */
&amp;nbsp;&amp;nbsp;&amp;nbsp; if( 0 == xfer-&amp;gt;dataSize )
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;result = I2C_MasterStop(base);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; return result;
}&lt;/PRE&gt;&lt;P&gt;Can this patch be considered to be merge in the official source tree?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;best regards&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 12 Apr 2017 15:38:25 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/bug-in-i2c-driver-for-kinetis/m-p/604941#M6237</guid>
      <dc:creator>mastupristi</dc:creator>
      <dc:date>2017-04-12T15:38:25Z</dc:date>
    </item>
    <item>
      <title>Re: bug in i2c driver for kinetis?</title>
      <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/bug-in-i2c-driver-for-kinetis/m-p/604942#M6238</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello, thank you for noticing this.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;After a start condition has been sent and to prevent the bus to be left busy, there is a function which checks whether an arbitration lost has occurred and&amp;nbsp;also checks for NAK:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt; /* Check if there's transfer error. */&lt;/STRONG&gt;&lt;BR /&gt; result = I2C_CheckAndClearError(base, base-&amp;gt;S);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;If a NAK flag is detected, it will send the stop condition:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;/* Return if error. */&lt;/STRONG&gt;&lt;BR /&gt; if (result)&lt;BR /&gt; {&lt;BR /&gt; if (result == kStatus_I2C_Nak)&lt;BR /&gt; {&lt;BR /&gt; result = kStatus_I2C_Addr_Nak;&lt;/P&gt;&lt;P&gt;I2C_MasterStop(base);&lt;BR /&gt; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;So if no data has to be transferred, it will send a stop condition and the bus will no longer be busy.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best regards,&lt;/P&gt;&lt;P&gt;Ivan Ruiz.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 19 Apr 2017 22:31:13 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/bug-in-i2c-driver-for-kinetis/m-p/604942#M6238</guid>
      <dc:creator>IvanRuiz</dc:creator>
      <dc:date>2017-04-19T22:31:13Z</dc:date>
    </item>
  </channel>
</rss>

