0% found this document useful (0 votes)
131 views

I2c EEPROM FULL CODE

The document contains code for I2C communication on an LPC2148 microcontroller. It includes functions for initializing I2C and timers, reading and writing data from an EEPROM device over I2C, and transmitting status information over UART. The main function demonstrates reading and writing data to the EEPROM using the I2C functions and displaying the results over UART.

Uploaded by

Sumathi Anand
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
131 views

I2c EEPROM FULL CODE

The document contains code for I2C communication on an LPC2148 microcontroller. It includes functions for initializing I2C and timers, reading and writing data from an EEPROM device over I2C, and transmitting status information over UART. The main function demonstrates reading and writing data to the EEPROM using the I2C functions and displaying the results over UART.

Uploaded by

Sumathi Anand
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 24

(1)i2c.

c
/
*************************************************************************************
*********
File

: I2C.c

Date

: Jan 2013

Target

: LPC2148

Description : Functions related to the I2C


*************************************************************************************
**********/
#include <LPC214X.H>
#include <Stdio.h>
#include "Type.h"
#include "I2C.h"
#include "TIMER.h"
/***************************************************
Contains all EEPROM related functions.
Writing to and reading from the EEPROM fuctions.
All the user data, settings and logged data
will goes into EEPROM.
I2C0 is used for interfacing.
****************************************************
*/

/*
Initialises the I2C protocol and port pins.
*/
void I2C_Init (void)
{
// Power on I2C0 peripheral

PCONP

|= 0x00000080;

// Define port pin as SDA and SCL


PINSEL0

|= 0x00000050 ;

I2C0CONCLR = 0x6C;

// clear all I2C config bits

I2C0CONSET = 0x40;

// set I2EN

// I2C Clock Duty Cycle (high and low)


I2C0SCLH

= PERIFERAL_OPERATING_FREQUENCY_IN_HZ/

(2*EEPROM_OPERATING_FREQUENCY_IN_HZ);
I2C0SCLL

= PERIFERAL_OPERATING_FREQUENCY_IN_HZ/

(2*EEPROM_OPERATING_FREQUENCY_IN_HZ);
}

/*
Waits until given status occured.
Return:

True on status occured and


False on time out

*/
BOOL I2C_WaitStatus (uint8 u8status)
{
TIMER0_RESET();
TIMER0_ENABLE();
while (T0TC < EEPROM_WAIT_TIME_OUT)
{
if (I2C0CONSET & 8) // poll SI bit
{
if (I2C0STAT == u8status)
{
TIMER0_DISABLE();
return TRUE;

}
}
}
TIMER0_DISABLE();
return FALSE;
}

/*
Reads data from EEPROM.
Return:

True on valid data and


False on time out or any error with device

*/
BOOL I2C_ReadFromEEPROM (uint32 u32startAddr, uint8 *u8ptr2arr, uint32 u32len)
{
uint32u32i;
// Check for upper limit
if (u32startAddr + u32len > EEPROM_SIZE)
return FALSE;
for (u32i=0;u32i<u32len;u32i++)
{
I2C0CONSET = 0x20;
if (!I2C_WaitStatus(0x08))

// Start set
// 0x08: ready for device address

return FALSE;

I2C0DAT

= EEPROM_DEVADDR;// addr[0]=0 means I2C write

I2C0CONCLR = 0x2C;
if (!I2C_WaitStatus(0x18))

// clear all except I2EN


// 0x18: ready for data byte

return FALSE;
// Transmit start address - Dummy byte write
I2C0DAT
#ifndef

EEPROM_24C02

= (u32startAddr & 0x000000FF) ;

I2C0CONCLR = 0x2C;
if (!I2C_WaitStatus(0x28))

// clear all except I2EN


// 0x28: ACK has been received

return FALSE;
I2C0CONCLR = 0x08;
I2C0DAT

// clear SI flag

= ((u32startAddr & 0x0000FF00)>>8) &0xFF;

#endif
I2C0CONCLR = 0x2C;
if (!I2C_WaitStatus(0x28))

// clear all except I2EN


// 0x28: ACK has been received

return FALSE;
I2C0CONCLR = 0x08;

// clear SI flag

I2C0CONSET = 0x10;

// generate stop condition

// Read data - Sequential mode.


I2C0CONSET = 0x20;
if (!I2C_WaitStatus(0x08))

// Start set
// 0x08: ready for device address

return FALSE;
I2C0DAT

= EEPROM_DEVADDR|0x01;

// addr[0]=1

means I2C read


I2C0CONCLR = 0x28;
if (!I2C_WaitStatus(0x40))

// clear all except I2EN and AA


// 0x40: ready for data byte

return FALSE;
I2C0CONCLR = 0x2C;
if (!I2C_WaitStatus(0x58))

// clear all except I2EN


// 0x58: data byte received return ACK

return FALSE;
u8ptr2arr[u32i]

= (uint8)I2C0DAT ;

u32startAddr++;
I2C0CONSET = 0x10;
I2C0CONCLR = 0x2C;
}
return TRUE;
}

