ARM, STM32, توصیه شده, معرفی, مقاله های سیسوگ, هوش مصنوعی

آشنایی و راه‌اندازی پروتکل CAN با استفاده از STM32

Sisoog Can Protocol

برای برقراری ارتباط پروتکل‌های زیادی وجود دارند؛ پروتکل‌هایی که برای ارتباط نزدیک طراحی و پایه‌ریزی شده‌اند، پروتکل‌هایی که برای ارتباط راه دور (پروتکل CAN) مورد‌استفاده قرار می‌گیرند و حتی پروتکل‌هایی که مخصوص روی برد هستند.

یکی از مهم‌ترین نیاز‌های هر ارتباطی، اطمینان از صحت داده‌های دریافتی است. قبلاً در خصوص خطایابی و ترمیم داده با استفاده از همینگ کد توضیح داده‌ایم. چالش بعدی سرعت انتقال داده است. با توجه به نرم‌افزاری بودن سیستم خطایابی در بیشتر پروتکل‌های ارتباطی، سرعت، رابطه‌ای مستقیم با فرکانس پردازنده خواهد داشت. حال فرض کنید پروتکلی موجود باشد که خطایابی را به‌صورت سخت‌افزاری انجام دهد و نیازی به درگیری پردازنده نباشد. با این تکنیک می‌توان به سرعت‌های بالاتری دست پیدا کرد. پروتکل‌هایی مثل شبکه و یا CAN دارای چنین قابلیت‌هایی هستند.

چیزی که استفاده از این پروتکل‌ها را محدود کرده است، در وهله‌ی اول، پیچیدگی‌های سخت‌افزاری و نیاز به قطعات جانبی مورد‌نیاز و بعد‌از‌آن پیچیدگی ظاهری پروتکل است.

در این مقاله قصد داریم به بررسی پروتکل ارتباطی CAN بپردازیم و مختصری از نحوه‌ی کانفیگ اولیه آن را به زبان ساده بیان کنیم. با سیسوگ همراه باشید.

پروتکل CAN چیست و از کجا آمده است؟

شاید باور این‌که، این پروتکل ابتدا برای خودرو پایه‌ریزی شد، مقداری سخت باشد. خب البته باید دید که چه خودروهایی از این پروتکل استفاده می‌کرده‌اند؛ قطعاً ماشین‌هایی با استاندارد‌های الکترونیکی بالا! نه خودروهایی مثل تولیدات داخلی!

در سال 1980 شرکت Bosch با هدف کاهش سیم‌کشی‌های انبوه موجود در خودروها، دست به ابداع پروتکل محبوب CAN زد.

محبوبیت و مقبولیت پروتکل ابداعی تا جایی پیش رفت که علاوه بر استفاده موفق از آن در صنعت خودرو، در دیگر صنایع نیز مورد‌استفاده قرار گرفت. پروتکل CAN علاوه بر تأمین ایمنی در سطح شبکه، نیاز به سخت‌افزار پیچیده‌ای برای برقراری ارتباط ندارد و از روش آشنای دو رشته سیم به هم تابیده و خطوط دیفرانسیلی استفاده می‌کند.

امنیت در پروتکل CAN تا اندازه‌ای است که علاوه بر استفاده در خودرو، در هواپیماها نیز مورد‌استفاده قرار می‌گیرد و سنسور‌های سیستم ناوبری هواپیما برای برقراری ارتباط با کامپیوتر مرکزی از این پروتکل استفاده می‌کنند.

چرا باید از CAN استفاده کنیم؟

CAN BUS

دلایل زیادی وجود دارد که استفاده از پروتکل CAN رو توجیه می‌کند، ولی مهم‌ترین دلایلی که در پروژه‌هایی با سطح صنعتی، باید از CAN استفاده کنیم به شرح زیر هستند:

  • اگر در شبکه CAN یکی از Node ها کرش یا هنگ کند، به‌صورت اتوماتیک توسط لایه‌ی فیزیکی از شبکه خارج می‌شود و شبکه به کار خود ادامه می‌دهد.
  • عدم نیاز به عناصر خارجی زیاد و سادگی مدار راه‌انداز: تنها به یک واسط لایه‌ی فیزیکی نیاز دارد که معمولاً یک آی سی 8 پایه است.
  • پروتکل CAN با توجه به لایه‌ی فیزیکی مورد‌استفاده (خطوط داده دیفرانسیلی) قادر است در محیط‌هایی با نویز زیاد مثل محیط‌های صنعتی کار کنند.
  • پروتکل CAN از لایه‌بندی مدل استاندارد OSI استفاده می‌کند.
  • تأمین امنیت داده‌های ارسالی با استفاده از CRC در لایه‌ی سخت‌افزاری
  • اولویت‌بندی پیام‌های ارسالی به‌نحوی که داده‌هایی با اولویت بالاتر زودتر ارسال می‌شوند.
  • شبکه‌ی CAN یک شبکه Real Time است؛ یعنی ارسال و دریافت داده‌ها را در بازه‌های زمانی مشخص، گارانتی می‌کند.

و البته موارد دیگر که شمردن آن‌ها در این مقاله ممکن نیست. برای روشن شدن اهمیت استفاده از پروتکل CAN، دو مورد از قابلیت‌های ذاتی این پروتکل را بیشتر توضیح می‌دهیم:

