جلسه چهل و هشتم _معرفی واحد I2C جهت برقراری ارتباط با DS1307
I2Cیا (IIC (Inter integrated circuits یک نوع گذرگاه رابط است که در بسیاری از مدارهای مجتمع از جمله سنسورها، حافظه ها و RTC ها جهت تبادل داده پیاده سازی شده است. بسیاری این رابط را رابط دو سیمه یا (TWI(Two Wire Interface می نامند. این پروتکل توسط شرکت Philips در سال 1982 طراحی و بکار گرفته شد.
از خصوصیات این رابط در میکروکنترلرها می توان به موارد زیر اشاره نمود:
رابطی انعطاف پذیر، قدرتمند و با سرعتی نسبتا مناسب که فقط به دو سیم برای انتقال داده نیاز دارد.
قابلیت پشتیبانی از مدهای عملکرد Master و Slave در حالت های فرستنده و گیرنده
قابلیت شبکه کردن چند دستگاه با هم
دارای 7 بیت آدرس دهی برای اتصال به Slave های مختلف
همانطور که در شکل فوق مشاهده می کنید، در این پروتکل تمامی دستگاه ها به دو سیم SDA و SCL متصل شده اند. پایه (SCK(serial clock برای ایجاد پالس جهت همزمانی ارتباط بکار می رود و پایه (SDA(serial data جهت ارسال و دریافت داده بکار می رود. پایه های مذکور از لحاظ الکتریکی کلکتور باز هستند.یعنی برای استفاده از آنها باید با یک مقاومت به مثبت مدار متصل شوند. مقدار مقاومت Pull up برای منبع تغذیه 5 ولت 4.7K اهم و برای تغذیه 3.3 ولت برابر 1.5K اهم می باشد. اگر چندین دستگاه توسط دو خط مربوط به i2c به یکدیگر متصل شوند هر خط تنها وقتی یک می ماند که هیچکدام از دستگاه های متصل، آن را یک نکرده باشند. هنگامی که خط در حالت بیکاری باشد دو پایه i2c در حالت یک قرار می گیرند. دستگاه های مختلف می توانند از طریق رابط i2c به هم متصل شوند که به هر کدام از این اتصال ها یک گره میگویند. هرکدام از این دستگاه ها می توانند Master یا Slave باشند. دستگاه Master گره ای است که وظیفه تولید پالس ساعت و آغاز و پایان تبادل داده را بر روی خط را به عهده دارد. گره Slave دریافت کننده پالس ساعت است و توسط Master آدرس دهی می شود.هر Master و Slave می توانند در دو حالت دریافت کننده یا ارسال کننده عمل کنند.یعنی چهار حالت پیش می آید که عبارتند از: Master ارسال کننده، Master دریافت کننده، Slave ارسال کننده، Slave دریافت کننده.
استفاده از پروتکل I2C در فواصل بسیار کوتاه میان Master و Slave (کمتر از 20 سانتی متر) امکان پذیر است. برای فواصل طولانی تر باید از تقویت کننده سیگنال استفاده کرد. بنابراین در ارتباط I2C با فاصله بین 20 تا 70 سانتی متر می توان از مدار تقویت کننده زیر به جای مقاومت های پول آپ استفاده نمود.
I2C یک پروتکل ارتباط محور است یعنی هر فرایند انتقال داده با یک حالت آغاز شروع شده و با یک حالت پایان خاتمه می یابد. توجه داشته باشید که ایجاد حالت آغاز و پایان تنها توسط Master انجام می شود. به دلیل اینکه ارسال داده و ایجاد حالت های آغاز و پایان، همه بر روی خط SDA انجام می شوند پس باید مابین آنها تفاوت هایی باشد. حالت های آغاز و پایان تنها در زمان بالا بودن خط SCL ایجاد می شوند.حالت آغاز زمانی ایجاد می شود که در زمان بالا بودن خط SCL یک لبه پایین رونده در خط SDA ایجاد شود و حالت پایان هنگامی ایجاد می شود که در هنگام بالا بودن خط SCL یک لبه بالا رونده در خط SDA ایجاد شود.
قضیه از این قرار است که هنگامی که Master بخواهد داده ای را به Slave مشخصی ارسال کند ابتدا حالت آغاز را بر روی خط ایجاد میکند و پس از آن آدرس Slave را بر روی خط SDA قرار می دهد. در صورتیکه Slave آدرس خود را دریافت کند بیت Ack را بر روی خط SDA قرار می دهد. بیت ACK بیتی است که جهت تایید صحت دریافت آدرس و یا داده مابین Master و Slave مبادله می شود و مقدار آن صفر است.در مقابل بیت NACK وجود دارد که عدم صحت دریافت داده یا آدرس و یا عدم آمادگی برای تبادل را به اطلاع طرفین می رساند و مقدار آن یک است.مثلا Master برای ارسال آدرس ۸ پالس ساعت ایجاد می کند و برای اطلاع از تایید دریافت آدرس یک پالس اضافی نیز تولید می کند(یعنی ۹ پالس) در این صورت در پالس نهم اگر Slave آدرس خود را دریافت کرده باشد خط را صفر(acknowledge=ACK) می کند و در غیر این صورت خط در حالت یک (not acknowledge=NACK) می ماند. اگر Master بیت ack را بر روی خط SDA ببیند داده هشت بیتی را برای ارسال به Slave با ایجاد ۸ پالس ساعت بر روی خط قرار می دهد و برای اطمینان از اینکه Slave داده را دریافت کرده و آماده دریافت داده بعدی هست با ایجاد پالس نهم بیت ACK یا NACK را از Slave در یافت می کند.که اگر ACK دریافت شود به ارسال داده بعدی می پردازد و اگر NACK دریافت شود با ایجاد حالت پایان به ارتباط خاتمه می دهد. پس ساختار بسته داده و آدرس در I2C نه بیتی است که هشت بیت برای داده یا آدرس و یک بیت برای تایید یا عدم تایید دریافت(ACK/NACK) می باشد.
۱- ایجاد حالت آغاز برای شروع عمل نوشتن.
۲-ارسال آدرس Slave و پس از آن ارسال صفر به معنای فرمان عمل نوشتن.
۳- ارسال آدرس اولین خانه ای که باید عمل نوشتن در آن انجام شود.
۴-ارسال داده برای قرار گرفتن در خانه ای که آدرس آن را ارسال کردیم.
۵- ارسال حالت پایان برای خاتمه بخشیدن به فرایند انتقال. توجه کنید در مرحله ۴ می توان هرتعداد داده را که بخواهیم به ترتیب ارسال نماییم.در این صورت داده ها به ترتیب در خانه های حافظه Slave قرار می گیرند. یعنی شماره آدرس خانه ها به صورت خودکار افزایش می یابد. البته این در صورتی است که پس از ارسال هر داده بیت ACK را از طرف Slave دریافت کنیم.هرکجا که بیت NACK دریافت شود دو راه در پیش رو داریم. اول اینکه حالت آغاز را برای ایجاد یک ارتباط جدید ایجاد کنیم و دوم اینکه با ایجاد حالت پایان به ارتباط خاتمه دهیم.
۱- حالت آغاز را برای شروع فرایند انتقال ارسال می نماییم.
۲- آدرس Slave و پس از آن یک را به معنای فرمان عمل خواندن ارسال می نماییم.
۳- آدرس اولین خانه ای را که قرار است از آن بخوانیم به عنوان اولین داده ارسال می نماییم.این عمل باعث مقداردهی اشاره گر داخلی I2C می شود.
۴- حالت آغاز مکرر را برای شروع فرایند انتقال ارسال می کنیم.
۵- آدرس Slave و پس از آن یک را به معنای فرمان عمل خواندن ارسال می نماییم.
۶- داده را از خانه ای که در مرحله ۳ آدرس آن را ارسال کردیم خوانده و سپس هر چند بایت داده که بخواهیم را از خانه های مجاور بعدی می خوانیم.
۷- حالت پایان را برای خاتمه بخشیدن به فرایند انتقال ارسال می نماییم. توجه کنید که در مرحله ۶ پس از در یافت هر بایت از داده بیت ACK توسط Master باید بر روی خط قرار داده شود تا Slave متوجه آمادگی Master جهت دریافت داده ای بعدی بشود و آنها را به ترتیب برای Master بفرستد. در هر کجا، اگر Master بیت NACK را بر روی خط قرار دهد Slave دیگر داده ای برای Master نمی فرستد و Master مجبور است برای برقراری دوباره ارتباط با همان Slave فرایند را دوباره آغاز کند.پس بعد از مشاهده بیت NACK یا باید دوباره حالت آغاز را ایجاد کرد و یا با ایجاد حالت پایان خط را آزاد کنیم.
دلتون شاد و لبتون پر خنده
محمد هادی دشتی
برای مشاهده آموزش جلسه اول(معرفی هسته آرم و میکروکنترلرهای 32 بیتی شرکت ST ) کلیک کنید.
برای مشاهده آموزش جلسه دوم( معرفی نرم افزارهای مورد نیازجهت برنامه نویسی و پروگرام ) کلیک کنید.
برای مشاهده آموزش جلسه سوم( نحوه دانلود آخرین نسخه از نرم افزار STM32CubeMX ) کلیک کنید.
برای مشاهده آموزش جلسه چهارم(نحوه انجام تنظیمات در نرم افزار STM32CubeMX ) کلیک کنید.
برای مشاهده آموزش جلسه پنجم(نحوه برنامه نویسی پروژه چشمک زن با نرم افزار Keil ) کلیک کنید.
برای مشاهده آموزش جلسه هشتم( نحوه راه اندازی ال سی دی کاراکتری-قسمت اول) کلیک کنید.
برای مشاهده آموزش جلسه سیو دوم(دوره آموزشی میکرو کنترلرهای STM32 _ معرفیSPI (بخش اول)) کلیک کنید.
برای مشاهده آموزش جلسه سی و سوم(دوره آموزشی میکرو کنترلرهای STM32 _ معرفیSPI (بخش دوم)) کلیک کنید.