<?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 Re: AN3291 oddity (problems with I2C device on QG8) in 8-bit Microcontrollers</title>
    <link>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138211#M4898</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;I suggest you use the IBIF flag instead TCF. The communication is relable. On the other site, the IBIF flag you can use for interrupt generation and make the code for IIC device access by the interrupts.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;The CW Simulator does not simulate IIC comunication because you need the slave answers too and the simulator does not know simulate any slave IIC device.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;The best way to debug or build the IIC SW code is use the storage scope.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Best Regards,&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Stano.&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Fri, 09 Mar 2007 18:09:23 GMT</pubDate>
    <dc:creator>Stano</dc:creator>
    <dc:date>2007-03-09T18:09:23Z</dc:date>
    <item>
      <title>AN3291 oddity (problems with I2C device on QG8)</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138206#M4893</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Hi all,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm trying to connect 24FC512 EEPROM to QG8 device. I downloaded AN3291 and copied routines to read/write from EEPROM with I2C module in HCS08 devices into my project, after a slight changes (like converting IIC1S to IICS and so on) I downloaded code to FLASH and the routines behaved somehow strange. Write routine followed with read routine worked, but reading byte back stopped at waiting for ACK signal after third transmitted byte (first is device address, second and third are memory address bytes). I searched for problem in read routine, but when I placed two write routines subsequently, the second one stopped at the same place, indicating the is something wrong with the write routine. Putting AN in contrast with datasheet showed that IICIF flag should be cleared (by writing 1) after writing data byte into EEPROM.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;This is how routine looked originally:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;void I2C_write_byte (word addr,byte data)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;EE_Addr = addr; // address input;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;temp = (EE_Addr_H &amp;amp; 0x07) 1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;IIC1C_TX = 1; // Set transmit mode;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//-------start of transmit first byte to IIC bus-----&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;IIC1C_MST = 1; // Start transfer - Master bit = 1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;IIC1D = sl_addr | temp; // send "Write" + high address;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;while (!(IIC1S_IIC1IF));&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;IIC1S_IIC1IF = 1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;while (IIC1S_RXAK); // wait for ACK from slave;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//-----Slave ACK occurred------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;IIC1D = EE_Addr_L; // send low address byte;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;while (!(IIC1S_IIC1IF)); // wait till data transferred;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;IIC1S_IIC1IF = 1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;while (IIC1S_RXAK); // wait for ACK from slave;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//-----Slave ACK occurred------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;IIC1D = data; // write data byte into EEPROM;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;while (!(IIC1S_IIC1IF)); // wait till data transferred;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;while (IIC1S_RXAK); // wait for ACK from slave;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;IIC1C_MST = 0; // STOP bit;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;and this is how the routine works for me:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;void I2C_write_byte (word addr,byte data)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;EE_Addr = addr; // address input;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;temp = (EE_Addr_H &amp;amp; 0x07) 1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;IIC1C_TX = 1; // Set transmit mode;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//-------start of transmit first byte to IIC bus-----&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;IIC1C_MST = 1; // Start transfer - Master bit = 1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;IIC1D = sl_addr | temp; // send "Write" + high address;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;while (!(IIC1S_IIC1IF));&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;IIC1S_IIC1IF = 1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;while (IIC1S_RXAK); // wait for ACK from slave;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//-----Slave ACK occurred------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;IIC1D = EE_Addr_L; // send low address byte;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;while (!(IIC1S_IIC1IF)); // wait till data transferred;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;IIC1S_IIC1IF = 1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;while (IIC1S_RXAK); // wait for ACK from slave;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//-----Slave ACK occurred------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;IIC1D = data; // write data byte into EEPROM;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;while (!(IIC1S_IIC1IF)); // wait till data transferred;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//*****************************here is flag clearing*************************&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;IIC1S_IIC1IF = 1; //!!!!!!!!!!!ADDED LINE!!!!!!!!!!!!&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//***************************************************************************&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;while (IIC1S_RXAK); // wait for ACK from slave;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;IIC1C_MST = 0; // STOP bit;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I think it is quite logical to clear flag after it was set. This is also mentioned in datasheet for QG8 device (figure 11-3) - there is difference, described as interrupt routine, but it can be easily converted into polled routines, IICIF flag is cleared after EVERY entry to interrupt routine, it means everytime when IICIF flag is set.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;After adding line routines work like expected - I'm able to write/read from external EEPROM.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Is the missed line mistake in document or I have got another problem? &lt;/SPAN&gt;&lt;SPAN aria-label="Happy" class="emoticon_happy emoticon-inline" style="height:16px;width:16px;"&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;By the way, interesting fact is that the write/read sequence worked well when doing single steps through routine code AND with Data window opened. With Data windows closed, routine hanged on the same place as before. It is probably because I2C module registers were showed in Data window and thus read by BDM POD.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 28 Nov 2006 21:39:00 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138206#M4893</guid>
      <dc:creator>jarin</dc:creator>
      <dc:date>2006-11-28T21:39:00Z</dc:date>
    </item>
    <item>
      <title>Re: AN3291 oddity (problems with I2C device on QG8)</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138207#M4894</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;I'm experiencing same problem with the code in that AN. I will try your fix tomorrow...&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 15 Feb 2007 10:49:30 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138207#M4894</guid>
      <dc:creator>ddz</dc:creator>
      <dc:date>2007-02-15T10:49:30Z</dc:date>
    </item>
    <item>
      <title>Re: AN3291 oddity (problems with I2C device on QG8)</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138208#M4895</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;Thanks Jarin,&lt;/DIV&gt;&lt;DIV&gt;Reported to AN3291 author with the link to your description.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 15 Feb 2007 17:06:14 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138208#M4895</guid>
      <dc:creator>Alban</dc:creator>
      <dc:date>2007-02-15T17:06:14Z</dc:date>
    </item>
    <item>
      <title>Re: AN3291 oddity (problems with I2C device on QG8)</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138209#M4896</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;Hi all,&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;I'm an author of the AN3291.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Thank you for your important feedback. I apologize for that mistake - you are right.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;I have been tested the WRITE and READ routines from my AN3291. One mistake (mentioned previously) was in the write routine and I found another one in the read routine too. Now both routines are correct and they are in follow:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;void I2C_write_byte (word addr,byte data)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IICS_IICIF = 1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EE_Addr = addr;&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; // address input;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp = (EE_Addr_H &amp;amp; 0x07) &amp;lt;&amp;lt; 1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IICC_TX = 1;&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; // Set transmit mode;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//-------start of transmit first byte to IIC bus-----&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IICC_MST = 1;&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; // Start transfer - Master bit = 1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IICD = sl_addr | temp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // send "Write" + high address;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (!(IICS_IICIF));&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IICS_IICIF = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (IICS_RXAK);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // wait for ACK from slave;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//-----Slave ACK occured------------&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IICD = EE_Addr_L;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // send low address byte;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (!(IICS_IICIF));&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // wait till data transfered;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IICS_IICIF = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (IICS_RXAK);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // wait for ACK from slave;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//-----Slave ACK occured------------&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IICD = data;&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; // write data byte into EEPROM;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (!(IICS_IICIF));&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // wait till data transfered;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color="#ff0000"&gt;IICS_IICIF = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // - ADDED;&lt;BR /&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (IICS_RXAK);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // wait for ACK from slave;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IICC_MST = 0;&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; // STOP bit;&lt;BR /&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;byte I2C_read_byte(word addr)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;IICS_IICIF = 1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;EE_Addr = addr;&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;// address input;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp = (EE_Addr_H &amp;amp; 0x07) &amp;lt;&amp;lt; 1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;IICC_TX = 1;&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; // Set transmit mode;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//-------start of transmit first byte to IIC bus-----&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;IICC_MST = 1;&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; // Start transfer - Master bit = 1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;IICD = sl_addr | temp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // send "Write" + high address;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (!(IICS_IICIF));&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;IICS_IICIF = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (IICS_RXAK);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // wait for ACK from slave;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//-----Slave ACK occured------------&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;IICD = EE_Addr_L;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // send low address byte;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (!(IICS_IICIF));&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;IICS_IICIF = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (IICS_RXAK);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // wait for ACK from slave;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//-----Slave ACK occured------------&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;IICC_RSTA = 1;&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; // Generate repeat START condition;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;IICD = sl_addr | temp | 1; // Send combined address &amp;amp; "Read" command;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (!(IICS_IICIF));&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;IICS_IICIF = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (IICS_RXAK);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // wait for ACK from slave;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//-----Slave ACK occured------------&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;IICC_TX = 0;&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; // Set receive mode;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color="#ff0000"&gt;IICC_TXAK = 1;&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; // Last byte will be read; - ADDED;&lt;BR /&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp = IICD;&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; // read IIC data&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (!(IICS_IICIF));&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;IICS_IICIF = 1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;IICC_MST = 0;&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; // STOP bit;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;rd_data = IICD;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return rd_data;&lt;BR /&gt;}&lt;BR /&gt;&lt;/DIV&gt;&lt;DIV&gt;I made tests on my &lt;STRONG&gt;9S08QG8&lt;/STRONG&gt; MCU with the &lt;STRONG&gt;24LC16B&lt;/STRONG&gt; serial EEPROM. The code in the &lt;STRONG&gt;AN3291&lt;/STRONG&gt; will be corrected as soon as possible.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;I will make tests with the mentioned EEPROMs 24FC512 and QG8 MCU after I receive this type of EEPROM. I guess it could be finished next week - then I will place the message to this forum.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Sorry once again for this mistake.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Stano.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 22 Feb 2007 04:49:07 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138209#M4896</guid>
      <dc:creator>Stano</dc:creator>
      <dc:date>2007-02-22T04:49:07Z</dc:date>
    </item>
    <item>
      <title>Re: AN3291 oddity (problems with I2C device on QG8)</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138210#M4897</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;Can you use the TCF flag rather than the IICIF flag for byte transfer completion?&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;example:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;while(! (IICS_TCF));&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Also, does the simulator work for IIC module?&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Thanks&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 09 Mar 2007 09:26:54 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138210#M4897</guid>
      <dc:creator>FC</dc:creator>
      <dc:date>2007-03-09T09:26:54Z</dc:date>
    </item>
    <item>
      <title>Re: AN3291 oddity (problems with I2C device on QG8)</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138211#M4898</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;I suggest you use the IBIF flag instead TCF. The communication is relable. On the other site, the IBIF flag you can use for interrupt generation and make the code for IIC device access by the interrupts.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;The CW Simulator does not simulate IIC comunication because you need the slave answers too and the simulator does not know simulate any slave IIC device.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;The best way to debug or build the IIC SW code is use the storage scope.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Best Regards,&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Stano.&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 09 Mar 2007 18:09:23 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138211#M4898</guid>
      <dc:creator>Stano</dc:creator>
      <dc:date>2007-03-09T18:09:23Z</dc:date>
    </item>
    <item>
      <title>Re: AN3291 oddity (problems with I2C device on QG8)</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138212#M4899</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;BLOCKQUOTE&gt;&lt;HR /&gt;Stano wrote:&lt;BR /&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;I'm an author of the AN3291...&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;PRE&gt;
