آموزش کامل CAN Bus و راه اندازی آن در میکروکنترلر STM32

بازگشت به آموزشگاه

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


CAN Bus چیست ؟

پروتکل CAN Bus ( مخفف Control Area Network ) اولین بار توسط شرکت آلمانی بوش در سال 1983 توسعه یافت، در سال 1986 به صورت رسمی در کنفرانس انجمن مهندسین خودرو منتشر شد و به سرعت در صنایع خودروسازی و هواپیمایی مورد استفاده قرار گرفت. پروتکل CAN Bus یک پروتکل ارتباطی سریال دو سیمه برای برقراری ارتباط بین سیستم های الکترونیکی مختلف است که میتواند با حداکثر سرعت یک مگابیت در ثانیه 1Mbps دیتاهایی با حجم کم را با خطایی کم در حداکثر طول 40 متر منتقل کند. اولین تراشه CAN توسط شرکت اینتل در سال 1987 و کمی بعد از آن توسط Philips ساخته شدند. خودرو مرسدس بنز W140 اولین خودرویی بود که در سال 1991 با تکنولوژی سیم کشی CAN Bus تولید شد. در سال 1992 گروهی با نام CIA ( مخفف CAN In Automation ) با هدف گسترش این پروتکل در اتوماسیون صنعتی راه اندازی شد. در نهایت CAN در نوامبر 1993 تحت عنوان استاندارد ISO11898 برای استفاده های صنعتی منتشر شد که در ابتدا یک بخش بود سپس به دو بخش و بعدا به سه بخش تغییر ساختار یافت. بخش اول یعنی ISO 11898-1 که لایه پیوند داده پروتکل CAN را پوشش می دهد، بخش دوم یعنی ISO 11898-2 که لایه فیزیکی CAN با سرعت بالا را پوشش می دهد و بخش سوم ISO 11898-3 هم لایه فیزیکی CAN با سرعت پایین و مقاوم در برابر خطا را پوشش می دهد. در شکل زیر لایه های پروتکل CAN Bus را مشاهده می کنید.

نیاز برای بوجود آمدن پروتکل سریع و کم خطای CAN Bus زمانی مطرح شد که خودرو ها از شکل اولیه و ابتدایی خود خارج شده بودند و رفته رفته دارای امکانات و آپشن های بیشتری می شدند و در نتیجه نیاز به کابل کشی بیشتری داشتند. این موضوع تا جایی پیش رفت که سیم کشی میان قطعات مختلف در درون خودرو ها ( نظیر موتور، درها، چراغ ها، داشبورد، سیستم امنیتی و … ) بسیار گسترده و پیچیده شد و بر روی هزینه تمام شده و وزن نهایی خودرو و همچنین خطایابی و برنامه نویسی بخش های مختلف خودرو تاثیر به سزایی گذاشت. شکل زیر این موضوع را نشان می دهد.

اما با معرفی CAN Bus توسط شرکت بوش تمامی این مشکلات حل شد. برای مثال زمانی که خودرو BMW850 با شبکه CAN Bus روانه بازار شد، طول کابل کشی در آن 2Km، وزن این خودرو حدود 50 کیلوگرم و همچنین کانکتورهای مورد نیاز به نصف کاهش یافت. شکل زیر این موضوع را نشان می دهد.

امروزه تعداد زیادی شبکه مخصوص خودرو طراحی و از طرف شرکت های مطرح دنیا معرفی شده اند. از جمله این شبکه ها می توان به گذرگاه های CAN, VAN, LIN, ABUS اشاره کرد که هر کدام در کشورهای سازنده خودرو ها استاندارد شده اند. در میان این استانداردها CAN Bus جزو موفق ترین آن ها به حساب می آید و بیشتر خودرو سازان از این استاندارد بر روی محصولاتشان استفاده می کنند.

اما CAN Bus به علت ساختار ثابت و تغییر ناپذیر خود علی رغم همه ویژگی های خوبش نظیر خطای کم و سرعت بالا جایگزین پروتکل های اتوماسیون صنعتی نظیر ModBus، ProfiBus و .. نشد چرا که در این صنایع ممکن است دستگاه های مورد استفاده تغییر کند، تجهیزی اضافه/کم شود یا به ظور کلی خط تولید عوض شود. اما پروتکل CAN Bus برای سیستم هایی با سخت افزار و نرم افزاری خاص و غیر قابل تغییر مناسب است. برای مثال نمیتوان CAN Bus طراحی شده برای تویوتا کرولا را برای نیسان پت فایندر استفاده کرد. همچنین CAN Bus یک پروتکل لایه پایینی است که در لایه های فیزیکی و دیتا لینک ( Data Link Layer And Physical Layer ) زندگی می کند و به طور مستقیم در اتوماسیون صنعتی استفاده نمی شود. برای همین در صنعت پروتکل های لایه بالاتری برای آن وجود دارد که از مهمترین پروتکل هایی لایه بالایی که در بستر CAN پیاده سازی می شوند میتوان به CANopen ،DeviceNet و SafetyBus اشاره کرد.


