راه اندازی I2C Slave به صورت اینتراپتی و با توابع HAL

سلام؛
مدتیه میخوام میکرو رو در حالت Slave به یک باس I2C وصل کنم و وقتی مستر نیاز به دیتا داشت، داده رو بهش ارسال کنم، یا اگر داده ای رو فرستاد، دریافت کنم. لازمه که این کار به صورت وقفه باشه.
در اینترنت جستجو کردم و چند کد پیدا کردم مثل این مورد. ولی وقتی کد رو اجرا میکنم، نه تنها جوابی نمیده، بلکه هنگام I2C Scan توسط مستر هم شناسایی نمیشه.
اگر آموزشی در این باره میشناسید یا کار مشابهی انجام دادید، ممنون میشم تجربیاتتون رو به اشتراک بذارید. متشکرم :rose:

سلام و تسلیت دوست عزیز
اول از همه از طراحی سخت افزاری بخش I2C مطمئن شو.
این پروتکل خیلی به نویز حساسه
طول مسیر ترکت کم باشه
مقاومت های پول آپ حتما گذاشته باش.

راه اندازیش از طرف نرم افزار کار خاصی نداره اما بخش سخت افزاریش برای اولین بار خیلی مهمه و معمولا اکثر افرادی که برای اول استفاده از I2C رو شروع میکنن مشکلشون از بخش سخت افزار هست.

3 پسندیده

یه نکته برای اول کار:
یه تابع بنویس و با یک تاخیر مناسب از آدرس 0 تا آخرین آدرس رو مدام بار گذاری کن و بعد از تشخصی طرف دیگه برنامه شماره آدرس رو بهت بده.(با دیباگ کردن راحت میتونی ببینیش)
اینجوری مطمئن میشی که آدرس درست رو بهش حداقل یکبار دادی.
برای من یکبار اتفاق افتاد وسیله ای که میخواستم باهاش ارتباط برقرار کنم آدرسش با چیزی که توی دیتاشیت بود فرق داشت! با راه حل بالا تونستم آدرسش رو پیدا کنم.

1 پسندیده

اینجا عرض کردم، این کاری که گفتید انجام شده ولی شناسایی نمیشه. این قطعه کد I2C Scan:

با استفاده از کدهای زیر تونستم جواب بگیرم:

image

تابع AddrCallback وقتی اجرا میشه که آدرس ارسال شده توسط Master با آدرس ما که Slave هستیم منطبق بشه. تو این حالت با خوندن آرگومان TransferDirection میتونیم بفهمیم که مستر میخواد مقداری رو روی ما بنویسه (به ما ارسال کنه) یا میخواد مقداری رو از ما بخونه (دریافت کنه).

بعد از تشخیص این مورد، میتونیم روند موردنظر روی پیاده سازی کنیم و بعد از اتمام پردازش، داده رو تحویل مستر بدیم یا ازش بخونیم.

تو این کد از DMA و وقفه‌ی اون استفاده کردم. در این حالت وقتی که ارسال یا دریافت دیتا توسط اسلیو به صورت کامل انجام بشه، توابع SlaveTxCpltCallback و SlaveRxCpltCallback اجرا میشن. توی این توابع باید روند مربوط به بعد از ارسال/دریافت نوشته بشه.

1 پسندیده