مورد مهم اول، خارج شدن Node های مشکل‌دار از شبکه به‌صورت خودکار است.، فرض کنید ماشینی که از مدل شبکه CAN استفاده می‌کند، در اتوبان با سرعت بالایی در حال حرکت است. ماشین دیگری از مسیر خود خارج شده و با آن تصادف می‌کند. بر اثر ضربه‌ی وارده، سیستم قفل مرکزی آسیب می‌بیند. آسیب وارده باعث نمی‌شود که سیستم کیسه‌ی هوا نیز با اختلال مواجه شود و کار نکند؛ با فرض این‌که هر دو سیستم از باس مشترک CAN استفاده می‌کنند.

مورد دوم، اولویت‌بندی پیام و Real Time بودن شبکه است. همان تصادف را فرض کنید؛ سیستم موتور قصد دارد پیامی را به سیستم سوخت‌رسانی ارسال کند تا باعث قطع سوخت‌رسانی و جلوگیری از آتش‌سوزی شود. از طرفی سنسور ضربه قصد دارد به سیستم کیسه هوا وقوع تصادف را گزارش دهد. Real Time بودن شبکه CAN کمک می‌کند که پیام‌های مورد‌نظر در زمان‌های تعیین‌شده به مقصد برسند و از وقوع فاجعه جلوگیری کنند.

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

همین مثال و قابلیت‌ها را می‌توان به‌راحتی برای کنترل یک کارخانه یا خط تولید گسترش داد. وجود چنین قابلیت‌هایی باعث می‌شود که پروتکل CAN امروزه بخش جدایی‌ناپذیر صنعت باشد. شاید تنها مشکل این پروتکل حجم محدود اطلاعات باشد.

فریم‌های ارسالی در پروتکل CAN به چه صورت هستند‌؟

برای این‌که شبکه CAN قادر باشد که به‌صورت Real Time عمل کند و داده‌ها در زمان مناسبی ارسال شوند، محدودیت‌هایی جهت ارسال بسته‌های (فریم‌های) داده‌ای وجود دارد؛ به این صورت که هر بسته داده‌ای نمی‌تواند بیشتر از 8 بایت اطلاعات را حمل کند.

قبل از این‌که به تشریح فریم‌های داده‌ای بپردازیم, لازم به ذکر است که دو ورژن مختلف از استاندارد CAN امروزه رایج هستند:

  •  استاندارد CAN 2.0A
  • استاندارد CAN 2.0B

تفاوت این دو استاندارد در تعداد بیت‌های آدرس‌دهی (identifier) است؛ به‌صورتی که در استاندارد CAN 2.0A تعداد بیت‌های مجاز برای آدرس 11 بیت هستند و در استاندارد CAN 2.0B تعداد بیت مجاز به 29 بیت گسترش یافته‌اند. خوشبختانه تغییرات این دو استاندارد به نحوی بوده که هر دو استاندارد قادرند به تبادل دیتا بر روی یک خط داده مشغول باشند، بدون این‌که اختلالی به وجود آید.

پروتکل CAN

همان‌طور که در تصویر فوق مشاهده می‌کنید، هر بسته‌ی داده‌ای دارای یک آدرس منحصر‌به‌فرد است که بسته به نوع استاندارد CAN مورد‌استفاده، می‌تواند 11 یا 29 بیت طول داشته باشد. تعداد داده‌های موجود در هر فریم توسط DLC مشخص می‌شود که در بیشترین حالت می‌تواند 8 بایت داده باشد. بخش بعد CRC است که توسط سخت‌افزار تولید و بررسی می‌شود. در صورت صحت آدرس و CRC، گیرنده با ارسال ACK فرستنده را از دریافت اطلاعات آگاه می‌کند.

چطور اولویت یک پیام مشخص می‌شود؟

اما چطور می‌شود که پیام‌ها را اولویت‌بندی کرد؟ چطور می‌شود که اولویت یک پیام از دیگری بالاتر باشد؟ این اتفاق در لایه‌ی فیزیکی رقم می‌خورد. به این صورت که فریم‌های داده‌ای با آدرس (identifier) کوچک‌تر، دارای اولویت بالاتری برای ارسال هستند. بالاترین اولویت برای ارسال، مربوط به identifier با ارزش 0 است و پایین‌ترین اولویت هم مربوط به identifier با 2047 در استاندارد Can 2.0A است.

Arbitration in CAN networks

برای روشن شدن مسئله، به عکس فوق دقت کنید. فرض کنید سه Node قصد دارند به‌صورت همزمان داده ارسال کنند. لایه‌ی فیزیکی اگر بیت مورد‌نظر را بر روی خط مشاهده نکند، باس را آزاد می‌کند؛ به این شکل که مثلاً وقتی Node 2 قصد ارسال بیت 5 ام را دارد، مشاهده می‌کند که بر‌خلاف مقدار بیت 5 ام که باید مقدار باس 1 باشد، صفر شده است و این بدان معناست که فرستنده‌ای با اولویت بالاتر، در حال ارسال داده است. پس دسترسی را واگذار می‌کند. فرستنده Node 1 همین وضعیت را در ارسال بیت دوم مشاهده می‌کند و این‌گونه می‌شود که Node 3 باس را در اختیار می‌گیرد و به ارسال داده می‌پردازد.

سیم‌کشی شبکه‌ی CAN به چه صورت است؟

آشنایی و راه‌اندازی پروتکل CAN با استفاده از STM32