// generate stop condition

/*
Writes data to EEPROM.
Return:

True on successful write and


False on time out or any error with device

*/
BOOL I2C_WriteToEEPROM (uint32 u32startAddr, uint8 *u8ptr2arr, uint32 u32len)
{
uint32u32i,u32j;
// Check for upper limit
if (u32startAddr + u32len > EEPROM_SIZE)
return FALSE;
// write data byte wise
for (u32i = 0; u32i < u32len; u32i++)
{
I2C0CONSET = 0x20;
if (!I2C_WaitStatus(0x08))

// Start set
// 0x08: ready for device address

return FALSE;

I2C0DAT

= EEPROM_DEVADDR;// addr[0]=0 means I2C write

I2C0CONCLR = 0x2C;
if (!I2C_WaitStatus(0x18))

// clear all except I2EN


// 0x18: ready for data byte

return FALSE;

// Transmit start address


I2C0DAT
#ifndef

= (u32startAddr & 0x000000FF);

EEPROM_24C02
I2C0CONCLR = 0x2C;
if (!I2C_WaitStatus(0x28))

// clear all except I2EN


// 0x28: ACK has been received

return FALSE;

//I2C0CONCLR

= 0x08;

// clear SI flag

I2C0DAT

= ((u32startAddr & 0x0000FF00)>>8) &0xFF;

#endif
I2C0CONCLR = 0x2C;

// clear all except I2EN

if (!I2C_WaitStatus(0x28))

// 0x28: ACK has been received

return FALSE;

I2C0DAT

= (u8ptr2arr[u32i])&0x000000FF;

u32startAddr++;
I2C0CONCLR = 0x2C;

// clear all except I2EN

if (!I2C_WaitStatus(0x28))

// 0x28: ACK has been received

return FALSE;

I2C0CONSET = 0x10;

// generate stop condition

I2C0CONCLR = 0x2C;
// Poll for write done
for (u32j=20;u32j>0;u32j--)
{
I2C0CONSET = 0x20;

// Start set

if (!I2C_WaitStatus(0x08)) // 0x08: ready for device address


return FALSE;
I2C0DAT

= EEPROM_DEVADDR;// addr[0]=0 means

I2C write
I2C0CONCLR = 0x2C;

// clear all except I2EN

if (I2C_WaitStatus(0x18)) // 0x18: ready for data byte


break;
else

{
I2C0CONCLR = 0x2C;
I2C0CONSET = 0x10;

// generate stop condition

I2C0CONCLR = 0x2C;
}
}
I2C0CONSET = 0x10;

// generate stop condition

I2C0CONCLR = 0x2C;
}
return TRUE;
}

(2)main.c
/
******************************************************************
*********************************************
Project

: I2CLPC2148

File
Date
Target

: main.c
: May 2016
: LPC2148

Description : Functions related to the I2C EEPROM. The program


reads and write the data in EEPROM through I2C
******************************************************************
**********************************************/
#include <LPC214X.H>
#include <Stdio.h>
#include "Type.h"
#include "uart.h"
#include "I2C.h"
#include "TIMER.h"
/***************************************************
Main function.
***************************************************/
int main(void)
{
uint8 write_buffer[20] = {'B', 'I', 'N', 'A', 'R', 'Y',0};
uint8 read_buffer[20];
uint32 delay;
PINSEL0 |= 0x00000005 ;
UART0_Init(); // Initialize UART0
I2C_Init();

// Initialize I2C0

TIMER_Init();

// Initialize Timer

UART0_Write_Text("********* LPC2148 ARM7 I2C EEPROM


Demo **********\n\n\r");
UART0_Write_Text("Initialization done. \n\r\n");
while(1)
{
if (!I2C_WriteToEEPROM(0, write_buffer, 20))
write into EEPROM
UART0_Write_Text("\nMemory write error.");
if (!I2C_ReadFromEEPROM(0, read_buffer, 20))
// read from EEPROM
UART0_Write_Text("\nMemory Read error..");
UART0_Write_Text("\n\r The Read Data are: \t");
UART0_Write_Text((char *)read_buffer);
// display data on serial port
UART0_Write_Text("\n\r");
for(delay=0;delay<=5000000;delay++);
}
//return 0 ;
}

//

(3)timer.c
/
******************************************************************
****************************
File
Date
Target

: Timer.c
: Jan 2013
: LPC2148

Description : Functions related to the Timer


******************************************************************
*****************************/

#include <LPC214X.H>
#include "Type.h"
#include "Timer.h"
/**************************************************
Timer0 is used for delay in micro sec
Timer1 is used for time out delay
Timer is initialized to simply count at a specified
frequency(Configuration.h).
Count can be read from register TC.
****************************************************/

/*Initialises the timers*/


void TIMER_Init (void)
{
// Power ON timer peripheral
PCONP

|= 0x00000006;

// TPC: Timer Prescaler counter


// the counter is incremented once every TPC+1 cycles of
PCLK
T0PR= PRESCALER0;
//T1PR

= PRESCALER1;

// TCR: Timer Control Register


// 2: reset counters (both timer and prescaler)
// 1: enable counting
T0TCR=2;
//T1TCR=2;
}
/*waits for next tick in timer*/
void TIMER_WaitForNextTick (void)
{

uint32 start=T0TC;
while (T0TC==start) {}

// wait until timer counter

changes, then leave


}
(4)uart.c
/
******************************************************************
****************************
File
Date
Target

: UART.c
: Jan 2013
: LPC2148

Description : Functions related to the UART)


