Inter-integrated circuit أو الـ I2C هو نظام لتبادل البيانات بطريقــة تسلسليــة بين المتحكمات الدقيقة والدوائر المتكاملة المتخصصة من الجيل الجديد. يتم استخدامه عندما تكون المسافة بينهما قصيرة (عادةً ما يكون جهاز الاستقبال والإرسال على نفس اللوحة المطبوعة). يتم إنشاء الاتصال عبر طرفين. يستخدم أحدهما لنقل البيانات والآخر يستخدم للمزامنة (إشارة الساعة).
كما هو موضح في الشكل التالي، جهاز واحد هو دائمًا جهاز سيــد Master. يقوم بإجراء معالجة لشريحة تابعة Slave واحدة قبل بدء الاتصال. وبهذه الطريقة، يمكن لوحدة تحكم دقيقة واحدة التواصل مع 112 جهازًا مختلفًا. معدل الباود عادة ما يكون 100 كيلو بايت/ثانية (الوضع القياسي) أو 10 كيلو بايت/ثانية (وضع معدل الباود البطيء). ظهرت مؤخرًا أنظمة بمعدل نقل بيانات يبلغ 3.4 ميجا بايت / ثانية. المسافة بين الأجهزة التي تتواصل عبر ناقل I2C تقتصر على عدة أمتار.
يتكون ناقل I2C من إشارتين همـا SCL وهي إشارة الساعة، و SDA هي إشارة البيانات. يقوم الجهــاز السيد دائمًا بإنشاء إشارة الساعة. قد تجبر بعض الأجهزة التابعة الساعة على الانخفاض في بعض الأحيان لتأخير إرسال المزيد من البيانات للسيد (أو لطلب المزيد من الوقت لإعداد البيانات قبل أن يحاول السيد إيقافها). يُعرف هذا باسم "تمدد الساعة clock stretching".
فيما يلي الأرجــل المستخدمــة مع الـ I2C في لوحــات الأردوينــو المختلفــة
لدينــا وضعين لتوصيل لوحتين من الأردوينــو ببعضهمــا عن طريق الـ I2C – كــود للجهـاز الـMaster و كــود للجهــاز الخــادم Slave – الوضعين همـا:
الجهــاز السيد مرســل Master Transmitter
تُستخدم الدوال التالية لتهيئة مكتبة Wire و توصيـل ناقل I2C كسيــد أو تابع. يتم استدعاء هذا عادة مرة واحدة فقط.
مثـــال
#include <Wire.h> //include wire library
void setup() //this will run only once {
Wire.begin(); // join i2c bus as master
}
short age = 0;
void loop() {
Wire.beginTransmission(2);
// transmit to device #2
Wire.write("age is = ");
Wire.write(age); // sends one byte
Wire.endTransmission(); // stop transmitting
delay(1000);
}
الجهــاز التابــع كمستقبـــل Slave Reciver
يتم استخدام الدوال التالية -
مثــال
#include <Wire.h> //include wire library
void setup() { //this will run only once
Wire.begin(2); // join i2c bus with address #2
Wire.onReceive(receiveEvent); // call receiveEvent when the master send any thing
Serial.begin(9600); // start serial for output to print what we receive
}
void loop() {
delay(250);
}
//-----this function will execute whenever data is received from master-----//
void receiveEvent(int howMany) {
while (Wire.available()>1) // loop through all but the last {
char c = Wire.read(); // receive byte as a character
Serial.print(c); // print the character
}
}
الجهــاز السيد كمستقبـــل
تمت برمجة برنامج الـ Master ليطلب ثم يقرأ بايتات من البيانات التي يتم إرسالها من الأردوينــو التابــع ذو العنوان الفريد.
يتم استخدام الدوال التالية -
مثـــال
#include <Wire.h> //include wire library void setup() {
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial for output
}
void loop() {
Wire.requestFrom(2, 1); // request 1 bytes from slave device #2
while (Wire.available()) // slave may send less than requested {
char c = Wire.read(); // receive a byte as character
Serial.print(c); // print the character
}
delay(500);
}
الجهـــاز التابــع كمرســـل
يتـــم إستخدام الدوال التاليــة
مثــــال
#include <Wire.h>
void setup() {
Wire.begin(2); // join i2c bus with address #2
Wire.onRequest(requestEvent); // register event
}
Byte x = 0;
void loop() {
delay(100);
}
// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent() {
Wire.write(x); // respond with message of 1 bytes as expected by master
x++;
}
الطائــف - المملكــة العربيــة السعــوديـة
المختــرع المجنــون © جميـــع الحقــوق محفوظــة