همان‌طور که قبلا توضیح دادیم، پروتکل CAN از باس دیفرانسیلی استفاده می‌کند؛ مثل باس RS-485. به همین دلیل نمی‌توان و نباید از مدل ستاره‌ای برای این شبکه استفاده کرد (معمولاً افراد به این مسئله‌ی مهم توجه نمی‌کنند و همین امر باعث می‌شود که عملکرد سیستم با اختلال همراه باشد.)، مگر در حالت خاص و با در نظر گرفتن شرایط و محاسبه‌ی امپدانس مورد‌نیاز به شکلی که امپدانس خط بر روی 60 اهم باشد.

در حالت خطی که در تصویر فوق مشاهده می‌کنید، باید یک مقاومت به ابتدا و یکی هم به انتها اضافه شود. مقدار توصیه‌شده برای این مقاومت‌ها مقدار 120 اهم است.

Can Signalling

همان‌طور که در تصویر بالا می‌بینید، باس دیفرانسیلی مورد‌استفاده در CAN طبق استاندارد ISO 11898-2، باید با رفرنس 2.5 ولت باشد. مقدار رفرنس در آی سی لایه‌ی فیزیکی قابل‌تعیین است که به‌صورت پیش‌فرض مقدار 2.5 برای آن در نظر گرفته شده است.

تعیین سرعت مورد‌استفاده یکی از پارامتر‌های مهم در شبکه CAN است. با توجه به طول باس، باید از سرعت مناسب استفاده کرد. در بیشترین حالت، طبق استاندارد می‌توان تا 500 متر باس CAN طول داشته باشد و بیشترین سرعت قابل پشتیبانی در ISO 11898-2، یک مگابیت بر ثانیه است. اما محدودیت‌هایی وجود دارد که باید آن‌ها را رعایت کرد؛ مثلاً نمی‌توان انتظار داشت در خطوط دیتا با طول 200 متر بتوان داده‌ها را با سرعت 1 مگابیت بر ثانیه منتقل کرد.

برای سهولت ما چهار مقدار از تناسب طول خطوط داده و بیت ریت را آماده کرده‌ایم که به شرح زیر هستند:

  1. سرعت 1 مگابیت بر ثانیه برای خطوط داده با حداکثر طول 40 متر
  2. سرعت 500 کیلوبیت بر ثانیه برای خطوط داده با حداکثر طول 100 متر
  3. سرعت 250 کیلوبیت بر ثانیه برای خطوط داده با حداکثر طول 200 متر
  4. سرعت 125 کیلوبیت بر ثانیه برای خطوط داده با حداکثر طول 500 متر

سخت‌افزار لایه‌ی فیزیکی

can physical layer

معمولاً به دلیل آسیب‌پذیری لایه‌ی فیزیکی با توجه به نوع عملکرد آن، این قسمت را در چیپ میکروکنترلر قرار نمی‌دهند تا در صورت بروز حادثه در باس، که موجب سوختن این آی سی واسط می‌شود، به میکروکترلر یا کنترلر CAN صدمه وارد نشود.

آی سی های مختلفی توسط شرکت‌های مختلف برای واسط شبکه‌ی CAN ساخته شده‌اند ولی در دسترس‌ترین و مناسب‌ترین آن‌ها، آی سی MCP2551 ساخت شرکت میکروچیپ است.

در نگاه اول، افرادی که قصد راه‌اندازی باس CAN توسط میکرو‌کنترلر‌های ARM را دارند، به دلیل وجود تغذیه‌ی 5 ولت این آی سی، از آن استفاده نمی‌کنند. معادل این آی سی با تغذیه‌ی 3.3 ولت، هم کمیاب است و هم قیمتی تا 4 برابر این این آی سی دارد. در‌صورتی‌که به‌راحتی و بدون هیچ مدار اضافه‌ای می‌توان این آی سی را به میکروکنترلر ARM متصل کرد (در‌صورتی‌که میکروکنترلر از 3.3 استفاده کند). فقط دقت داشته باشید که پایه‌ی 8 را حتماً به زمین متصل کنید. اگر بتوانید یک خازن 100 نانو فاراد هم بر روی پایه 5 و زمین قرار دهید که بهتر خواهد بود. پایه‌ی 5 در واقع همان ولتاژ رفرنس 2.5 ولت است که برای تشخیص سطح منطقی باس به کار می‌رود.

نرم‌افزار و راه‌اندازی اولیه با استفاده از IC MCP2515

معمولاً اکثر میکروکنترلرهای آرم به‌صورت سخت‌افزاری از CAN پشتیبانی می‌کنند. اگر هم قصد دارید از CAN استفاده کنید و سخت‌افزار آن در میکروکنترلر مورد‌نظر شما وجود ندارد، به‌راحتی می‌توانید از آی سی MCP2515 استفاده کنید. این آی سی یک مبدل SPI به CAN است. ما در این مقاله از میکروکنترلر STM32F103 استفاده می‌کنیم که واسط CAN را به‌صورت سخت‌افزاری درون خود میکروکنترلر دارد.

همان‌طور که مثال فوق مشاهده می‌کنید، می‌توان تنظیمات اولیه مربوط به CANx (بسته به نوع نیاز می‌تواند CAN1 یا CAN2 باشد) را به‌راحتی انجام داد. بعد از انجام تنظیمات اولیه، به‌سادگی و با نوشتن خطوط زیر می‌توان داده‌های مورد‌نظر را از بستر CAN منتقل کرد.

همان‌طور که مشاهده می‌کنید، ما یک فریم داده که شامل 1 بایت داده است را با مشخصه‌ی 0x321 و با فرمت استاندارد (11 بیت) در شبکه CAN منتشر می‌کنیم. اگر گیرنده وجود نداشته باشد یا مستر ACK را دریافت نکند، به‌صورت سخت‌افزاری ارسال تا تعداد دفعات مشخصی تکرار می‌شود.