void I2C_write_byte (word addr,byte data)
{
    IICS_IICIF = 1;
    EE_Addr = addr;                // address input;
    temp = (EE_Addr_H &amp;amp; 0x07) &amp;lt;&amp;lt; 1;
    IICC_TX = 1;                      // Set transmit mode;
       //-------start of transmit first byte to IIC bus-----
    IICC_MST = 1;                  // Start transfer - Master bit = 1;
    IICD = sl_addr | temp;      // send "Write" + high address;
    while (!(IICS_IICIF));
    IICS_IICIF = 1;       
    while (IICS_RXAK);          // wait for ACK from slave;
      //-----Slave ACK occured------------
    IICD = EE_Addr_L;          // send low address byte;
    while (!(IICS_IICIF));        // wait till data transfered;
    IICS_IICIF = 1;       
    while (IICS_RXAK);          // wait for ACK from slave;
      //-----Slave ACK occured------------
    IICD = data;                    // write data byte into EEPROM;
    while (!(IICS_IICIF));       // wait till data transfered;
    IICS_IICIF = 1;      // - ADDED;
    while (IICS_RXAK);        // wait for ACK from slave;
    IICC_MST = 0;               // STOP bit;
}&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;Stano, I'm confused in several areas with your app note and your code snippet (let's focus on the write routine.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;First of all, the AN shows a nice write format in Figure 4 (for one byte address) and in Figure 5 (for two byte address) on page 4.&amp;nbsp; However, in Figure 4, the address is described as "Word Address", even though it's an 8-bit word.&amp;nbsp; Same goes for Figure 5.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Your example code seems to be the 2-byte address variety with low and high bytes.&amp;nbsp; Yet, the 4-bit control code section seems to be mixed up with the high byte.&amp;nbsp; Shouldn't the control bits + the lower three device address bits + Write bit be sent first to the device?&amp;nbsp; Then, you send the high and low address bytes?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 03 Sep 2009 04:10:50 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138212#M4899</guid>
      <dc:creator>irob</dc:creator>
      <dc:date>2009-09-03T04:10:50Z</dc:date>
    </item>
    <item>
      <title>Re: AN3291 oddity (problems with I2C device on QG8)</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138213#M4900</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi irob,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;This address is really word format, because it is not only lower 8-bits but still upper 3 bits in the control byte. For detail information look at the datasheets of e.g. 24C16 or 24C32 EEPROMs.&lt;/P&gt;&lt;P&gt;Mentioned datasheets can be on the microchip web page.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Stano.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 03 Sep 2009 16:03:04 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138213#M4900</guid>
      <dc:creator>Stano</dc:creator>
      <dc:date>2009-09-03T16:03:04Z</dc:date>
    </item>
    <item>
      <title>Re: AN3291 oddity (problems with I2C device on QG8)</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138214#M4901</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Stano, thanks for the clarification.&amp;nbsp; I see what you're saying now.&amp;nbsp; I was just compariing the diagram in your AN to your code and didn't come up with the right amount of bits.&amp;nbsp; But I see what you're saying now.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I've got my software written now for a 1-byte addressable I2C peripheral, but I'm having a curious problem with it.&amp;nbsp; I'm using the MC9S08QG8 and I have found that only in the debugger will the I2C module work correctly.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;For instance, if I step through my code, I am able to trace through and over a complete I2C Write and I2C Read function, both working as expected.&amp;nbsp; But if I let the program run, it getshung up in the interrupt flag polling while().&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Another strange thing is that the entire I2C module won't seem to turn on without the use of this interrupt poll.&amp;nbsp; I attempted -- like user "FC" above suggested -- to use the transfer complete (TOF) flag instead of the interrupt flag to wait for completion.&amp;nbsp; In that iteration, the SCL won't even start.&amp;nbsp; It's like the whole module is just dead.&amp;nbsp; Can you explain why that would be?&amp;nbsp; What is the TOF bit for then?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 03 Sep 2009 20:21:01 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138214#M4901</guid>
      <dc:creator>irob</dc:creator>
      <dc:date>2009-09-03T20:21:01Z</dc:date>
    </item>
    <item>
      <title>Re: AN3291 oddity (problems with I2C device on QG8)</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138215#M4902</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Irob,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;sorry I answer a bit later, but I was very busy.&amp;nbsp;A long time ago I write the routine for 1-byte address IIC communication between S08GB60 and PCF8574 GPIO extender. This application works very well - without debug interface of course. I use it as the standard GPIO port for buttons input or LED drive output. The SW routines are in follow:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;//------------------------------------------------------------&lt;BR /&gt;void I2C_write_byte (byte data)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1C_IICEN = 1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1C_TX = 1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //-------start of transmit first byte to IIC bus-----&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1C_MST = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Start transfer - Master bit = 1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1D = sl_addr;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; while (!(IIC1S_IICIF));&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1S_IICIF = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;while (IIC1S_RXAK);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // wait for ACK from slave;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //-----Slave ACK occured------------&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1D = data;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // write data byte into EEPROM;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!(IIC1S_TCF));&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // wait till data transfered;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (IIC1S_RXAK);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // wait for ACK from slave;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!(IIC1S_TCF));&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // wait till data transfered;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1C_MST = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // STOP bit;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1C_IICEN = 0;&lt;BR /&gt;}&lt;BR /&gt;//------------------------------------------------------------&lt;BR /&gt;byte I2C_read_byte (void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1C_TX = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Set transmit mode;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //-------start of transmit first byte to IIC bus-----&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1C_MST = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Start transfer - Master bit = 1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1D = (sl_addr | 1);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!(IIC1S_IICIF));&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1S_IICIF = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;while (IIC1S_RXAK);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // wait for ACK from slave;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //-----Slave ACK occured------------&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1C_TX = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Set receive mode;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;rd_data = IIC1D;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // read IIC data&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;while (!(IIC1S_IICIF));&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;IIC1S_IICIF = 1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1C_MST = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // STOP bit;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return rd_data;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The important think is that the IIC bus can freeze when the salve device can't answer properly. Slave device must receive right amount of SCL clock impulses to send whole answer to master. When this state (IIC freeze) arrives, master must make the IIC bus reset - this means send 9 SCL impulses while SDA = 0. Then the communication can start. For this "reset" switch off the IIC internal module, go to GPIO mode and emulate IIC reset by the same pins but in GPIO mode. Then activate internal IIC module and use it. The best way to recognize that the byte transfer is complete is use the IICIF flag - you can use it in interrupt routine or not - see example above.&lt;/P&gt;&lt;P&gt;I don't know what kind of IC you use for 1-byte address communication, but this code could be good example. The best way for IIC debug is use the scope, because it is not possible debug it step-by-step.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I hope it hels you.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Bye,&lt;/P&gt;&lt;P&gt;Stano.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 10 Sep 2009 14:09:26 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138215#M4902</guid>
      <dc:creator>Stano</dc:creator>
      <dc:date>2009-09-10T14:09:26Z</dc:date>
    </item>
    <item>
      <title>Re: AN3291 oddity (problems with I2C device on QG8)</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138216#M4903</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thanks again, Stano, for your help!&amp;nbsp; I'm confused about when exactly we must check the I2C interrupt flag.&amp;nbsp; In your most recent example, you have that...&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;