حکمیت در شبکه های CAN Bus

هر پروتکل دارای حکمیت مشخصی است. هدف حکمیت شبکه ارسال و دریافت صحیح و ایمن دیتا درون شبکه در زمان مناسب و با کمترین Collision ( تصادم ) ممکن است. مثلا در پروتکل مدباس ( Modbus ) حکمیت شبکه به صورت یک Master و چندین Slave می باشد که شروع کننده ارتباط Master است بنابراین هیچ Collision که باعث از بین رفتن اطلاعات بشود رخ نمی دهد. یا در پروتکل اترنت ( Ethernet ) حکمیت شبکه به صورت چندین Server و چندین Client می باشد که شروع کننده ارتباط Client است. از آن جایی که چندین Client میتوانند همزمان ارتباط را شروع کنند امکان بروز Collision در اترنت وجود دارد که برای مدیریت Collision ها از روش CSMA/CD استفاده می شود. در این روش در صورت تشخیص بروز Collision کلاینت زمانی تصادفی منتظر می شود و دوباره ارتباط را از سر می گیرد. برای مطالعه دقیق تر این پروتکل ها به لینک های زیر مراجعه نمایید :

راه اندازی پروتکل مدباس ( ModBus RTU/ASCII ) در بستر RS485

آشنایی با پروتکل اترنت ( Ethernet ) و شبکه های محلی ( LAN )

در شبکه های CAN Bus نیز از روشی مشابه CSMA/CD استفاده می شود با این تفاوت که خطا به صورت غیر مخرب ( nondestructive ) تشخیص داده می شود. در پروتکل اترنت زمانی که Collision اتفاق می افتد Client آن ها را تشخیص می دهد و متوقف می شود سپس هر دو کلاینت از ارتباط دست می کشند و پکت های ارسالی از جانب هر دو Loss می شود و از دست می رود و سپس مجددا بعد از گذشت زمانی رندوم ارتباط جدیدی را شروع می کنند. اما در CAN Bus زمانی که Collision رخ می دهد نوعی نبرد میان دو وسیله شکل می گیرد. از آن جایی که در CAN Bus هر پیام دارای اولویت مشخصی است همیشه یکی از وسیله ها که پیامش دارای اولویت بالاتری است برنده این نبرد می شود و ادامه ارتباط خود را انجام می دهد بنابراین هر Collision همیشه یک برنده و یک بازنده دارد و بدین شکل دیگر پکت Loss مخرب اتفاق نمی افتد. اولویت دادن به پیام ها مسئله مهمی است که در هنگام طراحی بایستی به آن توجه ویژه ای داشت چرا که در CAN Bus پیام های دارای اولویت بالاتر زودتر به مقصد می رسند.

تفاوت مهم دوم که در شبکه های CAN Bus وجود دارد عدم وجود ID منحصر به فرد است. برخلاف مدباس و اترنت که هر وسیله در آن ها دارای آدرس منحصر به فرد می باشد، در CAN Bus به علت Broadcast بودن کلیه پیام ها نیازی به این ID منحصر به فرد وجود ندارد. در واقع هر وسیله ای که درون شبکه وجود دارد دیتای مورد نیاز تمامی وسیله های دیگر را بایستی در هر پیام خود ارسال نماید تا پیام بعد از Broadcast شدن به تمامی وسیله های دیگر برسد. چه آن ها این پیام را نیاز داشته باشند چه نه مجبور به شنیدن پیام های همدیگر هستند. این موضوع باعث می شود تا کلیه دیتا ها همواره در شبکه وجود داشته باشد. بنابراین CAN Bus مشابه بزرگراهی از اطلاعات است که همواره پیام ها در آن جریان دارند و هیچ وقت متوقف نمی گردند. برای همین است که پروتکل CAN Bus دارای فیلتر سخت افزاری می باشد. فیلتر سخت افزاری باعث می شود تا هر وسیله فقط پیام های مورد نیاز خود را از شبکه دریافت کند. علت سرعت بالای CAN Bus هم همین مسئله است، چرا که از یک طرف هیچ درخواست ( Request ) در این شبکه وجود ندارد و از طرف دیگر دیتای مورد نیاز هر وسیله روی باس همواره آماده دریافت است.

