<?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 I2C driver for LPC11u67 in LPC Microcontrollers</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/I2C-driver-for-LPC11u67/m-p/522856#M5492</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by elgarbe on Fri Jul 10 06:44:58 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi, I'm working on reading a LM92 digital temp sensor.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm using this code:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
#include &amp;lt;board.h&amp;gt;
#include "LM92.h"

/*****************************************************************************
 * Private types/enumerations/variables
 ****************************************************************************/

/* I2CM transfer record */
static I2CM_XFER_T&amp;nbsp; i2cmXferRec;

/* 1Mbps I2C bit-rate */
#define I2C_BITRATE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (400000)
#define I2C_RD_CMD_BIT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (0x01)
#define I2C_FASTPLUS_BIT&amp;nbsp;&amp;nbsp;&amp;nbsp; (0)
#define I2C_ADDR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (0x48)

static volatile int intErrCode;

/*****************************************************************************
 * Public types/enumerations/variables
 ****************************************************************************/

/*****************************************************************************
 * Private functions
 ****************************************************************************/

/* Setup I2C handle and parameters */
void setupI2CMaster()
{
/* Enable I2C clock and reset I2C peripheral - the boot ROM does not
&amp;nbsp;&amp;nbsp; do this */
Chip_I2CM_Init(LPC_I2C0);

/* Setup I2CM transfer rate */
Chip_I2CM_SetBusSpeed(LPC_I2C0, I2C_BITRATE);
}

/* Function to wait for I2CM transfer completion */
static void WaitForI2cXferComplete(I2CM_XFER_T *xferRecPtr)
{
/* Test for still transferring data */
while (xferRecPtr-&amp;gt;status == I2CM_STATUS_BUSY) {
/* Sleep until next interrupt */
//__WFI();
}
}

/* Function to setup and execute I2C transfer request */
static void SetupXferRecAndExecute(uint8_t devAddr,
&amp;nbsp;&amp;nbsp; uint8_t *txBuffPtr,
&amp;nbsp;&amp;nbsp; uint16_t txSize,
&amp;nbsp;&amp;nbsp; uint8_t *rxBuffPtr,
&amp;nbsp;&amp;nbsp; uint16_t rxSize)
{
/* Setup I2C transfer record */
i2cmXferRec.slaveAddr = devAddr;
i2cmXferRec.options = 0;
i2cmXferRec.status = 0;
i2cmXferRec.txSz = txSize;
i2cmXferRec.rxSz = rxSize;
i2cmXferRec.txBuff = txBuffPtr;
i2cmXferRec.rxBuff = rxBuffPtr;
Chip_I2CM_Xfer(LPC_I2C0, &amp;amp;i2cmXferRec);

/* Wait for transfer completion */
WaitForI2cXferComplete(&amp;amp;i2cmXferRec);
}

/*****************************************************************************
 * Public functions
 ****************************************************************************/

/**
 * @briefHandle I2C0 interrupt by calling I2CM interrupt transfer handler
 * @returnNothing
 */
void I2C0_IRQHandler(void)
{
/* Call I2CM ISR function with the I2C device and transfer rec */
Chip_I2CM_XferHandler(LPC_I2C0, &amp;amp;i2cmXferRec);
}

/* Master I2CM receive in interrupt mode */