while (!(IIC1S_IICIF)&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;...happening every time you write to or read from the I2C data channel.&amp;nbsp; And now you are also checking the TOF bit:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;
while (!(IIC1S_TCF))&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&amp;nbsp;...though you weren't above in your original code.&amp;nbsp; Seems inconsistent to me.&lt;BR /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 11 Sep 2009 02:22:31 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138216#M4903</guid>
      <dc:creator>irob</dc:creator>
      <dc:date>2009-09-11T02:22:31Z</dc:date>
    </item>
    <item>
      <title>Re: AN3291 oddity (problems with I2C device on QG8)</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138217#M4904</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi irob,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;sorry for confusion. I made test of these routines once again and the final result is - use the IICIF flag instead TCF flag. The TCF flag is valid only short time - durring or immediately after byte transfer. The IICIF flag is set and you need clear it by software - write "1" to this bit. So you have reliable information about transfered data to/from IIC module.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;So the final code for communication between S08 MCU and PCF8574 GPIO port extender is in follow:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;//-------------------------------------------------------------------------------&lt;BR /&gt;void I2C_write_byte (byte data)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1C_IICEN = 1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //-------start of transmit first byte to IIC bus-----&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1C_MST = 1;&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; // Start transfer - Master bit = 1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1C_TX = 1;&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; // Set transmit mode;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1D = sl_addr;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!(IIC1S_IICIF));&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1S_IICIF = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // clear the flag;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (IIC1S_RXAK);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // wait for ACK from slave;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //-----Slave ACK occured------------&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1D = data;&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; // write data byte into EEPROM;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (IIC1S_RXAK);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // wait for ACK from slave;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!(IIC1S_IICIF));&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // wait till data transfered;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1S_IICIF = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // clear the flag;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1C_MST = 0;&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; // STOP bit;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1C_IICEN = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // deactivate IIC module;&lt;BR /&gt;}&lt;BR /&gt;//-------------------------------------------------------------------------------&lt;BR /&gt;byte I2C_read_byte (void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1C_IICEN = 1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //-------start of transmit first byte to IIC bus-----&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1C_MST = 1;&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; // Start transfer - Master bit = 1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1C_TX = 1;&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; // Set transmit mode;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1D = (sl_addr | 1);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // "read" command;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!(IIC1S_IICIF));&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // wait till data transfered;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1S_IICIF = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // clear the flag;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (IIC1S_RXAK);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // wait for ACK from slave;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //-----Slave ACK occured------------&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1C_TX = 0;&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; // Set receive mode;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp = IIC1D;&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; // send SCL impulses to read slave;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!(IIC1S_IICIF));&amp;nbsp;&amp;nbsp;&amp;nbsp; // wait till data transfered;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1S_IICIF = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // clear the flag;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1C_MST = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // STOP bit;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rd_data = IIC1D;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // save received data from slave;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1C_IICEN = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // deactivate IIC module;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return rd_data;&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;BR /&gt;}&lt;BR /&gt;//-------------------------------------------------------------------------------&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;So you can use it for one-byte transfer as example.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I hope it helps you;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Bye,&lt;/P&gt;&lt;P&gt;Stano.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 11 Sep 2009 19:10:20 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138217#M4904</guid>
      <dc:creator>Stano</dc:creator>
      <dc:date>2009-09-11T19:10:20Z</dc:date>
    </item>
    <item>
      <title>Re: AN3291 oddity (problems with I2C device on QG8)</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138218#M4905</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;Hi, Stano.&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;I'm trying to figure out the IIC drivers.&amp;nbsp; I note that your routines here in the forum either&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;Case 1: start with&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IICS_IICIF = 1;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;or&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;Case 2: start with&lt;BR /&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT color="#000000" size="2"&gt;&lt;/FONT&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; IIC1C_IICEN = 1;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; and then end with&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IIC1C_IICEN = 0;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;Neither of these cases occurs in the latest version of AN3291.pdf (Rev. 2, 04/2007).&amp;nbsp; Are they necessary? What problem does Case 1 solve?&amp;nbsp; It seems excessive to disable the IIC module after each transfer and then enable it again for the next transfer (Case 2).&amp;nbsp; Is it another way to solve the same problem as Case 1?&lt;BR /&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;Would it be reasonable to have code that uses a counter to limit the amount of time to wait for the IIC device to respond instead of hanging in an infinite loop until a COP interrupt occurs (if it happens to be enabled)?&amp;nbsp; Would this solve any of the issues the code above addresses?&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;Furthermore, the IIC_write_byte() routine in AN3291 has a line that is not in your forum code:&lt;BR /&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IICS_IICIF=1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Clear the flag&lt;BR /&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;just before its last line&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; IICC_MST = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Generate STOP&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;I cannot figure out why this is needed, since the flag was already cleared immediately following the wait for the Interrupt flag and before waiting for the AK.&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;Actually, the situation is more confusing than that: your final forum&amp;nbsp; I2C_write_byte() routine waits for an AK from the slave before it waits for the Interrupt flag to be set, indicating that the data finished transferring.&amp;nbsp; All other drivers I've seen reverse this order, first waiting for the Interrupt flag and then the AK.&amp;nbsp; Can you explain?&lt;/FONT&gt;&lt;FONT color="#000000" size="2"&gt;&lt;SPAN class="Apple-style-span"&gt;&lt;SPAN class="Apple-style-span"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;In short, there seem to be several different versions of IIC code on Freescale sites.&amp;nbsp; They differ in just a few -- to me mysterious --&amp;nbsp; particulars.&amp;nbsp; But these particulars seem to be related to serious issues that various posts have raised about failed IIC communications.&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;Can someone provide "gold standard" versions of IIC transfer code with comments especially for "gotcha" situations?&amp;nbsp; It'd be nice if there were both single- and multiple-byte transfer routines, both with and without interrupts.&amp;nbsp; Links to these "gold standards" should be prominently placed near all the older drivers, so people looking for help don't get bogged down with code that almost works.&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;Thanks,&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;&amp;nbsp; &amp;nbsp; Richly&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color="#000000" size="2"&gt;&lt;BR /&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 30 Nov 2009 03:34:38 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138218#M4905</guid>
      <dc:creator>Richly</dc:creator>
      <dc:date>2009-11-30T03:34:38Z</dc:date>
    </item>
    <item>
      <title>Re: AN3291 oddity (problems with I2C device on QG8)</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138219#M4906</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I've been beating my head against a wall all day on this, trying to get the IIC module to work.&amp;nbsp; No offense to the author, but with the many versions of sample code posted, it's difficult to suss out the right "flavor" to get simple master IIC transactions working with a registered slave.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The best results I can achieve, using verbatim the code(s) posted by Stano, are passing write and read transactions &lt;U&gt;in BDM mode only&lt;/U&gt;.&amp;nbsp; In other words, I can only write a byte to my I2C slave chip and read it back successfully if I step through code in the debugger on my HCS908QG8.&amp;nbsp; If I let the chip run, it always hangs in the slave acknowledge while.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Something that hasn't been discussed at all either here or in the app note, is the QG8's SDA hold time and SCL divider values.&amp;nbsp; There's a fairly involved formula/chart on the matter in the datasheet on pages 162-163.&amp;nbsp; I've tried both the values in the datasheet's example, and my own set, neither of which made a difference for me.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Anyone else make heads or tails of this mess?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 25 Jun 2010 03:59:40 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138219#M4906</guid>
      <dc:creator>irob</dc:creator>
      <dc:date>2010-06-25T03:59:40Z</dc:date>
    </item>
    <item>
      <title>Re: AN3291 oddity (problems with I2C device on QG8)</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138220#M4907</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I want to help you with this issue,&amp;nbsp;so send me please the source code as a zipped&amp;nbsp;attachmend and the type of the slave used.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks,&lt;/P&gt;&lt;P&gt;Stano.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 25 Jun 2010 15:01:18 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138220#M4907</guid>
      <dc:creator>Stano</dc:creator>
      <dc:date>2010-06-25T15:01:18Z</dc:date>
    </item>
    <item>
      <title>Re: AN3291 oddity (problems with I2C device on QG8)</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138221#M4908</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thanks, Stano.&amp;nbsp; I will PM you the code.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Before I left for a long weekend, I did make a breakthrough.&amp;nbsp; I had noticed one key difference between your code example and mine.&amp;nbsp; I had written an I2C init routine that I only called once to turn channels on, timing settings, etc.&amp;nbsp; In your examples, you turn on and off the I2C module every time you call a Write or Read function.&amp;nbsp; I believe on of the readers on this board questioned that.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I can indeed now get I2C functioning stand-alone outside of the debugger, but only if I do as you do -- turn on the module before use, turn back off after completed.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;It's not clear to me why this is the case.&amp;nbsp; Is this a shortcoming of the module only in QG8s?&amp;nbsp; All S08s?&amp;nbsp; Perhaps an errata is in order.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 29 Jun 2010 20:47:42 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138221#M4908</guid>
      <dc:creator>irob</dc:creator>
      <dc:date>2010-06-29T20:47:42Z</dc:date>
    </item>
    <item>
      <title>Re: AN3291 oddity (problems with I2C device on QG8)</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138222#M4909</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I saw my source code&amp;nbsp;of IIC routines for Read and Write functions, but I turn ON the IIC module once only - in the Init routine. Then I use the Read or Write functions to put or get data to/from IIC device. I think the best way is check your source code - so send it&amp;nbsp;to me please and I will check it. Send me please the type of IIC device used in your application too, otherwise I can check it with IIC memory only.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks,&lt;/P&gt;&lt;P&gt;Stano.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 29 Jun 2010 21:34:05 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138222#M4909</guid>
      <dc:creator>Stano</dc:creator>
      <dc:date>2010-06-29T21:34:05Z</dc:date>
    </item>
    <item>
      <title>Re: AN3291 oddity (problems with I2C device on QG8)</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138223#M4910</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;From your code above, Stano, you are enabling/disabling the module inside the I2C_write_byte and I2C_read_byte functions:&lt;/P&gt;&lt;P&gt;:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;//-------------------------------------------------------------------------------
void I2C_write_byte (byte data)
{
     &lt;FONT color="#ff0000"&gt;IIC1C_IICEN = 1;&lt;/FONT&gt;
        //-------start of transmit first byte to IIC bus-----
     IIC1C_MST = 1;              // Start transfer - Master bit = 1;
     IIC1C_TX = 1;                // Set transmit mode;
     IIC1D = sl_addr;
     while (!(IIC1S_IICIF));
     IIC1S_IICIF = 1;             // clear the flag;       
     while (IIC1S_RXAK);        // wait for ACK from slave;
       //-----Slave ACK occured------------
     IIC1D = data;                 // write data byte into EEPROM;
     while (IIC1S_RXAK);        // wait for ACK from slave;
     while (!(IIC1S_IICIF));     // wait till data transfered;
     IIC1S_IICIF = 1;             // clear the flag;
     IIC1C_MST = 0;              // STOP bit;
 &lt;FONT color="#ff0000"&gt;    IIC1C_IICEN = 0;            // deactivate IIC module;&lt;/FONT&gt;
}
//-------------------------------------------------------------------------------
byte I2C_read_byte (void)
{
 &lt;FONT color="#ff0000"&gt;    IIC1C_IICEN = 1;&lt;/FONT&gt;
        //-------start of transmit first byte to IIC bus-----
     IIC1C_MST = 1;              // Start transfer - Master bit = 1;
     IIC1C_TX = 1;                // Set transmit mode;
     IIC1D = (sl_addr | 1);      // "read" command;
     while (!(IIC1S_IICIF));     // wait till data transfered;
     IIC1S_IICIF = 1;             // clear the flag;       
     while (IIC1S_RXAK);        // wait for ACK from slave;
       //-----Slave ACK occured------------
     IIC1C_TX = 0;               // Set receive mode;
     temp = IIC1D;               // send SCL impulses to read slave;
     while (!(IIC1S_IICIF));    // wait till data transfered;
     IIC1S_IICIF = 1;            // clear the flag;
     IIC1C_MST = 0;             // STOP bit;
     rd_data = IIC1D;           // save received data from slave;
     &lt;FONT color="#ff0000"&gt;IIC1C_IICEN = 0;           // deactivate IIC module;&lt;/FONT&gt;
     return rd_data;            
}
//-------------------------------------------------------------------------------&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 29 Jun 2010 22:09:52 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138223#M4910</guid>
      <dc:creator>irob</dc:creator>
      <dc:date>2010-06-29T22:09:52Z</dc:date>
    </item>
    <item>
      <title>Re: AN3291 oddity (problems with I2C device on QG8)</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138224#M4911</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I'm using a&amp;nbsp;MC9S08SH16 and experiencing the same problems, e.g., works, if at all, only when single stepping. &amp;nbsp;So it doesn't appear to be just the QG8.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I'm glad to see activity on this thread again and would love to receive answers to the series of questions I raised in my message of&amp;nbsp;&lt;SPAN class="local-date"&gt;2009-11-29&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN class="local-time"&gt;07:34 PM.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="local-time"&gt;Thanks,&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="local-time"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Richly&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 03 Jul 2010 12:18:17 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138224#M4911</guid>
      <dc:creator>Richly</dc:creator>
      <dc:date>2010-07-03T12:18:17Z</dc:date>
    </item>
    <item>
      <title>Re: AN3291 oddity (problems with I2C device on QG8)</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138225#M4912</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Richly, have you tried enabling the I2C module in your I2C write/read functions first, then disabling after complete?&amp;nbsp; These steps got it working for me outside of the debugger.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 06 Jul 2010 23:20:08 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/AN3291-oddity-problems-with-I2C-device-on-QG8/m-p/138225#M4912</guid>
      <dc:creator>irob</dc:creator>
      <dc:date>2010-07-06T23:20:08Z</dc:date>
    </item>
  </channel>
</rss>