******************************************************************
*****************************/
#include <LPC21xx.h>
#include "TYPE.h"

#include "UART.h"
/***************UART-0 Functions**************/
void UART0_Init(void)
{
PINSEL0 |= 0x00000005;

//P0.0 as TX0 and P0.1 as

RX0
U0LCR = 0x83;

//Enable

access to Divisor Latches


//and Set 8 bit Character Length with 1 Stop bit and Parity
Disabled
//Access to Divisor Latches is Enabled, in order to write Baud
Rate Generator Registers
//Values to be written in Baud Rate Registers U0DLM and
U0LL
/*
Formula is
Baud_Rate = PCLK*MulVal /
[(16*(256*U0DLM+U0DLL)*(MulVal + DivAddVal))]
Example:MulVal = 1;
DivAddVal = 0;
Baud_Rate = 9600;
PCLK = 15MHz

U0DLM = 0;
Hence,
U0DLL = 15000000/(9600*16) = 97.65625 = 98
U0DLL = 98 = 0x62
*/
U0DLM = 0x00;
U0DLL = 0x62;
//Baud Rate of 9600
U0LCR = 0x03;
//Disable Access to Divisor Latches
}
void UART0_Write(unsigned char value)
{
/*
THRE bit can be extracted by this U0LSR & 0x20
THRE = 0 means data is present.
THRE = 1 means register is empty.
In order to transmit data, we have to wait will the THRE = 1,
then only we can transmit data.
*/
while(!(U0LSR&0x20));
0 stay here
U0THR = value;
}

//THRE =

void UART0_Write_Text(char * msg)


{
while(*msg)
{
UART0_Write(*msg);
msg++;
}
}
unsigned char UART0_Read(void)
{
/*
Receiver Data Ready = U0LSR.0 bit
RDR bit can be extracted by this U0LSR & 0x01
RDR = 0 means no Data is Received in U0RBR
RDR = 1 means that Data is present in U0RBR
*/
while(!(U0LSR & 0x01));
stay here
return (U0RBR);
}
/***************UART-1 Functions**************/
void UART1_Init(void)
{

//RDR = 0

PINSEL0 |= 0x00050000;

//P0.8 as TX1 and P0.9 as

RX1
U1LCR = 0x83;

//Enable

access to Divisor Latches


//and Set 8 bit Character Length with 1 Stop bit and Parity
Disabled
//Access to Divisor Latches is Enabled, in order to write Baud
Rate Generator Registers
//Values to be written in Baud Rate Registers U0DLM and
U0LL
/*
Formula is
Baud_Rate = PCLK*MulVal /
[(16*(256*U0DLM+U0DLL)*(MulVal + DivAddVal))]
Example:MulVal = 1;
DivAddVal = 0;
Baud_Rate = 9600;
PCLK = 15MHz
U0DLM = 0;
Hence,
U0DLL = 15000000/(9600*16) = 97.65625 = 98
U0DLL = 98 = 0x62

*/
U1DLM = 0x00;
U1DLL = 0x62;
//Baud Rate of 9600
U1LCR = 0x03;
//Disable Access to Divisor Latches
}
void UART1_Write(unsigned char value)
{
/*
THRE bit can be extracted by this U0LSR & 0x20
THRE = 0 means data is present.
THRE = 1 means register is empty.
In order to transmit data, we have to wait will the THRE = 1,
then only we can transmit data.
*/
while(!(U1LSR&0x20));
0 stay here
U1THR = value;
}
void UART1_Write_Text(unsigned char * msg)
{
while(*msg)

//THRE =

{
UART1_Write(*msg);
msg++;
}
}
unsigned char UART1_Read(void)
{
/*
Receiver Data Ready = U0LSR.0 bit
RDR bit can be extracted by this U0LSR & 0x01
RDR = 0 means no Data is Received in U0RBR
RDR = 1 means that Data is present in U0RBR
*/
while(!(U1LSR & 0x01));

//RDR = 0

stay here
return (U1RBR);
}
(5)i2c.h
#ifndef I2C_H
#define I2C_H
/* Settings */
#define

