<?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 Problem with I2C. in Kinetis Microcontrollers</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Problem-with-I2C/m-p/819176#M49574</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I do write operation.&lt;/P&gt;&lt;BLOCKQUOTE class="jive_macro_quote jive-quote jive_text_macro"&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;unsigned int I2C0_Wait(void)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned int timeout = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while((I2C0_S &amp;amp; I2C_S_IICIF_MASK)==0)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; timeout++;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(timeout &amp;gt; I2C_TIMEOUT)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return I2C_ERROR;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0_S |= I2C_S_IICIF_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;void MAX7300_Write(uint8_t slave_addr, uint8_t reg_addr, uint8_t *data)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;uint8_t slave_address = (slave_addr&amp;lt;&amp;lt;1) &amp;amp; 0xFE;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //START&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0_C1 |= I2C_C1_MST_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0_C1 |= I2C_C1_TX_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0_D = slave_address;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0_Wait();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0_D = reg_addr;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0_Wait();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0_D = *data;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0_Wait();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //STOP&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0_C1 &amp;amp;= ~I2C_C1_MST_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0_C1 &amp;amp;= ~I2C_C1_TX_MASK&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (I2C0_S &amp;amp; I2C_S_BUSY_MASK) ;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;After stop the busy flag is not cleared – I stay in while (I2C0_S &amp;amp; I2C_S_BUSY_MASK).&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;In data sheet it says&lt;/P&gt;&lt;P&gt;BUSY&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 15px; color: black;"&gt;Indicates the status of the bus regardless of slave or master mode. This bit is set when a START signal is&lt;BR /&gt; detected and cleared when a STOP signal is detected.&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 20 Dec 2018 09:13:21 GMT</pubDate>
    <dc:creator>john71</dc:creator>
    <dc:date>2018-12-20T09:13:21Z</dc:date>
    <item>
      <title>Problem with I2C.</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Problem-with-I2C/m-p/819176#M49574</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I do write operation.&lt;/P&gt;&lt;BLOCKQUOTE class="jive_macro_quote jive-quote jive_text_macro"&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;unsigned int I2C0_Wait(void)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned int timeout = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while((I2C0_S &amp;amp; I2C_S_IICIF_MASK)==0)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; timeout++;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(timeout &amp;gt; I2C_TIMEOUT)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return I2C_ERROR;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0_S |= I2C_S_IICIF_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;void MAX7300_Write(uint8_t slave_addr, uint8_t reg_addr, uint8_t *data)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;uint8_t slave_address = (slave_addr&amp;lt;&amp;lt;1) &amp;amp; 0xFE;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //START&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0_C1 |= I2C_C1_MST_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0_C1 |= I2C_C1_TX_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0_D = slave_address;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0_Wait();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0_D = reg_addr;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0_Wait();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0_D = *data;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0_Wait();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //STOP&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0_C1 &amp;amp;= ~I2C_C1_MST_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; I2C0_C1 &amp;amp;= ~I2C_C1_TX_MASK&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (I2C0_S &amp;amp; I2C_S_BUSY_MASK) ;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;After stop the busy flag is not cleared – I stay in while (I2C0_S &amp;amp; I2C_S_BUSY_MASK).&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;In data sheet it says&lt;/P&gt;&lt;P&gt;BUSY&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 15px; color: black;"&gt;Indicates the status of the bus regardless of slave or master mode. This bit is set when a START signal is&lt;BR /&gt; detected and cleared when a STOP signal is detected.&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 20 Dec 2018 09:13:21 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Problem-with-I2C/m-p/819176#M49574</guid>
      <dc:creator>john71</dc:creator>
      <dc:date>2018-12-20T09:13:21Z</dc:date>
    </item>
    <item>
      <title>Re: Problem with I2C.</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Problem-with-I2C/m-p/819177#M49575</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Evgeny&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;A start condition is sent when the MST flag is set and a stop condition is sent when the MST flag is cleared.&lt;/P&gt;&lt;P&gt;The TX flag should however not be cleared. Maybe that is the issue (?)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Mark&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A class="jive-link-external-small" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fwww.utasker.com%2Fkinetis%2FFRDM-K82F.html" rel="nofollow" target="_blank"&gt;http://www.utasker.com/kinetis/FRDM-K82F.html&lt;/A&gt;&lt;BR /&gt;&lt;SPAN&gt;I2C: &lt;/SPAN&gt;&lt;A class="jive-link-external-small" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fwww.utasker.com%2Fdocs%2FuTasker%2FuTasker_I2C.pdf" rel="nofollow" target="_blank"&gt;http://www.utasker.com/docs/uTasker/uTasker_I2C.pdf&lt;/A&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 20 Dec 2018 09:55:09 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Problem-with-I2C/m-p/819177#M49575</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2018-12-20T09:55:09Z</dc:date>
    </item>
    <item>
      <title>Re: Problem with I2C.</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Problem-with-I2C/m-p/819178#M49576</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I commented the line &lt;/P&gt;&lt;P&gt;2C0_C1 &amp;amp;= ~I2C_C1_TX_MASK&lt;/P&gt;&lt;P&gt;on stop condition. the BUSY stays high.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 20 Dec 2018 10:15:31 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Problem-with-I2C/m-p/819178#M49576</guid>
      <dc:creator>john71</dc:creator>
      <dc:date>2018-12-20T10:15:31Z</dc:date>
    </item>
    <item>
      <title>Re: Problem with I2C.</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Problem-with-I2C/m-p/819179#M49577</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Have you measured the signals on the bus?&lt;/P&gt;&lt;P&gt;If they are not both at '1' it would also be normal that the bus is still seen as busy and the reason for why the bus is not '1' (eg. missing pull-ups) will need to be investigated.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Mark&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 20 Dec 2018 11:27:55 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Problem-with-I2C/m-p/819179#M49577</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2018-12-20T11:27:55Z</dc:date>
    </item>
    <item>
      <title>Re: Problem with I2C.</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Problem-with-I2C/m-p/819180#M49578</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Scope shows normal signals on SDA and SCL lines.&lt;/P&gt;&lt;P&gt;I noticed the clocks configured at startup are invalid. May it be related to the issue?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 20 Dec 2018 11:52:21 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Problem-with-I2C/m-p/819180#M49578</guid>
      <dc:creator>john71</dc:creator>
      <dc:date>2018-12-20T11:52:21Z</dc:date>
    </item>
    <item>
      <title>Re: Problem with I2C.</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Problem-with-I2C/m-p/819181#M49579</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I suspect the &lt;SPAN class=""&gt;MULT&lt;/SPAN&gt; and &lt;SPAN class=""&gt;ICR values in I2C0-&amp;gt;F register the origin of the problem. &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;Say I want to have a baud rate 300000.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class=""&gt;So 48000000 / 160 = 300000. But divider can be achieved by different ways - 4*40, 2*80. Divider the same but the parameters like&amp;nbsp; &lt;EM&gt;SDA hold time&lt;/EM&gt;, &lt;EM&gt;SCL start hold time&lt;/EM&gt;, &lt;EM&gt;SCL stop hold time&amp;nbsp;&lt;/EM&gt; will be different.&amp;nbsp; And this is what driving the bus nuts (I guess). Is there some algorithm to calculate the right parameters?&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 23 Dec 2018 12:16:20 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Problem-with-I2C/m-p/819181#M49579</guid>
      <dc:creator>john71</dc:creator>
      <dc:date>2018-12-23T12:16:20Z</dc:date>
    </item>
    <item>
      <title>Re: Problem with I2C.</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Problem-with-I2C/m-p/819182#M49580</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Well..I found I2C_MasterSetBaudRate(I2C0, 200000, clock_hz);&amp;nbsp; doesn't help much.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 23 Dec 2018 13:09:28 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Problem-with-I2C/m-p/819182#M49580</guid>
      <dc:creator>john71</dc:creator>
      <dc:date>2018-12-23T13:09:28Z</dc:date>
    </item>
    <item>
      <title>Re: Problem with I2C.</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Problem-with-I2C/m-p/819183#M49581</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;1. Check whether your part is affected by errata e6070 which excludes the use of the MULT bit since it causes repeated starts to fail when not set to 0.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;2. The baud rate generator doesn't follow any obvious formula so it is best to take the values from the user's manual (or use a look up table of it) - Table &lt;STRONG&gt;"I2C divider and hold values"&lt;/STRONG&gt;. For example, the baud rate divider is not just the IRC value in the register but is derived from it - 0x00 divides by 20 , 0x21 divides by 192 and 0x22 divides by 224, etc. etc.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If you need 300kHz from 60MHz bus, as reference, with MULT set to 0, you need to divide by 200. The closest divides possible are 192 (a little faster) or 224 (a little slower). Choosing 224 (to give 267.8kHz), ICR is 0x22. Therefore I2Cx_F is 0x22.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The setup and hold times may be tunable if you can use MULT but their effect should be insignificant for basic operation.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Mark&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 23 Dec 2018 14:01:22 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Problem-with-I2C/m-p/819183#M49581</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2018-12-23T14:01:22Z</dc:date>
    </item>
  </channel>
</rss>

