پروتکل CAN (Controller Area Network) یکی از پروتکلهای ارتباطی سریال است که بهطور گسترده در صنایع مختلف، بهویژه خودروسازی و کنترل صنعتی، استفاده میشود. این گزارش جزئیات کاملی درباره این پروتکل، از جمله منشأ، ساختار، و راهاندازی آن با میکروکنترلر STM32 ارائه میدهد. اطلاعات بر اساس دیاگرام ارائهشده در تصویر پیوستشده (که شبکه CAN با STM32 را نشان میدهد) و منابع معتبر آنلاین تهیه شده است.

مقدمهای بر پروتکل CAN
پروتکل CAN یک سیستم ارتباطی است که دستگاههای مختلف را از طریق یک شبکه مشترک (CAN bus) به هم متصل میکند. این پروتکل بهویژه برای محیطهایی طراحی شده است که نیاز به انتقال دادههای واقعی (Real-Time) و قابلاعتماد دارند. دیاگرام ارائهشده در تصویر، یک شبکه CAN را با STM32 بهعنوان واحد مرکزی و اتصال به گرههایی مانند واحدهای سنسور، قدرت، نمایش و غیره نشان میدهد. این نشاندهنده کاربرد عملی CAN در سیستمهای جاسازیشده است.
منشأ و دلیل استفاده از پروتکل CAN
پروتکل CAN توسط شرکت Bosch در دهه 1980 توسعه یافت و در سال 1986 معرفی شد. این پروتکل در سال 1993 بهعنوان استاندارد بینالمللی ISO 11898 تأیید شد. دلیل اصلی استفاده از CAN شامل موارد زیر است:
- قابلیت اطمینان بالا: با مکانیزمهای پیشرفته تشخیص و رفع خطا.
- کاهش پیچیدگی سیمکشی: به جای اتصالات نقطهبهنقطه، از یک شبکه مشترک استفاده میکند.
- قابلیت چندمستر (Multi-Master): هر دستگاه میتواند پیام ارسال کند.
- مناسب برای محیطهای سخت: مقاومت در برابر نویز و شرایط نامطلوب.
- اولویتبندی پیامها: پیامها بر اساس اهمیت ارسال میشوند.
این ویژگیها CAN را برای کاربردهایی مانند سیستمهای کنترل خودرو، شبکههای سنسور و سیستمهای صنعتی ایدهآل کرده است.
ساختار فریم ارسالی
فریم (Frame) در پروتکل CAN شامل بخشهای مختلفی است که به شرح زیر است:
بخش | توضیحات |
---|---|
SOF (Start of Frame) | 1 بیت برای نشان دادن شروع فریم. |
Arbitration Field | شامل Identifier (11 بیت برای ID استاندارد یا 29 بیت برای ID گسترده) و RTR. |
Control Field | شامل IDE، r (بیت رزرو شده) و DLC (تعداد بایتهای داده، 0 تا 8). |
Data Field | شامل 0 تا 8 بایت داده واقعی. |
CRC Field | 15 بیت برای تشخیص خطا (Cyclic Redundancy Check). |
ACK Field | 1 بیت برای تأیید دریافت پیام. |
EOF (End of Frame) | 7 بیت برای نشان دادن پایان فریم. |
علاوه بر فریم داده، فریمهای دیگری مانند فریم دوری (Remote Frame) برای درخواست داده، فریم خطا (Error Frame) برای نشان دادن خطاها، و فریم بار مازاد (Overload Frame) برای تأخیر در انتقال وجود دارند.
چگونگی تأمین اولویت پیامها
اولویت پیامها در CAN بر اساس مقدار Identifier (شناسه) تعیین میشود. قانون اولویت به این صورت است:
- Identifier کمتر = اولویت بالاتر: به عنوان مثال، پیام با Identifier 0 اولویت بالاتری نسبت به پیام با Identifier 2047 دارد (برای CAN 11 بیتی).
- این سیستم بهصورت خودکار توسط شبکه CAN مدیریت میشود و در صورت تداخل دو پیام، پیام با Identifier کمتر اولویت داده میشود.
سیمکشی شبکه CAN
سیمکشی در شبکه CAN از یک جفت سیم پیچخورده (Twisted Pair) با نامهای CAN_H (High) و CAN_L (Low) استفاده میکند. این سیمها باید به استاندارد ISO 11898-2 (برای CAN سریع، تا 1 Mbps) یا ISO 11898-3 (برای CAN کند) پایبند باشند. جزئیات شامل:
- اتصال: CAN_H و CAN_L از همه دستگاهها بهصورت موازی عبور میکنند.
- مقاومت پایانی: در هر دو انتهای شبکه، یک مقاومت 120 اهم باید قرار گیرد تا از بازتابهای سیگنال جلوگیری شود.
سختافزار مورد نیاز و نقش مقاومت 120 اهم
برای پیادهسازی شبکه CAN، سختافزار زیر مورد نیاز است:
سختافزار | توضیحات |
---|---|
میکروکنترلر | مانند STM32 (F446، F103) با پریفرال CAN داخلی. |
ترانسیور CAN | مانند MCP2551 یا TJA1040 برای تبدیل سطح سیگنال. |
سیمهای CAN | جفت سیم پیچخورده برای CAN_H و CAN_L. |
مقاومت پایانی | دو مقاومت 120 اهم در انتهای شبکه. |
مقاومت 120 اهم:
- این مقاومت با ایمپدانس ذاتی خط CAN (حدود 120 اهم) همخوانی دارد.
- وظیفه آن جلوگیری از بازتابهای سیگنال است که میتواند منجر به خطاهای ارتباطی شود.
- بدون این مقاومت، کیفیت سیگنال کاهش مییابد و احتمال خطا افزایش مییابد.
راهاندازی با نرمافزار CubeMX و کتابخانه HAL
برای راهاندازی پروتکل CAN روی میکروکنترلر STM32، از نرمافزار STM32CubeMX و کتابخانه HAL میتوان استفاده کرد. مراحل به شرح زیر است:
- پیکربندی CubeMX:
- CAN1 را انتخاب کنید.
- نرخ بود (Baud Rate) را تنظیم کنید (مثلاً 500000 bps).
- حالت عملیاتی را روی Normal Mode قرار دهید.
- پینهای PA11 (CAN_RX) و PA12 (CAN_TX) را انتخاب کنید و Pull-Up را برای RX فعال کنید.
- فیلترها را پیکربندی کنید (مثلاً FilterBank = 18، FilterFIFOAssignment = CAN_FILTER_FIFO0، FilterMode = CAN_FILTERMODE_IDMASK، FilterScale = CAN_FILTERSCALE_32BIT).
- فعالسازی HAL:
- در CubeMX، HAL CAN را فعال کنید و کدهای لازم را تولید کنید.
- در کد، از تابع HAL_CAN_Init() برای اولیهسازی CAN استفاده کنید.
- برای ارسال پیام، از HAL_CAN_AddTxMessage() و برای دریافت، از HAL_CAN_ActivateNotification() و HAL_CAN_RxFifo0MsgPendingCallback() استفاده کنید.
- مثال کد در نرم افزار keil
- // اولیهسازی CAN
- HAL_CAN_Init(&hcan1);
- // پیکربندی فیلتر
- CAN_FilterTypeDef sFilterConfig;
- sFilterConfig.FilterBank = 18;
- sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
- sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
- sFilterConfig.FilterIdHigh = 0x0000;
- sFilterConfig.FilterIdLow = 0x0000;
- sFilterConfig.FilterMaskIdHigh = 0x0000;
- sFilterConfig.FilterMaskIdLow = 0x0000;
- sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;
- sFilterConfig.FilterActivation = ENABLE;
- sFilterConfig.SlaveStartFilterBank = 14;
- HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig);
- // فعالسازی اطلاعرسانی
- HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);
- // ارسال پیام
- uint32_t TxMailbox;
- HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox);
پروتکل CAN یک راهحل قدرتمند برای ارتباطات در محیطهای پیچیده مانند خودروها و سیستمهای صنعتی است. این پروتکل با ویژگیهایی مانند اولویتبندی خودکار، تشخیص خطا و ساختار ساده، امکان ارتباط بدون دردسر را فراهم میکند. دیاگرام ارائهشده در تصویر، کاربرد عملی آن را با STM32 بهعنوان واحد مرکزی نشان میدهد. راهاندازی آن با ابزارهایی مانند STM32CubeMX و کتابخانه HAL بسیار ساده است و برای مهندسان و توسعهدهندگان، گزینهای کارآمد و قابلاعتماد فراهم میکند.