This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

LPC1111 I2C not working

Hi there,

I am newer at ARM programming but I need to get I2C communication working to read from accelerometer. For beggining I would like to get at least some bits transfered on I2C pins. In this forum I have found I2C example: http://www.keil.com/forum/58249/

I have included it to me project so now it should send some data on timmer interrupt. But at I2C pins connected scope only shows 1 pulse down to 0V at timmer interrupts.

Any help would be appreciate.

Please find me source code bellow:

#include "LPC11xx.h" /* LPC11xx definitions */
#include "gpio.h"
#include <cr_section_macros.h>
#include <NXP/crp.h>

// Variable to store CRP value in. Will be placed automatically
// by the linker when "Enable Code Read Protect" selected.
// See crp.h header for more information
__CRP const unsigned int CRP_WORD = CRP_NO_CRP ;

int i=0;
unsigned int status = 0;

void timer16_0_setup(void)
{ //Set up 16 bit timer LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7); //enable timer clock LPC_TMR16B0->PR = 48000-1; //prescaler 48000 = 1ms LPC_TMR16B0->MCR = (3<<3); //interrupt and reset counter match1 LPC_TMR16B0->CCR = 0; //timer mode LPC_TMR16B0->MR1 = 1000-1; //set match1 time in us NVIC_EnableIRQ(TIMER_16_0_IRQn); //enable interrupt LPC_TMR16B0->TCR = 1; //start timer
}

void I2C_Init(void)
{ LPC_SYSCON->PRESETCTRL |= (1<<1); //De-Asserts Reset Signal to I2C LPC_SYSCON->SYSAHBCLKCTRL |= (1<<5); //Enable I2C Clock

LPC_IOCON->PIO0_4 &= ~0x3F; LPC_IOCON->PIO0_4 |= 0x01; //SCL

LPC_IOCON->PIO0_5 &= ~0x3F; LPC_IOCON->PIO0_5 |= 0x01; //SDA

//I2C 100 LPC_I2C->SCLH = 360; //I2PCLK is 72MHz LPC_I2C->SCLL = 360; //I2PCLK is 72MHz

LPC_I2C->CONCLR = 0xFF; //Clear All Flags LPC_I2C->CONSET = (1<<6); //I2C Interface Enable
} void I2C_Start(void)
{ LPC_I2C->CONCLR = 0X28; LPC_I2C->CONSET |= 0x20; //Set the Start Bit while(LPC_I2C->STAT!=0x08); //Wait for the Status Bit
} void I2C_Restart(void)
{ LPC_I2C->CONCLR = 0X28; LPC_I2C->CONSET |= 0x20; //Set the Start Bit while(LPC_I2C->STAT!=0x10); //Wait for the Status Bit
} void I2C_Stop(void)
{ LPC_I2C->CONSET |= 0x14; //Stop I2C LPC_I2C->CONCLR = 0x08;
} void I2C_Write(unsigned char data,unsigned char status)
{ LPC_I2C->CONCLR = 0X28; LPC_I2C->DAT = data; LPC_I2C->CONCLR = 0X28; //Clear Start Flag and SI Interrupt //while(LPC_I2C->STAT!=status); //Wait for the Status Byte
} unsigned char I2C_Read(void)
{ LPC_I2C->CONCLR = 0X2C; //Cleat SI and Asset Acknowledgment Flag while(LPC_I2C->STAT!=0x58); return(LPC_I2C->DAT);
}

//Timer interrupt
void TIMER16_0_IRQHandler(void)
{ if(LPC_TMR16B0->IR & (1<<1)) //match1 interrupt? { if (i==0) {GPIOSetValue( 1, 7, 1 ); i=1;} else {GPIOSetValue( 1, 7, 0 ); i=0;}

I2C_Start(); I2C_Write(100,1); I2C_Stop();

} LPC_TMR16B0->IR = (1<<1); //reset flag

} //end match1 interrupt

int main (void) {

//Set up timer timer16_0_setup(); I2C_Init(); GPIOInit();

// Set port for LED to output GPIOSetDir( 1, 7, 1 );

while (1) // Loop forever {

} }