PERIFERAL_OPERATING_FREQUENCY_IN_HZ

#define

EEPROM_OPERATING_FREQUENCY_IN_HZ50000

#define EEPROM_DEVADDR

14745600
0xA0

#define

EEPROM_24C512

// EEPROM IC used
#define

EEPROM_SIZE

0xFFFF

// Size
#define

EEPROM_WAIT_TIME_OUT

//EEPROM_24C02

size 0x0000FF

//EEPROM_24C04

size 0x0001FF

//EEPROM_24C08

size 0x0003FF

//EEPROM_24C16

size 0x0007FF

//EEPROM_24C32

size 0x000FFF

//EEPROM_24C64

size 0x001FFF

5000 // 1msec

//EEPROM_24C128 size 0x003FFF


//EEPROM_24C256 size 0x007FFF
//EEPROM_24C512 size 0x00FFFF

/* Function Definations */
extern

void I2C_Init (void);

extern

BOOL

I2C_WaitStatus (uint8 u8status);

extern

BOOL

I2C_WriteToEEPROM (uint32 u32startAddr,

uint8 *u8ptr2arr, uint32 u32len);


extern

BOOL

I2C_ReadFromEEPROM (uint32 u32startAddr,

uint8 *u8ptr2arr, uint32 u32len);


#endif //I2C_H

(6)timer.h
/
******************************************************************
****************************
File

: Timer.h

Date

: Jan 2013

Target

: LPC2148

Description : Functions related to the Timer


******************************************************************
*****************************/
#ifndef TIMER_H
#define TIMER_H
/* Prescaler */
#define PERIFERAL_OPERATING_FREQUENCY_IN_HZ

14745600

#define DESIRED_COUNT_FREQ0

1000000

//1MHz

#define PRESCALER0
((PERIFERAL_OPERATING_FREQUENCY_IN_HZ/DESIRED_COUNT_FR
EQ0)-1)
//#define PRESCALER1
((PERIFERAL_OPERATING_FREQUENCY_IN_HZ/DESIRED_COUNT_FR
EQ1)-1)

#define

TIMER0_RESET()

T0TCR=2

#define

TIMER0_ENABLE()

T0TCR=1

#define

TIMER0_DISABLE()

T0TCR=0

/* Function declrations */
extern void TIMER_Init (void);
extern void TIMER_WaitForNextTick (void);
#endif /* TIMER_H */
(7) type.h
#ifndef TYPE_H
#define TYPE_H
#ifndef NULL
#define NULL

(0)

#endif
#ifndef FALSE
#define FALSE (0)
#endif
#ifndef TRUE
#define TRUE

(1)

#endif
/* Arm data types */

typedef unsigned char

uint8;

typedef unsigned short int

uint16;

typedef unsigned int

uint32;

typedef char

int8;

typedef short int

int16;

typedef int

int32;

typedef unsigned char

BOOL;

/*
Data Type

Actual Cdata type Bytes allocated.

uint8

unsigned char

int8

char

1
1

uint16

unsigned short

int16

short

uint32

unsigned long

int32

long

float32

32 bit float

float64

double

*/
/*
Data type Short form
int8

i8

uint8

u8

int16

i16

uint16

u16

int32

i32

uint32

u32

4
8

float32

fl32

float64

fl64

pointer

ptr

bool

*/
#endif // TYPE_H
(8)uart.h
/
******************************************************************
****************************
File
Date

: UART.h
: Jan 2013

Target

: LPC2148

Description : Functions related to the UART)


******************************************************************
*****************************/
#ifndef UART_H
#define UART_H
void UART0_Init(void);
void UART0_Write(unsigned char value);
void UART0_Write_Text(char *msg);
unsigned char UART0_Read(void);
void UART1_Init(void);
void UART1_Write(unsigned char value);

void UART1_Write_Text(unsigned char *msg);


unsigned char UART1_Read(void);
#endif /* UART0_H */

You might also like