در پروتکل CAN Bus به جای ID هر پیام دارای Type می باشد که مشخص می کند چه چیزی قرار است ارسال شود و همچنین این که چه چیزی قرار است دریافت شود را فیلتر می کند. در یک شبکهCAN Bus میتوان 2000 سیگنال مختلف را به صورت همزمان درون شبکه بدون نیاز به هیچ Switch یا Router ای به جریان انداخت.


نسخه های CAN Bus

برای پروتکل CAN نسخه های مختلفی وجود دارد. اولین نسخه منتشر شده از پروتکل CAN نسخه 1.1 بود. که بعدا به نسخه 1.2 توسعه یافت. جدیدترین ویرایش پروتکل CAN نسخه 2.0 می باشد که خود به دو نسخه A و B تقسیم بندی می شود. نسخه های 2.0A و 2.0B با یکدیگر و با نسخه های قبلی CAN سازگارند؛ ماژول‌های CAN با نسخه پروتکل‌های مختلف ممکن است با مقدار کمی محدودیت در یک شبکه واحد کار کنند. نسخه 2.0A همانند نسخه 1.2 در فریم خود دارای 11 بیت شناسه ( Identifier ) است بنابراین امکان ارسال/دریافت 2048 نوع پیام مختلف را فراهم می کند، در بعضی کاربردها این تعداد ممکن است خیلی کم باشد برای همین نسخه 2.0B بوجود آمد چرا که نسخه 2.0B دارای فریم‌هایی با 29 بیت شناسه می‌باشد بنابراین امکان 536870912 نوع پیام مختلف را فراهم می کند. به همین دلیل به CAN 2.0A فرمت استاندارد و به CAN 2.0B فرمت توسعه داده شده یا فریم-بلند گفته می شود.

Standard CAN ( V2.0A ) : 11-Bit Identifier. Extended CAN ( V2.0B ) : 29-Bit Identifier. Identifier = Priority.

شرکت بوش همچنان این پروتکل محبوب را توسعه می دهد به طوری که در سال 2012 نسخه جدیدی از آن را تحت عنوان CAN FD با قابلیت نرخ تبادل اطلاعات متغیر ( Flexible Data-Rate ) منتشر کرده است. نسخه CAN FD مزیت های جدیدی ارائه می دهد که عبارت است از :

  • افزایش طول داده در هر فریم : طول دیتا در CAN استاندارد می تواند حداکثر 8 بایت باشد اما در CAN FD میتوان تا 64 بایت را در هر فریم منتقل کرد که منجر به بهبود کارایی پروتکل می شود.
  • افزایش سرعت انتقال داده : حداکثر سرعت در CAN استاندارد می تواند 1Mbps باشد اما در CAN FD میتوان تا 5Mbps سرعت را افزایش داد.
  • بهبود قابلیت اطمینان ( Reliability ) : در CAN FD از الگوریتم CRC ( مخفف cyclic redundancy check ) بهبود یافته استفاده می شود که باعث تشخیص بهتر خرابی ها می شود.
  • افزودن ویژگی های امنیتی : در CAN FD قابلیت احراز هویت و برقراری ارتباط امن اضافه شده است که باعث افزایش امنیت پروتکل می شود.

قالب دیتا در CAN Bus

قالب ارسال دیتا در پروتکل CAN Bus به صورت زیر می باشد :

همانطور که مشاهده می کنید اصلی ترین تفاوت میان CAN 2.0A و CAN 2.0B در Identifier آن ها است. همچنین بیت IDE مشخص کننده Extended بودن یا نبودن این Identifier است. اکنون این قالب دیتا را کامل تر بررسی می کنیم.

SOF ( Start Of Frame )

1 بیت که همیشه مقدار آن صفر است و مشخص کننده شروع دیتا می باشد

Identifier

11 بیت مشخص کننده Message ID به منظور تعیین نوع و اولویت پیام می باشد. بنابراین یک فریم اطلاعات استاندارد با شناسه 000 0000 0000 دارای بالاترین اولویت انتشار و فریم اطلاعات با شناسه 111 1111 1111 دارای پایین ترین اولویت انتشار بر روی باس CAN است.

RTR ( Remote Transmission Request )

1 بیت که هر کس آن را صفر کند مسئول باس می شود و در هنگام درخواست از دستگاه دیگر کاربرد دارد

IDE ( Identifier Extension )

1 بیت که مشخص کننده Extended بودن یا نبودن Identifier می باشد. بنابراین اگر این بیت 0 باشد به معنای CAN 2.0A و اگر 1 باشد به معنای CAN 2.0B بودن فرمت دیتا است.

