<?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 UM10601 Rev. 1.6 — 2 April 2014 - I2C code examples have incorrect code in LPC Microcontrollers</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/UM10601-Rev-1-6-2-April-2014-I2C-code-examples-have-incorrect/m-p/566394#M17287</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by larryvc on Mon Jan 05 20:30:56 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;What happens when you bitwise inclusive OR a value with 0?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Many of the I2C code examples in UM10601 pages 340-347 have entries like this where the code is ORing a value with 0.&amp;nbsp; (Also, some of the comments do not match the operations.&amp;nbsp; These are obviously write operations.)&amp;nbsp; Sorry NXP, this is cut and paste without verification, again. :~ &lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
LPC_I2C-&amp;gt;MSTDAT = (0x23 &amp;lt;&amp;lt; 1) | 0; // address and 1 for RWn bit in
&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;&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;&amp;nbsp;&amp;nbsp; // order to read data

LPC_I2C-&amp;gt;MSTDAT = (0x23 &amp;lt;&amp;lt; 1) | 0; // address and 0 for RWn bit in order to write
&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;&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;&amp;nbsp;&amp;nbsp; // subaddress
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Granted, bit 0, the RWn bit, is being cleared by the left shift anyway, but to do this correctly, and to not confuse new users, the code needs to be written like this to clear the RWn bit:&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
LPC_I2C-&amp;gt;MSTDAT = (0x23 &amp;lt;&amp;lt; 1) &amp;amp; ~(1&amp;lt;&amp;lt;0);&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;ORing with 1 for the read operations is correct in the code examples but could also be written as:&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
LPC_I2C-&amp;gt;MSTDAT = (0x23 &amp;lt;&amp;lt; 1) | (1&amp;lt;&amp;lt;0);&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;SPAN&gt;From the UM: (reformatted for posting)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Table 308. I2C Code example&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Interrupt handler&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
void I2c_IRQHandler() {
uint32_t intstat = LPC_I2C-&amp;gt;INTSTAT;
uint32_t stat = LPC_I2C-&amp;gt;STAT;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(intstat &amp;amp; I2C_STAT_MSTPENDING) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t mst_state = stat &amp;amp; I2C_STAT_MSTSTATE;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(mst_state == I2C_STAT_MSTST_IDLE) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_I2C-&amp;gt;MSTDAT = (0x23 &amp;lt;&amp;lt; 1) | 1; // address and 1 for RWn bit in order to read data
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_I2C-&amp;gt;MSTCTL = I2C_MSTCTL_MSTSTART; // send start
&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; if(mst_state == I2C_STAT_MSTST_RX) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t data;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data = LPC_I2C-&amp;gt;MSTDAT; // receive data
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(data != 0xdd) abort();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_I2C-&amp;gt;MSTDAT = (0x23 &amp;lt;&amp;lt; 1) | 0; // address and 1 for RWn bit in order to read data
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_I2C-&amp;gt;MSTCTL = I2C_MSTCTL_MSTSTART; // repeated start (nack implied)
&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; if(mst_state == I2C_STAT_MSTSTX) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_I2C-&amp;gt;MSTCTL = I2C_MSTCTL_MSTSTOP; // stop transaction
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_I2C-&amp;gt;INTENCLR = I2C_STAT_MSTPENDING;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 20:06:31 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T20:06:31Z</dc:date>
    <item>
      <title>UM10601 Rev. 1.6 — 2 April 2014 - I2C code examples have incorrect code</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/UM10601-Rev-1-6-2-April-2014-I2C-code-examples-have-incorrect/m-p/566394#M17287</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by larryvc on Mon Jan 05 20:30:56 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;What happens when you bitwise inclusive OR a value with 0?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Many of the I2C code examples in UM10601 pages 340-347 have entries like this where the code is ORing a value with 0.&amp;nbsp; (Also, some of the comments do not match the operations.&amp;nbsp; These are obviously write operations.)&amp;nbsp; Sorry NXP, this is cut and paste without verification, again. :~ &lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
LPC_I2C-&amp;gt;MSTDAT = (0x23 &amp;lt;&amp;lt; 1) | 0; // address and 1 for RWn bit in
&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;&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;&amp;nbsp;&amp;nbsp; // order to read data

LPC_I2C-&amp;gt;MSTDAT = (0x23 &amp;lt;&amp;lt; 1) | 0; // address and 0 for RWn bit in order to write
&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;&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;&amp;nbsp;&amp;nbsp; // subaddress
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Granted, bit 0, the RWn bit, is being cleared by the left shift anyway, but to do this correctly, and to not confuse new users, the code needs to be written like this to clear the RWn bit:&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
LPC_I2C-&amp;gt;MSTDAT = (0x23 &amp;lt;&amp;lt; 1) &amp;amp; ~(1&amp;lt;&amp;lt;0);&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;ORing with 1 for the read operations is correct in the code examples but could also be written as:&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
LPC_I2C-&amp;gt;MSTDAT = (0x23 &amp;lt;&amp;lt; 1) | (1&amp;lt;&amp;lt;0);&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;SPAN&gt;From the UM: (reformatted for posting)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Table 308. I2C Code example&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Interrupt handler&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
void I2c_IRQHandler() {
uint32_t intstat = LPC_I2C-&amp;gt;INTSTAT;
uint32_t stat = LPC_I2C-&amp;gt;STAT;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(intstat &amp;amp; I2C_STAT_MSTPENDING) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t mst_state = stat &amp;amp; I2C_STAT_MSTSTATE;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(mst_state == I2C_STAT_MSTST_IDLE) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_I2C-&amp;gt;MSTDAT = (0x23 &amp;lt;&amp;lt; 1) | 1; // address and 1 for RWn bit in order to read data
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_I2C-&amp;gt;MSTCTL = I2C_MSTCTL_MSTSTART; // send start
&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; if(mst_state == I2C_STAT_MSTST_RX) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t data;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data = LPC_I2C-&amp;gt;MSTDAT; // receive data
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(data != 0xdd) abort();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_I2C-&amp;gt;MSTDAT = (0x23 &amp;lt;&amp;lt; 1) | 0; // address and 1 for RWn bit in order to read data
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_I2C-&amp;gt;MSTCTL = I2C_MSTCTL_MSTSTART; // repeated start (nack implied)
&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; if(mst_state == I2C_STAT_MSTSTX) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_I2C-&amp;gt;MSTCTL = I2C_MSTCTL_MSTSTOP; // stop transaction
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPC_I2C-&amp;gt;INTENCLR = I2C_STAT_MSTPENDING;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 20:06:31 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/UM10601-Rev-1-6-2-April-2014-I2C-code-examples-have-incorrect/m-p/566394#M17287</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T20:06:31Z</dc:date>
    </item>
    <item>
      <title>Re: UM10601 Rev. 1.6 — 2 April 2014 - I2C code examples have incorrect code</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/UM10601-Rev-1-6-2-April-2014-I2C-code-examples-have-incorrect/m-p/566395#M17288</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by nerd herd on Tue Jan 06 12:03:15 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi Larryvc,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Thank you for reporting oddities with the code. This will be reported to the documentation team.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 20:06:32 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/UM10601-Rev-1-6-2-April-2014-I2C-code-examples-have-incorrect/m-p/566395#M17288</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T20:06:32Z</dc:date>
    </item>
  </channel>
</rss>

