เชื่อมต่อระบบ I2C Bus เขียน/อ่าน EEPROM 24CXXได้

ระบบ I2C Bus (Inter-IC Communication) เป็นระบบสื่อสารข้อมูลที่ใช้สาย 2 สายในการส่งข้อมูลคือสาย SDA (Serial Data Line) และสาย SCL (Serial Clock Line) สาย SDA คือสายที่ใช้ในการส่งข้อมูล และสาย SCL เป็นสัญญาณนาฬิกาที่ใช้ในการกำหนดจังหวะการทำงาน ระบบ I2C Bus นี้ได้รับการพัฒนาจากบริษัทฟิลิป

ในปัจจุบันมีอุปกรณ์อิเล็กทรอนิกส์หลายตัวที่ใช้ระบบนี้ในการสื่อสาร ด้วยเหตุผลที่ว่าใช้สายสัญญาณน้อย รับส่งด้วยความเร็วสูง และสามารถต่อพ่วงอุปกรณ์ได้หลายตัว ทำได้โดยการกำหนด Address ของแต่ละตัวไม่ให้เหมือนกัน ในการทดลองนี้จะใช้ระบบ I2C ในการสื่อสารกับ EEPROM เบอร์ 24CXX รายละเอียดของระบบ I2C ศึกษาเพิ่มเติมได้ที่นี่

  • มาสเตอร์ (Master) คืออุปกรณ์ที่ทำการส่งข้อมูล
  • สเลฟ (Slave) คืออุปกรณ์ที่ทำการรับข้อมูล

Start I2c และ Stop I2C

ในการที่จะเริ่มติดต่อกับระบบ I2C Bus จำเป็นต้องมีการสร้างเงื่อนไขของสายสัญญาณ เพื่อให้อุปกรณ์สเลฟเตรียมตัวรับข้อมูล เงื่อนไขคือให้ SCL = 1 และให้ SDA เปลี่ยนจาก 1 เป็น 0 ดังรูปภาพ

ส่วนการหยุดการสื่อสารทำได้โดย ให้ SCL = 1 และให้ SDA เปลี่ยนจาก 1 เป็น 0 ดังรูปภาพ

Acknowledge

เมื่ออุปกรณ์มาสเตอร์ทำการส่งข้อมูลให้อุปกรณ์สเลฟครบ 8 บิตแล้ว อุปกรณ์สเลฟต้องทำการบอกว่าได้รับข้อมูลครบแล้ว โดยการส่งบิต acknowledge ออกไปที่สาย SDA ให้อุปกรณ์มาสเตอร์รู้เพื่อที่จะได้ส่งข้อมูลถัดไปมาให้อุปกรณ์สเลฟ จากรูปบิต acknowledge จะส่งออกไปจากอุปกรณ์สเลฟในสัญญาณนาฬิกาลูกที่ 9 การส่งบิต acknowledge ออกไปทำให้สภาวะที่สาย SDA มีค่าลอจิก 0

การทดลอง I2C อ่าน/เขียน EEPROM 24CXX

IC EEPROM เป็นไอซีหน่วยความจำแบบอนุกรมใช้การสื่อสารแบบ I2C ในการอ่านและเขียนเท่าที่เห็นทั่วไปมีอยู่ 2 บริษัทที่ทำขาย มีของ Atmel กับ ของ Microchip มีคุณสมบัติต่างๆคล้ายกัน ข้อแตกต่างที่เห็นได้ชัดคือของ Atmel เขียนได้ 1ล้านครั้ง ส่วน Microchip ได้ 10 ล้านครั้ง (t = 25 C,5.0 V) Code มีดังต่อไปนี้

//***********************************
//Programmer: Pratchaya Tongthong
//Tel: 0-6640-4025
//http://www.geocities.com/aon_micro
//***********************************
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>

// Define Port
sbit SDA = P1^0;
sbit SCL = P1^2;
sbit LED_R = P2^0; //LED red

// Define Register
unsigned char dat_buff[8];
bit check_wr = 0;

// Function
void init (void)
{
SCON = 0x52;
TMOD = 0x20;
TH1 = 0xfd;
TR1 = 1;

P2 = 0xff;
RST = 0;
SCL = 0;
SDA = 1;
}

void delay (void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}

void c_high (void)
{
SCL = 1;
delay();
}

void c_low (void)
{
SCL = 0;
delay();
}

void start_i2c (void)
{
SDA = 1;
c_high();
SDA = 0;
delay();
c_low();
}

void stop_i2c (void)
{
SDA = 0;
c_high();
SDA = 1;
}

bit wr_byte (unsigned char x) // Write 1 Byte
{ unsigned char i;
bit outport;
for (i=1;i<=8;i++)
{
outport = x & 0x80; //0x80 = 10000000B
SDA = outport;
x = x<<1;
c_high();
c_low();
}
SDA = 1;
c_high();
outport = SDA; // Check ACK
c_low();
if (outport == 1)
LED_R = 0;// LED red
else
check_wr = 1;
}

unsigned char rd_byte () // Read 1 Byte
{
unsigned char i,dat ;
bit inport;
dat = 0;
SDA = 1; // Important if SDA not set can read 1 byte only !!!
for (i=1;i<=8;i++)
{
c_high();
inport = SDA;
dat = dat<<1;
dat = dat|inport;
c_low();
}
return(dat);
}

// Send ACK
void ack (void)
{
SDA = 0;
_nop_();
c_high();
c_low();


}

// Clear Buffer
void clr_buff (void)
{
unsigned char i;
for (i=1;i<=8;i++)
dat_buff[i] = 0;
}

void delay_s (unsigned int count)
{
unsigned char i;
while (count)
{ for (i=0;i<=255;i++);
count--;}
}

//**************MAIN******************//
void main (void)
{
unsigned char i,j,k;
init();

printf("\nTest 24LCXX Write\n");
start_i2c();
wr_byte(0xa0); //Send write
wr_byte(0x00); //Send address

for (i=1;i<=16;i++)
{
wr_byte(i);
}
stop_i2c();
if (check_wr == 1)
printf("Write OK\n\n");
else
{printf("Write error!!!\n");}

init();
printf("\nTest 24LCXX Read");
start_i2c();
wr_byte(0xa0); //Send write
wr_byte(0x00); //Send address
start_i2c(); //Start again
wr_byte(0xa1); //Send read

for (j=1;j<=8;j++)
{
printf("\n");
for (k=1;k<=8;k++)
{
printf("%02bX ",rd_byte());
ack();
}
}
stop_i2c();

while(1);

}

หน้าถัดไป- - ->

 


Copyright © 2003 Aon micro. All rights reserved

E-mail:[email protected]

 

 

 

Hosted by www.Geocities.ws

1