ARM, STM, آموزش, آموزش STM32, آموزش STM32 با توابع LL, توصیه شده, مقاله های سیسوگ

آموزش STM32 با توابع LL قسمت 25: راه‌اندازی ارتباط I2C

در قسمت قبلی با ADC آشنا شدیم و در آموزش‌های قبلی در مورد پروتکل‌های ارتباط سریال صحبت کردیم. در این قسمت می‌خواهیم در مورد یک پروتکل ارتباط سریال دیگر، یعنی Inter-Integrated Circuit یا همان I2C صحبت کنیم. این پروتکل، همان‌طور که از نام آن مشخص است، برای ارتباط چیپ‌های مختلف به‌کار می‌رود. در I2C تنها از دو سیم برای ارتباط استفاده می‌شود و نسبت به USART سرعت بالاتری دارد (در بعضی IC ها تا 3.4 Mbit/s) اما از پیچیدگی‌های راه‌اندازی بیشتری نیز برخوردار است و برای مسافت‌های خیلی کوتاه مناسب است. در ادامه با جزییات این ارتباط و نحوه راه‌اندازی آن بیشتر آشنا می‌شویم.

با سیسوگ همراه باشید.

شکل بالا ارتباط I2C بین یک میکروکنترلر و سه دستگاه دیگر را نشان می‌دهد. همان‌طور که دیده می‌شود، دراین‌ارتباط از یک سیم برای انتقال کلاک (SCL) و یک سیم برای انتقال اطلاعات داده (SDA) استفاده می‌شود. در این شکل میکروکنترلر وظیفه کنترل ارتباط را به عهده دارد و نقش Master را ایفا می‌کند. به همین دلیل کلاک نیز توسط میکرو تأمین می‌شود. هرچند در این شکل تنها یک Master وجود دارد، اما بیش از یک Master نیز می‌تواند وجود داشته باشد. بااین‌حال در هر زمان تنها یک دستگاه کنترل ارتباط را در دست می‌گیرد.

منظور از کنترل ارتباط، انتخاب Slave و همچنین جهت انتقال داده است. همان‌طور که در شکل دیده می‌شود، برای خط SDA از یک مقاومت Pull-up استفاده‌ شده است. درصورتی‌که بیش از Master وجود داشته باشد و یا از Clock stretching استفاده شود، در خط SCL نیز از مقاومت Pull-up استفاده می‌کنیم.

برای شروع ارتباط و تبادل داده، دستگاه Master باید شرط شروع ارتباط را ایجاد کند، سپس آدرس دستگاه موردنظر برای تبادل اطلاعات و همچنین جهت تبادل داده (خواندن یا نوشتن) را بفرستد. پس‌ازاینکه دستگاه Slave بیت تأیید یا ACK را فرستاد. فرستادن یا دریافت اطلاعات شروع می‌شود. برای درک بهتر به شکل زیر توجه کنید:

در ادامه به نحوه راه‌اندازی این ارتباط در میان Blue Pill و یک حافظه EEPROM می‌پردازیم.

 

ایجاد پروژه

در محیط Cube MX مثل گذشته تنظیمات کلاک، دیباگ و همچنین واحد USART1 (برای دیدن نتایج اجرا) را انجام می‌دهیم. سپس واحد I2C1 را مانند شکل زیر تنظیم می‌کنیم:

بعد تنظیمات درایورها بر روی LL کد پروژه را ایجاد می‌کنیم.

 

نوشتن کد پروژه

در ابتدا کتابخانه‌ها و ثابت‌های مورد نیاز را اضافه می‌کنیم؛

سپس مثل قبل توابع مربوط به ریدایرکت Printf را در این پروژه نیز کپی می‌کنیم و تغییرات لازم را انجام می‌دهیم. حالا باید توابع موردنیاز برای خواندن و نوشتن توسط I2C را بنویسیم؛

اکنون می‌توانیم با استفاده از این توابع، دو تابع جدید برای نوشتن روی حافظه EEPROM و خواندن از آن، بنویسیم. برای این عمل نیاز به دیتاشیت حافظه‌داریم. زیرا باید از نحوه آدرس‌دهی، تأخیر نوشتن و جزییات دیگر مربوط به حافظه اطلاع داشته باشیم. ما از یک حافظه 265kb با تأخیر نوشتن 5ms استفاده می‌کنیم.

کدهای زیر را قبل از int main می‌نویسیم؛

اکنون می‌توانیم به‌وسیله توابع نوشته‌شده، اطلاعات دلخواهمان را روی حافظه بنویسیم و از آن بخوانیم. قبل از آن، واحد I2C را فعال می‌کنیم و برای دریافت اطلاعات خوانده‌شده متغیرهای موردنیازمان را تعریف می‌کنیم:

 حالا برای نمونه در آدرس 0000 مقدار 24 و در آدرس 0001 عدد 25 را می‌نویسیم. سپس این دو خانه‌ی حافظه را می‌خوانیم.

  درستی عملیات نوشتن و خواندن را می‌توانیم در Logic Analyzer بررسی کنیم؛

همچنین می‌توانیم برای اطمینان از درست انجام شده عمل نوشتن اطلاعات خوانده شده را توسط USART ارسال کنیم؛

در ترمینال سریال می‌بینیم؛

 

   لینک این پروژه در گیت‌هاب

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

بازگشت به لیست

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

1 دیدگاه در “آموزش STM32 با توابع LL قسمت 25: راه‌اندازی ارتباط I2C

  1. Soran گفت:

    تشکر بابت آموزشهای مفید و کاربردی