Content originally posted in LPCWare by audriusmerfeldas on Thu Dec 03 00:30:56 MST 2015
I have tried one more example. This doesn't freeze processor but still I dont get any signal on the SCL, SDA pins on the scope.
Here is the code I am using now:
#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
{
}
}
Any hints?