RES ( reserved )

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

Data

بین 0 تا 8 بایت دیتا می تواند قرار گیرد. محتوای Data Bytes در پروتکل CAN Bus مشخص نیست یعنی برای پروتکل اهمیت ندارد چه تعداد بایتی در بخش Data Bytes قرار می گیرد و این دیتا مربوط به چه متغیری است، آن متغیر چه نوعی دارد و مربوط به کدام قسمت از آن وسیله می گردد. تمامی این ها در پروتکل CAN Bus توس طراح مشخص می گردد و استاندارد خاصی ندارد. بنابراین پروتکل CAN Bus انعطاف پذیری بالایی دارد و دست طراح برای نوع و ترتیب قرار گرفتن دیتا باز است که به نوعی هم مزیت و هم عیب محسوب می شود. عیب آن زمانی است که دیتا سایز مشخصی ندارد یا تعداد دیتاها ثابت نیست محسوس تر می گردد.

CRC

15 بیت به منظور خطایابی دیتای ارسالی می باشد. فرستنده پیام، این کد CRC را از ابتدای شروع فریم تا پایان فیلد داده محاسبه کرده و همراه پیام می فرستد. در طرف گیرنده، CRC مجددا از ابتدای شروع فریم تا پایان فیلد داده (با همان فرمول محاسبه CRC طرف فرستنده) محاسبه می‌شود و سپس با CRC ارسالی از طرف فرستنده مقایسه می‌گردد. اگر عدم تطابق شناسائی شود، خطای CRC رخ داده، پیام دریافتی دور ریخته می‌‍شود و یک Frame Error تولید می‌شود.

ACK

1 بیت به منظور تایید دریافت صحیح دیتا می باشد که همیشه مقدار آن توسط فرستنده 1 بوده و وسیله ای که پیغام را صحیح دریافت کرده می بایست باس را 0 کند. اگر گیرنده باس را 0 نکند، پیام توسط فرستنده دوباره ارسال می‌شود و شمارنده وقوع خطا یکی افزایش می‌یابد. اگر تعداد خطاهای ارسال به یک وسیله از تعداد معینی بیشتر شود، آن وسیله نادیده گرفته می شود.

EOF ( end of frame )

1 بیت که مشخص کننده پایان فریم می باشد


ویژگی های الکتریکی CAN Bus

پروتکل CAN Bus یکی از رابط های دوسیمه تفاضلی ( differential ) و نیمه دو طرفه ( Half-Duplex ) دارای دو باس CAN_H و CAN_L می باشد. از آن جایی که توپولوژی شبکه به صورت باس می باشد، به دو مقاومت 120 اهم در دو انتهای باس به منظور جذب سیگنال و کاهش سیگنال برگشتی از ته خط مورد نیاز می باشد. ماکزیمم تعداد وسایل قابل اتصال در این شبکه 110 وسیله است. شکل زیر این موضوع را نشان می دهد.

بالا ترین نرخ ارسال داده در این پروتکل 1Mbps و کمترین آن 10Kbps می باشد. حداکثر طول خط انتقال در CAN Bus در سرعت 1Mbps بسته به تعداد وسیله های موجود در باس حداقل 40 متر و حداکثر یک کیلومتر می باشد. افزایش سرعت ارسال اطلاعات با طول کابل رابطه عکس دارد بنابراین در سرعت های پایین تر از 1Mbps میتوان طول کابل را افزایش داد. همچنین هر چقدر تعداد وسیله های موجود در باس افزایش یابد حداکثر طول انتقال کاهش می یابد. برای انتقال سریع CAN باید از کابل های با حداکثر تأخیر 5ns/m استفاده کرد.

پروتکل CAN Bus دارای ویژگی الکتریکی DOMINANT به معنای غالب و RECESSIVE به معنای مغلوب می باشد. حالت مغلوب زمانی رخ می دهد که دو سیم CAN_H و CAN_L هم پتانسیل باشند ( منطق 1 ) و حالت غالب هم زمانی رخ می دهد که دو سیم با هم هم پتانسیل نباشند ( منطق 0 ). این ویژگی الکتریکی در CAN Bus باعث می شود که منطق 0 همیشه غالب باشد. بنابراین هر وسیله ای که باس را به منطق 0 ببرد هیچ وسیله ای نمی تواند باس را به منطق 1 ببرد. در حالتی که هیچ دیتایی رد و بدل نمی شود وضعیت باس IDLE بوده و منطق باس مغلوب ( منطق 1 ) می باشد. بنابراین هر وسیله ای قبل از شروع ارتباط باس را چک می کند و تنها در صورت 1 بودن باس اقدام به ارسال می نماید. به همین علت همیشه بیت شروع فریم ( SOF ) منطق 0 است.