در آینده

تا اینجا با کلیت پروتکل CAN آشنا شدیم و چند خط از نحوه‌ی کانفیگ نرم‌افزاری آن را برای میکروکنترلر‌های STM32F103 قرار دادیم. برای یافتن مثال‌های بیشتر می‌توانید به مثال‌های منتشر‌شده از سوی شرکت ST مراجعه کنید. اما چیزی که متأسفانه به‌درستی به آن پرداخته نشده، نحوه‌ی کانفیگ نرخ ارسال داده است.

در این مثال و دیگر مثال‌ها و برنامه‌ها، نرخ ارسال اطلاعات به‌صورت ثابت در برنامه قرار گرفته است و در مورد چگونگی محاسبه‌ی آن هیچ توضیحی ارائه نشده است. در مقاله‌ی آینده به توضیح این مهم خواهیم پرداخت و خواهیم گفت که چطور می‌شود با استفاده از پارامتر‌های مورد‌نظر، مقادیر مناسبی برای ایجاد نرخ ارسال اطلاعات انتخاب کنید.

 

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

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

نوشته های مشابه

80 دیدگاه در “آشنایی و راه‌اندازی پروتکل CAN با استفاده از STM32

  1. Avatar for محمو فیاض‌بخش محمو فیاض‌بخش گفت:

    سلام، ی سوال دارم
    بعضی میکروهای arm میتونن ارتیاط اترنت برقرار کنن، بعضی هم از arm ها میتونن ارتباط can داشته باشن، شما میدونین ارتباط can با اترنت rj45 چیه؟ من فکر میکنم پروتکل can از طریق اترنت منتقل میشه، درسته؟ ممنون میشم تفاوت can و اترنت رو توضیح بدید

    1. Avatar for Zeus ‌ Zeus ‌ گفت:

      سلام دوست عزیز
      این دو پروتکل به لحاظ لایه های نرم افزاری و سخت افزاری کاملا متفاوت هستن برخی میکروها هم هستن که هر دو پروتکل رو پشتیبانی میکنند
      این دو پروتگل کاملا متفاوت هستند درسته که ممکنه جاهایی مشترکاتی داشته باشند ولی خوب تفاوت ها خیلی زیاده

  2. Avatar for Salah Khezri Salah Khezri گفت:

    باسلام.
    لنت ترمز زانتیا C5 را عوض کردم. الان رون نمیشه و پیغام خطای CAN میده.
    ممنون میشم راهنمایی بفرمایید.

  3. Avatar for علی علی گفت:

    سلام وقت بخیر. ممنون از مطالب مفیدتون. یه سوال داشتم.چطور میشه سرعت ارسال و دریافت اطلاعات رو تغییر داد؟مثلا یک id هر 1 ثانیه ارسال بشه و یکی دیگه هر 5 ثانیه.ممنون میشم

    1. Avatar for Zeus ‌ Zeus ‌ گفت:

      اگر فرستنده رو شما طراحی کرده باشید میشه چنین کاری کرد
      در غیر این صورت ممکن نیست

  4. Avatar for حسین حسین گفت:

    باسلام.
    اگر پروژه شما را بخوام داشته باشم البته بر روی میکروکنترلر LPC هر کدوم فرق نداره ولی ترجیحا LPC1765
    چطور میتونم اقدام کنم. لطفا اعلام هزینه کنید. بنده سورس برنامه را لازم دارم و توضیحاتی راجب به اون.
    اگر زحمت انجامش را با آی دی ای کیل بکشید که عالی میشه. جوری که باد ریت هم قابل کنترل باشه.
    لطفا هزینه انجام این پروژه را بفرمایید و اینکه بعدها میتونه به کار خودتون هم زیاد بیاد.
    از زحمات شما متشکرم.

    1. Avatar for Sisoog Os Sisoog Os گفت:

      سلام دوست عزیز
      متاسفانه ما پروژه انجام نمیدیم ولی خب میتونه این اطلاعات پیش زمینه شما جهت انجام این پروژه باشه

  5. Avatar for پوریا پوریا گفت:

    سلام دلاور. چندوقته در مورد كن ميخونم اين آموزش يكي از بهترينها بود. قسمت دوم رو كه گفتيد تو سايت پيدا نكردم! شروع نكردي شيطون؟!

    آقا من يه رادار رسيده دستم كه با پروتكل كن كار ميكنه. ميخوام با ميكرو كنترلر و ماژول MCP2515 پكتههاشو بخونم. واقعا ممنون ميشم اگر كمكم كني

    ممنون و خداقوت

    1. Avatar for Sisoog Os Sisoog Os گفت:

      سلام دوست عزیز
      یه مطلب داریم با نام FMS که ما داخلش سعی کردیم یه پروژه اسنیفر پکت CAN بسازیم میتونید از اونجا دانلود کنید
      https://sisoog.com/2017/06/12/%d9%be%d8%b1%d9%88%da%98%d9%87-fms-reader-%d8%a8%d9%87-%d9%87%d9%85%d8%b1%d8%a7%d9%87-%d8%b4%d9%85%d8%a7%d8%aa%db%8c%da%a9-%d8%8c-pcb-%d9%88-%d9%81%d8%a7%db%8c%d9%84-%d8%a8%d8%b1%d9%86%d8%a7%d9%85/

  6. Avatar for AT0M AT0M گفت:

    سلام جناب زیوس، ممنو از مطلب جالبتون فقط بنده یه سوال دارم.

    در شبکه CAN باید تمام نود ها MCU داشته باشین؟
    مثلا ما 20 تا سنسور دما داریم می تونیم فقط با یک میکروکنترلر از طریق CAN اطلاعات رو انتقال بدیم؟!

    1. Avatar for Zeus ‌ Zeus ‌ گفت:

      سلام و درود بر شما
      ممکنه سنسور دمایی مبتنی بر can وجود داشته باشه ، که اگر داشته باشه خیلی راحته کار
      اما اگر نداشته باشه، دو تا راهکار خواهید داشت، یکی این که دیتای همه سنسور ها رو یه میکروکنترلر با یه پروتکل جمع کنه و بعد از طریق can منتقل کنه
      و راه دوم هم میتونید برای هر سنسور یک میکروکنترلر مبتنی بر can بذارید

  7. Avatar for امیرحسین امیرحسین گفت:

    چرا پایه‌ی 8 از mcp2551 رو باید مستقیما به زمین متصل کنیم؟ در اکثر مدارهایی که دیدم این پایه با یک مقاومت به زمین متصل شده. یک سوال دیگه، این طور که من دیدم میکروهای stm32 تا ولتاژ 5 رو هم در i/o می‌تونند تحمل کنن، به همین دلیله که شما گفتید استفاده از این ic با این میکروکنترلر مشکلی نداره؟

    1. Avatar for Zeus Zeus گفت:

      بله درسته دوست عزیز
      در واقع با زمین کردم slop رو غیرفعالش کردن شما میتونی با توجه به باوود ریت مورد نیاز مقدار دلخواه رو بذاری و من معمولا دیدم که مقدارش رو ۴٫۷ کیلو میذارن
      در مورد سطح ولتاژ هم بله درست حدس زدید

  8. Avatar for امیرحسین امیرحسین گفت:

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

    1. Avatar for Sisoog Os Sisoog Os گفت:

      سلام اینجا ما یک پروژه هم باهاش انجام دادیم
      https://sisoog.com/2019/12/16/vscode-%d8%a8%d8%b1%d8%a7%db%8c-avr/

  9. Avatar for نازیلا نازیلا گفت:

    ممنون از اینکه دانشتون رو در اختیار بقیه میذارید

    1. Avatar for Zeus Zeus گفت:

      خواهش میکنم دوست عزیز

  10. Avatar for احسان وارسته احسان وارسته گفت:

    مطلبتون خیلی عالی و کامل بود
    خسته نباشید

    1. Avatar for Sisoog Os Sisoog Os گفت:

      متشکریم

  11. Avatar for نیما نیما گفت:

    سلام اقای مهندس زـــوس خیلی ممنون بابت توضیحات ارزشمندتون.بعد از رسیدن به انتهای مطلب خیلی ناراحت شدم که بعد از3سال هنوز این مطلب رو ادامه ندادید.لطفا اگه فرصت دارید ما رو اموزش های خودتون محروم نکنید!

    1. Avatar for Zeus Zeus گفت:

      سلام و درود بر شما دوست عزیز
      اولین نفری هستد که بعد از سه سال از منشر شدن این مطلب، براش قسمت بعدی مهم بوده!
      متشکرم که یاد آوری کردید توی لیست کارها میذارم

  12. Avatar for lh lh گفت:

    سلام روز بخیر
    آیا میشه پایه ی 5 (Vref) آی سی can به جایی اتصال نداشته باشه؟

    1. Avatar for zeus zeus گفت:

      بله کاملا منطقیه و میتونید به جایی اتصال ندید
      ما توی تولیداتمون به همین شکل عمل کنیم

  13. Avatar for اهورا اهورا گفت:

    با سلام
    وقتی can h و can l هر دو 2/5 هستند و پایه rx,tx هر دو پنج ولت هستند که میدونم اشتباس نباید صفر و پنج‌باشن به نظرتون اشکال از کجاست بقیه پایه های ای سی درست هستند ای سی هم سالمه
    ممنون

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      سلام
      خوب از اونجایی که این پروتکل جریان بیس هست – اندازه گیری ولتاژ زیاد منطقی نیست
      از چند تا چیز مطمئن بشید – اول این که مقاومت 120 باشه روی اول و آخر خط
      دوم این که پایه vref آیسی مبدل ولتاژٰش با ولتاژ دیتاشیت منطبق باشه و خارج از اون نباشه
      اگر این دو مورد اوکی باشن – احتمالا بقیه بحث ها نرم افزاری میشه

  14. Avatar for Mohiyeddin Mohiyeddin گفت:

    سلام
    وقت بخیر
    برای میکروکنترلرهایی که can1 و can2 دارند(مثل stm32f429)، در تنظیمات فیلتر چه نکاتی رو باید در نظر گرفت؟ آیا در صورت استفاده از can2 می توان تنظیمات فیلترها رو به صورت مجزا از can1 انجام داد یا باید بخشی از تنظیمات در can1 انجام شود؟
    من برای استفاده از can bus در میکروکنترلرهایی که فقط یک can داره مشکلی ندارم ولی نتونستم can2 میکرو stm32f429 رو راه اندازی کنم.
    لطفا راهنمایی بفرمایید.
    تشکر

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      سلام دوست عزیز
      تا حالا نیاز نشده که فیلتر رو برای هر دو can فعال کنم ولی فکر نمیکنم مشکل خاصی در این زمینه موجود باشه
      شما دقیقا با راه اندازی can دوم مشکل دارید یا این که فعال کردن فیلتر ؟

      1. Avatar for Mohiyeddin Mohiyeddin گفت:

        سلام. مشکل بنده حل شد. متشکرم

        1. Avatar for زئوس Zeus زئوس Zeus گفت:

          بسیار عالی 🙂

        2. Avatar for صادق صادق گفت:

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

          1. Avatar for Mohiyeddin Mohiyeddin گفت:

            سلام
            مشکل من در سخت افزار can bus و تغذیه آی سی ISO1050 بود. با رفع مشکل سخت افزاری ارتباط به راحتی برقرار شد.

  15. Avatar for sattar sattar گفت:

    با سلام.چگونه میشه کن باس یک برد خودرو رو شبیه سازی کرد تا همون قطعه روی میز کار شبیه به هنگامی که روی خودرو وصل هست کار کنه…مرسی

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      خوب برای این کار لازمه که پکت های لازم رو خودتون توی میکروکنترلر بسازید و ارسال کنید.
      مدل های تجاری هست که این کار رو انجام میدن – من نمونه های رایگانی هم دیدم ولی خودم تست نکردم که ببینم کار هم میکنند یا خیر

  16. Avatar for الي الي گفت:

    سلام ممنون از مطالبتون
    بقيه مطلب رو ادامه نمي ديد؟

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      ای کاش روز ها ۴۸ ساعت بود تا وقت بیشتری برای پرداختن به خیلی مباحثی که دوست داریم به آنها بپردازیم داشتیم.

  17. Avatar for علی رضا علی رضا گفت:

    درود بر شما دوست گرامی.بابت تمام تلاش و کوشش فراوان برای توسعه علم الکترونیک در ایران فراموش شده سپاسگذاری میکنم. ابراهام لینکن میگه:وقتی نیکی میکنم احساس شادمانی دارم ،هنگامی که بدی میکنم حس شرمساری ،و این تمام دین من است.

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      متشکرم از شما برای کامنت انگیزه بخشتون :))

  18. Avatar for محمدرضا فرهادیه محمدرضا فرهادیه گفت:

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

    سوالی داشتم : اگر بخواهیم چند دیوایس یا ماژول را که از یک پروتکل خاصی استفاده می کنند . مثلا سریال یا I2C را به یک میکرو که یک درگاه سریال یا یک درگاه I2C دارد وصل کنیم چطوری امکان پذیر هست که مشکل تداخل نداشته باشیم و همه دیوایس ها به درستی کار کنند .

    باتشکر .

    1. Avatar for Phoenix Phoenix گفت:

      سلام دوست نازنین. مثلا در پروتکل i2c پس از Start bit آدرس یکی از دیوایس‌ها در یک فریم 7 یا 10 بیتی از سمت مستر روی خط دیتا قرار خواهد گرفت، حال اسلیوی که دارای این آدرس هست به مستر پاسخ می‌دهد و بقیه اسلیوها دیگر با این اسلیو هیچ تداخلی نخواهد داشت و انتقال دیتا به درستی صورت می‌پذیرد.

  19. Avatar for sina sina گفت:

    در صورتی که از پپپپپARM استفاده می کنید یا از پردازنده های espressif استفاده میکنید پیشنهاد من SN65HVD230 هست که به راهتی ماژولش گیر میاد و از مدل معرفی شده در مطلب میتونه مفید تر باشه
    حتی تو گیت هاب دیدم ازش به عنوان واسط بین obd-ii و esp32 استفاده کرده بود
    https://github.com/limiter121/esp32-obd2-emulator

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      همم خوب در واقع باید بگم فرقی نداره 🙂 ؛ دلیل این که MCP رو معرفی کردیم فراوانی اون توی بازار بوده و هست و متاسفانه آیسی SN65HVD230 یا گیر نمیآد یا این که خیلی گرونه !
      حالا به لحاظ فنی تفاوت چندانی با سری MCP نداره و شما با خیال راحت میتونید ازش استفاده کنید. البته باید بگیم که MCP2551 به 5 ولت برای کار کردن نیاز داره البته این هیچ مشکلی برای میکروی 3.3 ولتی ایجاد نمیکنه ؛ تا حالا باالای 3000 تا دستگاه با این آیسی بستیم و مشکلی نداشته ! تنها جایی که ممکنه شما رو دچار چالش کنه وقتیه که دستگاه شما بخواد با ولتاژ باتری کار کنه دیگه نمیشه از این آیسی استفاده کرد و باید حتما از SN65HVD230 استفاده کنید ؛ چون ولتاژ باتری های پلیمتری و لیتیومی 4 ولت هست نهایتا.
      + پروژه خوبی رو معرفی کردید 🙂

  20. Avatar for fateme fateme گفت:

    سلام خسته نباشید
    خیلی خوب و کاربردی بود
    خدا خیرتون بده.

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      متشکرم دوست عزیز 🙂

  21. Avatar for فرید فرید گفت:

    سلام
    اگر به جای میکروی STM از یه AVR معمولی استفاده کنیم و با واحد ارتباط یوزارتش به این ای سی های MCP2551 دیتا بدیم و بگیریم مثلا با بادریت 9600 ایا شدنیه؟؟
    من یه جایی حوندم که شدنیه وحتی بهتر از MAX485 هست و دو طرفه هم هست.ای سی مکس نمونه تقلبیش زیاده و من میخوام برای ارتباط فواصل دور از این ای سی استفاده کنم.نظر شما چیه؟

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      در واقع پروتکل CAN یه پروتکل پیچیده است که مثل شبکه نیاز به لایه سخت افزاری داره ؛ پروتکل CAN خیلی متفاوت تر از پروتکل Serial هست و سخت افزار سریال قابل استفاده نیست
      اگر میخواید از CAN روی پردازنده AVR استفاده کنید بهتره به سراغ خانواده ای هایی برید که این لایه سخت افزاری رو داشته باشند مثل سری AT90CAN128 یا از آیسی واسط mcp2517fd استفاده کنید.
      در مورد کاربردی که شما مد نظرتون هست ، حقیقت اینه که دلیلی برای رد یا تاییدش ندارم و تا تست نکنید نمیشه قطعی گفت ؛ اگر تست کردید جوابش رو هم با ما در اشتراک بگذارید.

      1. Avatar for فرید فرید گفت:

        متاسفانه این ای سی واسط تو ایران نایابه
        برای ارتباط در فواصل دور به صورت شبکه دچار مشکل شدم چون از طرفی هم ای سی های موجود تقلبی هستن هم دیود tvs sm712 گیر نمیاد که بزارم رو لاین a , b ای سی مثلا max485 و… که ای سی زود نسوزه.شما tvs مشابه برای اینکار سراغ دارین؟
        باشه خبرش رو میدم به شما ای سی کن رو سفارش دادم بیاد.

        1. Avatar for زئوس Zeus زئوس Zeus گفت:

          ببینید حتما نیازی نیست TVS باشه ؛ میتونید از دیود زنر یا حتی دیود عادی به عنوان برش دهنده ولتاژ استفاده کنید
          بله متاسفانه قطعات نامرغوب به شدت زیاد شده
          از مدار پیشنهادی خودش توی دیتاشیت استفاده کنید ، تا حدود زیادی مشکلات رو حل میکنه

  22. Avatar for فتحی فتحی گفت:

    مطالب سایتتون مواقعا آموزنده است.

    1. Avatar for Sisoog Os Sisoog Os گفت:

      متشکر از شما

  23. Avatar for محمد م محمد م گفت:

    سلام
    من با دو تا میکرو stm32f103c8t6 و ماژول مبدل tja1050، که لینک هر دو در ادامه هست، میخوام ارسال و دریافت اطلاعات داشته باشم اما به مشکل خوردم.
    https://shop.aftabrayaneh.com/Tja1050_CAN_BUS_TTL__AFTAB.html?search=tja
    https://shop.aftabrayaneh.com/Stm32f103c8t6_ARM_Board__AFTAB.html?search=stm32f103c8

    نحوه اتصال خیلی ساده هست…tx و rx ماژول های tja به tx و rx میکروها و can h و can L ماژول ها به هم دیگه… ماژول ها رو هم با 5 ولت تغذیه کردم

    برنامه رو با cube و کتابخونه HAL نوشتم که به شکل زیر هست.
    برنامه ی ارسال کننده به این شکل هست.
    uint32_t TX_ID = 0x4840040;
    hcan.pTxMsg->Data[0] = ‘a’;
    hcan.pTxMsg->Data[1] = ‘b’;
    hcan.pTxMsg->Data[2] = ‘c’;

    hcan.pTxMsg->IDE = CAN_ID_EXT;
    hcan.pTxMsg->ExtId = TX_ID;

    hcan.pTxMsg->DLC = 3;

    HAL_CAN_Transmit(&hcan, 1000);
    if(HAL_CAN_Transmit(&hcan, 1000) == HAL_OK)
    HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);

    و برنامه دریافت کننده به این شکل:

    CAN_FilterConfTypeDef a;
    a.FilterActivation = DISABLE;
    HAL_CAN_ConfigFilter(&hcan, &a);

    if(HAL_CAN_Receive(&hcan,CAN_FIFO0, 1000) == HAL_OK)
    HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);

    با این برنامه ها در اصل باید با هر دریافت و ارسال یک بار led رویبرد تغییر وضعیت بده. اما همیچن اتفاقی نمیوفته. در ضمن مطمئن هستم که خروجی توابع ارسال و دریافت HAL_TIMEOUT هست نه چیز دیگه ای(چون تست کردم). الان چطوری میتونم این مشکل رو حل کنم؟ مشکل از برنامه هست یا سخت افزار؟

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      سلام دوست عزیز،
      اول باید از صحت آیسی های مبدل اطمینان پیدا کنید ، برای این کار ولتاژ روی پایه 5 رو اندازه گیری کنید ، باید حدود 2.5 ولت باشه ، برای هر دو آیسی این کار رو انجام بدید ، اگر اینطور بود که یعنی مشکلی نداره !
      بعد از اون سراغ اتصالات برید ، اتصال باید به صورت یک به یک باشه ، یعنی RX آیسی مبدل به RX میکرو وصل میشه و TX آیسی مبدل به TX میکروکنترلر وصل میشه
      نکته خیلی مهم که باید بهش توجه داشته باشید به دلیل استفاده از RAM مشترک برای CAN , USB در آیسی های STM32F103 دقت داشته باشید که پریفال USB حتما خاموش شده باشه و روشن نباشه ، خوب نکته مهم بعدی اینه که چون برد بلوپیل قسمت USB رو وصل کرده یعنی مقاومت گذاشته رو خط ها ، سعی کنید از پایه های دیفالت CAN که مشترک با USB هم هست استفاده نکنید. (یعنی پایه های PA11 و PA12) و به جای اون از پایه های ری مپ شده استفاده کنید که آزاد باشند یعنی پایه های PB8 و PB9.
      نکته دیگه ای که باید بهش توجه داشته باشید ، اینه که وقتی فقط یک دستگاه رو باس کن وجود داره ، ارسال به صورت سخت افزاری انجام نمیشه و خطا میده ، پس باید هر دو دستگاه روشن باشن ، برای سهولت کار ، و اطمینان از برنامه ، راهی وجود داره
      و اون این که CAN رو در حالت LoopBack تنظیم کنید (از توی نرم افزار Cubemx امکانش هست گزینه Operating Mode رو ببینید) در این حالت هرچی ارسال کنید به صورت داخلی دایرکت میشه و خودتون دریافتش میکنید و کاری به رابط سخت افزاری نداره اینطوری میتونید از صحت برنامه مطمئن بشید.
      اگر سوالی بود در خدمت هستیم

      1. Avatar for محمد م محمد م گفت:

        ممنون
        با این توضیحات و استفاده از مد loopback تونستم حداقل ارسال رو درست کنم. با این شرایط مونده دریافت. فکر میکنم مشکل من بیشتر روی فیلتر هست…حالا باز هم نتیجه گرفتم سعی میکنم اینجا توضیح بدم روش حل مشکل رو.

        1. Avatar for زئوس Zeus زئوس Zeus گفت:

          بسیار عالی ، با استفاده از همون loopback میتونید فرایند دریافت رو هم اوکی کنید .
          منتظر توضیحاتتون هستیم 🙂

    2. Avatar for محمد نادری محمد نادری گفت:

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

      1. Avatar for زئوس Zeus زئوس Zeus گفت:

        سلام دوست عزیز
        والا قرار بود در آموزش بعدی این کار رو انجام بدیم ؛ و البته مقداری دیگر پارامتر ها رو توضیح بدیم که متاسفانه هنوز فرصت نشده بنویسم پستش رو
        انشالله سعی میکنم در اولین فرصت پست مروبطه رو بنویسم.

      2. Avatar for محمد م محمد م گفت:

        سلام
        بله مشکل من حل شده
        این روزا یه مقدار درگیر بودم متاسفانه. چشم در اولین فرصت سعی میکنم منتشر کنم.

  24. Avatar for محمد محمد گفت:

    درباره دریافت اطلاعات توضیحی ندادید. چطوری میشه اطلاعات مربوط به آی دی های مختلف رو دریافت کرد؟؟ یا این که تفاوت مستر و اسلیو در شبکه کن چی هست؟

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      سعی میکنیم در مقاله ای دیگر به جزییات بیشتر پیردازیم
      تا اونجا که اطلاع دارم ، مستر و اسلیو توی شبکه Can وجود نداره ، هر دستگاهی میتونه هم زمان هم مستر و هم اسلیو باشه

      1. Avatar for محمد محمد گفت:

        آخه فعال کردنش توی کیوب حالت مستر و اسلیو داره…
        امیدوارم زودتر حاظر بشه و استفاده کنیم از آموزشتون

        1. Avatar for زئوس Zeus زئوس Zeus گفت:

          من الان توی نرم افزار کیوب چک کردم هم برای برای میکروی سری 103 و هم سری 407 ، حالت Slave برای can نداره !
          کیوب من ورژنش 4.15.1 است.
          انشالله

  25. Avatar for احسان احسان گفت:

    بسیار عالی بود.

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      متشکرم دوست عزیز

  26. Avatar for جعفر جعفر گفت:

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

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      خواهش میکنم دوست عزیز

  27. Avatar for سجاد سجاد گفت:

    سلامم خیلی خیلی عالی بود واقعا ممنون . اگر بخش دومش رو هم قرار بدین خیلی خوب میشه .

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

  28. Avatar for dehghan dehghan گفت:

    سلام
    اگر در مورد پروتکل dmx512 و ارسال و دریافت دیتا با stm32 مثال بگذارید خیلی ممنون میشم.

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      بررسی میکنیم دوست گرامی

  29. Avatar for امین نجفی امین نجفی گفت:

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

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

  30. Avatar for masoud masoud گفت:

    سلام
    تشکر و خسته نباشید.

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      خواهش میکنم دوست عزیز.

  31. Avatar for سعید سعید گفت:

    سایتتون عالیه..دو ساعته دارم فقط مطالبش رو میخونم…خسته نباشین

    1. Avatar photo Yalda گفت:

      خیلی ممنون دوست عزیز. خوشحالیم مطالب براتون مفید بوده.

  32. Avatar for فرزانه فرزانه گفت:

    سلام میشه لطفا پروژه های بیشتری با stm32cube و برنامه نویسی ان با keil5 بزارید
    واقعیتش من تازه دارم کارمیکنم بااین نرم افزار و میخوام یه سون سکمنت با hal اجرا کنم ولی متاسفانه جواب نگرفتم میخواستم ببینم میتونین راهنماییم کنین
    باتشکر از سایتتون

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

  33. Avatar for سروش سروش گفت:

    سلام
    ممنون از آموزشتون .فوق العاده بود .
    لطفا ادامه بدید.

    1. Avatar for Sisoog Os Sisoog Os گفت:

      خواهش میکنم دوست عزیز

  34. Avatar for محمد محمد گفت:

    با سلام .ممنون از مطلب مفیدتون .
    لطفا در مورد طریقه راه اندازی پروتکل اترنت و ویژگی ها نیز مطلب بگذارید

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

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

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