ارتباط I2C و دستورات آن از مواردی است که در این قسمت به آن پرداخته می شود. همچنین برای یادگیری بهتر، نحوه ی خواندن اطلاعات از یک سنسور دما را با هم برنامه نویسی می کنیم.
I2C یک پروتکل (موافقت نامه) سریال برای ارسال و دریافت داده با دو سیم بین دستگاه هایی با سرعت پایین می باشد. یک پین ساعت یا Clock می باشد(SCL). و یک پین هم برای ارسال و دریافت “داده” می باشد(SDA). I2C به صورت Master و Slave می باشد. با لبه ی بالا رونده ی کلاک بیت ها ارسال می شود. اولین بیت ها برای آدرس است. و یک تک بیت برای تعیین نوشتن یا خواندن می باشد. در ادامه اطلاعات ارسال یا دریافت می شود. در آخر ارسال هر سری بیت یک تک بیت به عنوان تایید (knowledge) فرستاده می شود. داده ها به صورت بایت ارسال می شود.
وقتی که چند عدد Master و Slave داریم، دو سیم مربوط به I2C را Pullup می کنیم. که اگر دو Slave با هم اطلاعات فرستادن اتصال کوتاه نشود.
طریقه کار I2C هنگام نوشتن:
- آدرس Slave را ارسال می کنیم با تک بیت نوشتن.
- آدرس خانه ای از حافظه ی Slave را که می خواهیم در آن بنویسیم را می فرستیم.
- داده ای که قرار است ذخیره شود را می فرستیم.
طریقه کار I2C هنگام خواندن:
طریقه ی خواندن کمی پیچیده است.
- آدرس Slave را ارسال می کنیم با تک بیت نوشتن.
- آدرس حافظه ای که می خواهیم بخوانیم را ارسال می کنیم.
- آدرس Slave را دوباره ارسال می کنیم، این دفعه با تک بیت خواندن.
- داده ای را که از Slave ارسال می شود را می خوانیم.
در آردوینو لازم نیست که تک بیت های خواندن و نوشتن را دستی وارد کنیم. ولی طریقه ی کلی خواندن و نوشتن با I2C را توضیح دادیم تا ترتیب نوشتن برنامه را بدانیم.
پین های SDA و SCL در برهای آردوینو:
Board | I2C pins |
Uno, Ethernet | A4 (SDA), A5 (SCL) |
Mega2560 | 20 (SDA), 21 (SCL) |
Leonardo | 2 (SDA), 3 (SCL) |
Due | 20 (SDA), 21 (SCL), SDA1, SCL1 |
شروع کار با I2C:
برای استفاده از I2C ابتدا باید کتابخانه ی آن را فراخوانی کنیم.
#include <Wire.h>
بعد برای شروع اتصال به گذرگاه I2C به عنوان Master در قسمت Void برنامه ()Wire.begin را وارد می کنیم.
;Wire.beginTransmission(address)
با این دستور آدرس Slave ی که قرار است با آن اطلاعات ردوبدل شود را مشخص می کنیم. این آدرس 7 بیتی می باشد.
;()Wire.endTransmission
در فیلم از دستور Wire.send استفاده می کند که در ورژن های جدید نرم افزار آردوینو این دستور با دستور Write جایگزین شده است.
این دستور برای نوشتن یک داده در Slave می باشد.
;()Wire.endTransmission
این دستور به انتقال داده به Slave پایان میدهد و بایت هایی را که توسط دستور Write در صف بودن را انتقال می دهد.
در بعضی از دستگاه ها یا سنسورهایی که با I2C می توان با آنها ارتباط برقرار کرد بیشتر از چند رجیستر یا حافظه وجود دارد. این اطلاعات را باید از دیتاشیت آن قطعه پیدا کرد. این سه خط دستوری که در بالا به آن پرداختیم و در فیلم هم از آن استفاده کرد. برای این است که از اولین رجیستر که صفر است اطلاعات را دریافت کند. لزوما نباید حتما صفر باشد. اگر اطلاعات خانه ی دیگری از حافظه را لازم داشته باشیم عدد آنرا عوض می کنیم.
;Wire.requestFrom(address,num)
این دستور توسط Master استفاده می شود برای گرفتن “داده” از Slave .
آدرس Slave را وارد می کنیم و تعداد بایت از داده ای که می خواهیم.
;()Wire.available
تعداد بایتهایی که قابل خواندن هستن را بر می گرداند.
;()Wire.read
بایتی که توسط دستور requestFrom توسط Master از Slave در خواست شده بود و انتقال داده شده، را می خواند.
در ادامه می توانید فیلم آموزشی را مشاهده کنید:
دیدگاه ها :