حال اگر دو وسیله مختلف وضعیت IDLE بودن باس را چک کنند و همزمان بخواهند دیتا روی باس ارسال کنند چه اتفاقی می افتد ؟ هر دو بیت SOF را ارسال می کنند سپس نوبت به ارسال Identifier می شود. اینجا جایی است که Identifier تعیین کننده اولویت است. از آن جایی که پیام ها Identifier منحصر به فرد دارند آن پیام که مقدار Identifier کمتری دارد دارای اولویت بالاتری است و زودتر از Identifier دیگر 0 می شود و باس را در دست می گیرد. شکل زیر این موضوع را نشان می دهد.

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


راه اندازی CAN Bus در میکروکنترلر STM32

برای برقراری ارتباط چندین وسیله با استفاده از شبکه CAN Bus نیاز به استفاده از لایه فیزیکی و کنترلر CAN هستیم. بسیاری از میکروکنترلرهای ARM دارای واحد کنترلر سخت افزاری CAN Bus می باشند. بنابراین در میکروکنترلرهای ARM برای راه اندازی شبکه CAN Bus نیاز به آی سی لایه فیزیکی CAN می باشد. آسیب پذیرترین بخش CAN Bus نیز همین بخش لایه فیزیکی آن است و به همین دلیل این قسمت را در چیپ میکروکنترلر قرار نمی‌دهند تا در صورت بروز حادثه، به میکروکنترلر یا واحد کنترلر CAN صدمه ای وارد نشود. آی سی های مختلفی توسط شرکت‌های مختلف برای واسط شبکه‌ی CAN ساخته شده‌اند ولی در دسترس‌ترین و مناسب‌ترین آن‌ها، آی سی MCP2551 ساخت شرکت میکروچیپ است. شکل زیر نحوه استفاده از این آی سی را برای یک شبکه CAN Bus با دو گره ( Node ) نشان می دهد.

همچنین اگر احیانا سخت‌افزار کنترلر CAN در میکروکنترلر مورد‌نظر شما وجود ندارد، به‌راحتی می‌توانید از آی سی MCP2515 استفاده کنید. این آی سی یک مبدل SPI به CAN است. در اینجا ما از میکروکنترلر STM32F407 استفاده کردیم که دارای دو واحد سخت افزاری CAN1 و CAN2 می باشد.

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

راه اندازی واحد CAN در میکروکنترلر STM32 به دو صورت استفاده از توابع CMSIS و یا استفاده از توابع HAL امکان پذیر است. در صورت استفاده از نرم افزار Stm32CubeMx کافیست تنظیمات CAN را انجام دهید تا کد بر اساس توابع HAL تولید شود. اما برای راه اندازی توسط توابع CMSIS مراحل زیر را دنبال کنید :

  1. فعالسازی کلاک واحد GPIO مربوط به پورتی که CANX روی آن است
  2. کانفیگ پایه های CANX_TX و CANX_RX برای استفاده در حالت CAN Bus
  3. راه اندازی واحد GPIO مربوط به پورتی که CANX روی آن است
  4. راه اندازی وقفه دریافت CAN
  5. فعالسازی کلاک واحد CANX
  6. راه اندازی واحد CANX
  7. راه اندازی فیلتر واحد CANX
  8. فعالسازی وقفه دریافت CANX

همچنین میتوان واحد CAN را در حالت بدون وقفه نیز راه اندازی کرد که در آن صورت به صورت Polling بایستی کد نویسی شود و موارد راه اندازی و فعالسازی وقفه از مراحل فوق حذف می گردد. به علت اینکه میکروکنترلرهای STM32 دارای دو واحد CAN هستند حالتی به نام LoopBack Mode در آن ها وجود دارد که در این حالت دو واحدCAN1و CAN2 از داخل میکروکنترلر به یکدیگر وصل می شوند. از این حالت صرفا به منظور تست عملکرد واحدهای CAN میکروکنترلر میتوان استفاده نمود.


لینک دانلود پروژه راه اندازی شبکه CAN Bus در میکروکنترلر STM32F407

1 دیدگاه

  • کاوه پاسخ

    سلام ممنون توضیحاتی که در مورد پروتکل کن در سایتتان قرار دادید اگر یک پروژه عملی هم میگذاشتید خوب میشد. بازم ممنون

    1401-03-22 در 11:54

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

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

بازگشت به آموزشگاه