float LM92_ReadTemp()
{
uint8_t rx_buffer[3];
uint8_t tx_buffer[3];

/* Read LM92 temerature sensor */
SetupXferRecAndExecute(I2C_ADDR, tx_buffer, 1, rx_buffer, 2);

/* Test for valid operation */
if (i2cmXferRec.status == I2CM_STATUS_OK) {
/* Note results are only valid when there are no errors */
return(0.0625 * (((rx_buffer[0] &amp;lt;&amp;lt; 8) + rx_buffer[1]) &amp;gt;&amp;gt;3));
}
return (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;and set a timer to read data every 100mseg:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
void TIMER16_1_IRQHandler(void)
{
if (Chip_TIMER_MatchPending(LPC_TIMER16_1, 1))
{
Chip_TIMER_ClearMatch(LPC_TIMER16_1, 1);
temp = LM92_ReadTemp();
}
}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;the problem is that not all temp reading have good values. I mean, first reading have good temp value, next reding not, next reading not, next reading have good value and so. Good, wrong value seems to be a litle random.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I think the problem could be on WaitForI2cXferComplete. I have to remove WFI becouse of the rest of my code...&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm wondering what is the best driver for this kind of aplication. I try to test ROM I2C api, but I can't make it work.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Thank!&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 16:41:52 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T16:41:52Z</dc:date>
    <item>
      <title>I2C driver for LPC11u67</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/I2C-driver-for-LPC11u67/m-p/522856#M5492</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by elgarbe on Fri Jul 10 06:44:58 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi, I'm working on reading a LM92 digital temp sensor.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm using this code:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
#include &amp;lt;board.h&amp;gt;
#include "LM92.h"

/*****************************************************************************
 * Private types/enumerations/variables
 ****************************************************************************/

/* I2CM transfer record */
static I2CM_XFER_T&amp;nbsp; i2cmXferRec;

/* 1Mbps I2C bit-rate */
#define I2C_BITRATE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (400000)
#define I2C_RD_CMD_BIT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (0x01)
#define I2C_FASTPLUS_BIT&amp;nbsp;&amp;nbsp;&amp;nbsp; (0)
#define I2C_ADDR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (0x48)

static volatile int intErrCode;

/*****************************************************************************
 * Public types/enumerations/variables
 ****************************************************************************/

/*****************************************************************************
 * Private functions
 ****************************************************************************/

/* Setup I2C handle and parameters */
void setupI2CMaster()
{
/* Enable I2C clock and reset I2C peripheral - the boot ROM does not
&amp;nbsp;&amp;nbsp; do this */
Chip_I2CM_Init(LPC_I2C0);

/* Setup I2CM transfer rate */
Chip_I2CM_SetBusSpeed(LPC_I2C0, I2C_BITRATE);
}

/* Function to wait for I2CM transfer completion */
static void WaitForI2cXferComplete(I2CM_XFER_T *xferRecPtr)
{
/* Test for still transferring data */
while (xferRecPtr-&amp;gt;status == I2CM_STATUS_BUSY) {
/* Sleep until next interrupt */
//__WFI();
}
}

/* Function to setup and execute I2C transfer request */
static void SetupXferRecAndExecute(uint8_t devAddr,
&amp;nbsp;&amp;nbsp; uint8_t *txBuffPtr,
&amp;nbsp;&amp;nbsp; uint16_t txSize,
&amp;nbsp;&amp;nbsp; uint8_t *rxBuffPtr,
&amp;nbsp;&amp;nbsp; uint16_t rxSize)
{
/* Setup I2C transfer record */
i2cmXferRec.slaveAddr = devAddr;
i2cmXferRec.options = 0;
i2cmXferRec.status = 0;
i2cmXferRec.txSz = txSize;
i2cmXferRec.rxSz = rxSize;
i2cmXferRec.txBuff = txBuffPtr;
i2cmXferRec.rxBuff = rxBuffPtr;
Chip_I2CM_Xfer(LPC_I2C0, &amp;amp;i2cmXferRec);

/* Wait for transfer completion */
WaitForI2cXferComplete(&amp;amp;i2cmXferRec);
}

/*****************************************************************************
 * Public functions
 ****************************************************************************/

/**
 * @briefHandle I2C0 interrupt by calling I2CM interrupt transfer handler
 * @returnNothing
 */
void I2C0_IRQHandler(void)
{
/* Call I2CM ISR function with the I2C device and transfer rec */
Chip_I2CM_XferHandler(LPC_I2C0, &amp;amp;i2cmXferRec);
}

/* Master I2CM receive in interrupt mode */

float LM92_ReadTemp()
{
uint8_t rx_buffer[3];
uint8_t tx_buffer[3];

/* Read LM92 temerature sensor */
SetupXferRecAndExecute(I2C_ADDR, tx_buffer, 1, rx_buffer, 2);

/* Test for valid operation */
if (i2cmXferRec.status == I2CM_STATUS_OK) {
/* Note results are only valid when there are no errors */
return(0.0625 * (((rx_buffer[0] &amp;lt;&amp;lt; 8) + rx_buffer[1]) &amp;gt;&amp;gt;3));
}
return (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;and set a timer to read data every 100mseg:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
void TIMER16_1_IRQHandler(void)
{
if (Chip_TIMER_MatchPending(LPC_TIMER16_1, 1))
{
Chip_TIMER_ClearMatch(LPC_TIMER16_1, 1);
temp = LM92_ReadTemp();
}
}
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;the problem is that not all temp reading have good values. I mean, first reading have good temp value, next reding not, next reading not, next reading have good value and so. Good, wrong value seems to be a litle random.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I think the problem could be on WaitForI2cXferComplete. I have to remove WFI becouse of the rest of my code...&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm wondering what is the best driver for this kind of aplication. I try to test ROM I2C api, but I can't make it work.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Thank!&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 16:41:52 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/I2C-driver-for-LPC11u67/m-p/522856#M5492</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T16:41:52Z</dc:date>
    </item>
  </channel>
</rss>

