Code for I2C interface using 8051
#include<reg51.h>
#include<string.h>
sbit SDA=P1^2;
sbit SCL=P1^3;
void serial_init(void);
void serial_char_tx(unsigned char x);
void serial_string_tx(unsigned char *x);
void I2CInit()
{
SDA = 1;
SCL = 1;
}
void I2CStart()
{
SCL = 1;
SDA = 0;
SCL = 0;
}
void I2CRestart()
{
SCL = 0;
SDA = 1;
SCL = 1;
SDA = 0;
}
void I2CStop()
{
SCL = 0;
SDA = 0;
SCL = 1;
SDA = 1;
}
void I2CAck()
{
SDA = 0;
SCL = 1;
SCL = 0;
SDA = 1;
}
void I2CNak()
{
SDA = 1;
SCL = 1;
SCL = 0;
}
void I2CSend(unsigned char Data)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
SCL = 0;
if ((Data & 0x80) == 0)
SDA = 0;
else
SDA = 1;
SCL = 1;
Data <<= 1;
}
SCL = 0;
SDA = 1;
}
unsigned char I2CRead (bit ACK_Bit)
{
unsigned char Data;
unsigned int i;
I2CStart();
I2CSend(0xA1);
SDA = 1;
for (i=0;i<8;i++)
{
SCL = 1;
Data<<= 1;
Data = (Data | SDA);
SCL = 0;
}
if (ACK_Bit == 1)
{
SDA = 0; // Send ACK
}
else
{
SDA = 1; // Send NO ACK
SCL = 1;
SCL = 0;
}
I2CStop();
return Data;
}
// Read 1 byte form I2C
void ReadBYTE(unsigned int Addr)
{
I2CStart();
I2CSend(0xA0);
I2CSend((unsigned char)(Addr>>8)&0xFF);
I2CSend((unsigned char)Addr&0xFF);
}
// Write 1 byte to I2C
void WriteBYTE(unsigned int Addr)
{
I2CStart();
I2CSend(0xA0);
I2CSend((unsigned char)(Addr>>8)&0xFF); // send address high
I2CSend((unsigned char)Addr&0xFF); // send address low
}
void main()
{
unsigned int i;
unsigned char a[9]="Hello AB";
unsigned char b[9];
serial_init();
I2CInit();
while (1)
{
//I2CStart(); // data write
WriteBYTE(0x0000);
for(i=0;i<=7;i++)
{
I2CSend(a[i]);
I2CAck();
}
I2CStop();
//I2CStart(); // data read
ReadBYTE(0x0000);
for (i=0;i<=7;i++)
{
b[i]=I2CRead(1);
if (i==7)
I2CNak();
else
I2CAck();
}
I2CStop();
serial_string_tx(b);
while(1);
}
}
void serial_init(void)
{
SCON=0x40;
TMOD=0x20;
TH1=-3;
TR1=1;
}
void serial_char_tx(unsigned char x)
{
SBUF=x;
while(TI!=1);
TI=0;
}
void serial_string_tx(unsigned char *x)
{
while(*x!='\0')
{
serial_char_tx(*x);
x++;
}
}
#include<string.h>
sbit SDA=P1^2;
sbit SCL=P1^3;
void serial_init(void);
void serial_char_tx(unsigned char x);
void serial_string_tx(unsigned char *x);
void I2CInit()
{
SDA = 1;
SCL = 1;
}
void I2CStart()
{
SCL = 1;
SDA = 0;
SCL = 0;
}
void I2CRestart()
{
SCL = 0;
SDA = 1;
SCL = 1;
SDA = 0;
}
void I2CStop()
{
SCL = 0;
SDA = 0;
SCL = 1;
SDA = 1;
}
void I2CAck()
{
SDA = 0;
SCL = 1;
SCL = 0;
SDA = 1;
}
void I2CNak()
{
SDA = 1;
SCL = 1;
SCL = 0;
}
void I2CSend(unsigned char Data)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
SCL = 0;
if ((Data & 0x80) == 0)
SDA = 0;
else
SDA = 1;
SCL = 1;
Data <<= 1;
}
SCL = 0;
SDA = 1;
}
unsigned char I2CRead (bit ACK_Bit)
{
unsigned char Data;
unsigned int i;
I2CStart();
I2CSend(0xA1);
SDA = 1;
for (i=0;i<8;i++)
{
SCL = 1;
Data<<= 1;
Data = (Data | SDA);
SCL = 0;
}
if (ACK_Bit == 1)
{
SDA = 0; // Send ACK
}
else
{
SDA = 1; // Send NO ACK
SCL = 1;
SCL = 0;
}
I2CStop();
return Data;
}
// Read 1 byte form I2C
void ReadBYTE(unsigned int Addr)
{
I2CStart();
I2CSend(0xA0);
I2CSend((unsigned char)(Addr>>8)&0xFF);
I2CSend((unsigned char)Addr&0xFF);
}
// Write 1 byte to I2C
void WriteBYTE(unsigned int Addr)
{
I2CStart();
I2CSend(0xA0);
I2CSend((unsigned char)(Addr>>8)&0xFF); // send address high
I2CSend((unsigned char)Addr&0xFF); // send address low
}
void main()
{
unsigned int i;
unsigned char a[9]="Hello AB";
unsigned char b[9];
serial_init();
I2CInit();
while (1)
{
//I2CStart(); // data write
WriteBYTE(0x0000);
for(i=0;i<=7;i++)
{
I2CSend(a[i]);
I2CAck();
}
I2CStop();
//I2CStart(); // data read
ReadBYTE(0x0000);
for (i=0;i<=7;i++)
{
b[i]=I2CRead(1);
if (i==7)
I2CNak();
else
I2CAck();
}
I2CStop();
serial_string_tx(b);
while(1);
}
}
void serial_init(void)
{
SCON=0x40;
TMOD=0x20;
TH1=-3;
TR1=1;
}
void serial_char_tx(unsigned char x)
{
SBUF=x;
while(TI!=1);
TI=0;
}
void serial_string_tx(unsigned char *x)
{
while(*x!='\0')
{
serial_char_tx(*x);
x++;
}
}