I2C on LPC810/LPC812

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

I2C on LPC810/LPC812

1,385 Views
stefanoskiakas
Contributor I

I got the blink LED program to work and have been able to use the LPC810/812 to control WS2812 LED. Now I want to add some more functionality by using the I2C ROM API using LPCOpen. Unfortunately I am experiencing some issues in getting the I2C functionality to work on the LPC810/812.

 

I have hooked up a scope to the SDA/SCL pins but I see no activity on the pins. Here is the code I am using to try and read the sensor.

 

I created the following code based on the examples provided for LPCOpen, to read an I2C sensor, an infrared temperature sensor made my Melexis MLX90614. The readI2C() function is only returning one byte for now for testing purposes. I am only including the I2C portion of the code, which should be reading the sensor using the I2C bus.

 

I am wondering why I am not seeing any signal on the scope for the SDA/SCL lines? Can someone provide me with a link to a working example of using the I2C bus with the LPC810/812 using LPCOpen?

 

Thank you,

Stefanos

 

-----------

#include "chip.h"

#include <cr_section_macros.h>

 

#define I2C_BITRATE  (100000)

 

#define I2C_ADDR_TSENSOR   (0x5a)

#define TSENSOR_ADDR       (0x06)

 

#define TICKRATE_HZ        (10)

 

 

static I2C_HANDLE_T *i2cMaster;

static uint32_t      i2cMasterBuffer[0x20];

 

 

static void initializeSWM()

{

  Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM);

 

/* Connect the I2C_SDA and I2C_SCL signals to port pins(P0.10, P0.11) */

  Chip_SWM_MovablePinAssign(SWM_I2C_SDA_IO, 10);

  Chip_SWM_MovablePinAssign(SWM_I2C_SCL_IO, 11);

  Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_SWM);

}

 

 

static void initializeI2C()

{

    Chip_I2C_Init(LPC_I2C);

    i2cMaster = LPC_I2CD_API->i2c_setup(LPC_I2C_BASE, i2cMasterBuffer);

    LPC_I2CD_API->i2c_set_bitrate(i2cMaster, Chip_Clock_GetSystemClockRate(), I2C_BITRATE);

}

 

 

void delay(count)

{

  while(--count>=0)

  {

  __WFI();

  }

}

 

static uint8_t readI2C()

{

  uint8_t rxData[10];

I2C_PARAM_T param;

I2C_RESULT_T result;

 

  rxData[0] = I2C_ADDR_TSENSOR;

  rxData[1] = TSENSOR_ADDR;

 

  param.num_bytes_send = 0;

  param.num_bytes_rec = 3;

  param.buffer_ptr_rec = &rxData[0];

  param.stop_flag = 1;

 

  LPC_I2CD_API->i2c_set_timeout(i2cMaster, 100000);

  LPC_I2CD_API->i2c_master_receive_poll(i2cMaster, &param, &result);

  return (uint8_t) rxData[0];

}

 

 

 

 

int main(void) {

 

 

    SystemCoreClockUpdate();

 

 

    initializeSWM();

    initializeI2C();

 

    SysTick_Config(SystemCoreClock / TICKRATE_HZ);

    // Force the counter to be placed into memory

    volatile static int i = 0 ;

    // Enter an infinite loop, just incrementing a counter

    while(1) {

        i++ ;

        readI2C();

        delay(10);

   }

    return 0 ;

}

Tags (3)
0 Kudos
2 Replies

690 Views
Carlos_Mendoza
NXP Employee
NXP Employee

Hi Stefanos,

Are you using a NXP evaluation board? Which LCPOpen software package are you using? You can download the latest package from this page:

LPCOpen Software for LPC8XX|NXP

Thanks in advance!

Best Regards,

Carlos Mendoza

Technical Support Engineer

0 Kudos

690 Views
tiagofernandes
Contributor III

Hello, 

Rercently I have the same issue in the LPC82x and to be able to sign on pins I replace the following code lines

  Chip_SWM_MovablePinAssign(SWM_I2C_SDA_IO, 10);

  Chip_SWM_MovablePinAssign(SWM_I2C_SCL_IO, 11);

for this 
LPC_SWM->PINENABLE0 &= 0xFFFFE7FF;

and works. Other possible problem is Do you have the externall pull ups to the i2c bus? To verify if the Pins are ok set them to output and set like you want (on-3.3v or off-0v) and verify with a multimeter.

I hope I have been able to help.

Best Regards,

Tiago

0 Kudos