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

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

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

در آموزش‌های قبلی در مورد پروتکل‌های ارتباط سریال صحبت کردیم. در این قسمت می‌خواهیم در مورد یک پروتکل ارتباط سریال دیگر، یعنی 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 ارسال کنیم؛

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

 

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

حمایت از سیاوش

خوشحال میشیم برای تداوم و کیفیت ما رو حمایت کنید.

0 نفر

پــــســنــدیـده انـد

توجه

سیاوش
سیاوش

کارشناس ارشد الکترونیک دیجیتال، علاقه‌مند به یادگیری

دیدگاه ها

0 دیدگاه

پر بحث ترین ها

مسابقه دوم : چالش برنامه نویسی به زبان C

مسابقه اول سیسوگ (مسابقه اول: درک سخت افزار) انتقادهای زیادی رو در پی داشت تا جایی که حتی خودمم به نتیجه مسابقه...

Zeus ‌ Zeus ‌
  • 2 سال پیش

راه اندازی LCD گرافیکی Nokia 1661 و دانلود کتابخانه آن

LCD گرافیکی یکی از مهم ترین پارامترهای موجود در طراحی انواع مدارات الکترونیکی پیچیده و حتی ساده است ، نمایش وضعیت و...

Zeus ‌ Zeus ‌
  • 4 سال پیش

ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموت‌های درب بازکن تا ریموت‌های دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی می‌کنند و آن‌هم ارسال اطلاعات به‌صورت بی‌سیم است....

Zeus ‌ Zeus ‌
  • 5 سال پیش

مسابقه سوم: استخراج داده از رشته ها در زبان C

نزدیک به 5 ماه از مسابقه دوم سیسوگ می‌گذره و فکر کردم که بد نیست یک چالش جدید داشته باشیم! البته چالش‌ها...

Zeus ‌ Zeus ‌
  • 2 سال پیش

همه چیز درباره ریموت کنترل‌های هاپینگ

امنیت همیشه و در همه‌ی اعصار، مقوله‌ی مهم و قابل‌توجه‌ ای بوده و همیشه نوع بشر به دنبال امنیت بیشتر، دست به ابداعات و اختراعات گوناگونی زده است. ریموت کنترل یکی از این اختراعات است. در این مقاله، به بررسی امنیت انواع ریموت‌های کنترل خواهیم پرداخت....

Zeus ‌ Zeus ‌
  • 5 سال پیش

مسابقه ششم: بزن میکروکنترلر را بسوزون!

بزنم میکروکنترلر را بسوزونم اونم تو  این شرایط!، طراحی مسابقه از اون چیزی که به نظر می‌رسه سخت‌تر است، باید حواست باشه...

Zeus ‌ Zeus ‌
  • 9 ماه پیش

آموزش قدم به قدم راه اندازی +NRF24L01

آموزش قدم به قدم راه اندازی +NRF24L01  با کتابخانه سازگار با انواع میکروکنترلرها و کامپایلرها قبل از اینکه قسمت بشه با ماژول...

رسول خواجوی بجستانی رسول خواجوی بجستانی
  • 3 سال پیش

ساخت ماینر با FPGA و ARM

چند ماهی هست که تب بیت کوین و ارزهای دیجیتال خیلی بالا رفته! چه شد که این پست را نوشتم همانطور که...

Zeus ‌ Zeus ‌
  • 3 سال پیش

مسابقه چهارم: کدام حلقه سریع‌تر است؟

حدود ۷ ماه پیش، مسابقه سوم سیسوگ رو برگزار کردیم و کلی نکته در مورد خواندن رشته‌های ورودی را بررسی کردیم. فکر...

Zeus ‌ Zeus ‌
  • 1 سال پیش

کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

در قسمت اول به یکسری اطلاعات کلی ماژول mc60 پرداختیم، با نرم افزار QNavigator کار کردیم و یک هدربرد هم برای کار...

Mahdi.h   Mahdi.h  
  • 2 سال پیش
سیـــســـوگ

مرجع متن باز آموزش الکترونیک