Разработка сайта для Вашего бизнеса. Веб дизайн. Дизайн логотипа, фирменного стиля, рекламная фотография . Комплексный рекламный креатив.

Ralex. We do the work.
На рынке с 1999го года. Средняя ценовая категория. Ориентация на эффективность решений.
Ознакомтесь с нашим портфолио
Узнайте больше о услугах
Свяжитесь с нами:
E-mail: [email protected]
Tel: (044) 587 - 84 - 78
Custom web design & дизайн и разработка сайта "под ключ"
Креативный, эффективный дизайн. Система управления сайтом (СУС).
Custom flexible разработка систем электронной коммерции
Система e-commerce разрабатывается под индивидуальные потребности. Гибкая функциональность.
Search Engine Optimzation & оптимизация под поисковые системы (SEO)
Постоянная оптимизация и мониторинг сайта в поисковых системах. Достигаем результата быстро и эффективно
Custom logo design & дизайн логотипа и фирменного стиля
Многолетний опыт. Огромное портфолио. Уникальное предложение и цена.
профессиональная рекламная фотография
креативно, смело, качественно
Custom logo design & рекламный креатив. дизайн рекламы
Многолетний опыт. Огромное портфолио. Уникальное предложение и цена.

SmartMODE.info - STM32. Реалізація протоколу CAN на базі МК STM32F103

  1. фізична зв'язок
  2. програмна частина
  3. Налаштування порту
  4. ініціалізація CAN
  5. Налаштування таймінгів
  6. Налаштування фільтрації пакетів CAN
  7. Налаштування переривань на прийом повідомлень CAN
  8. Отримання даних з шини
  9. Відправка даних в шину
  10. Пошук помилок
  11. Висновок

Наша взаимовыгодная связь https://banwar.org/

За реалізації роботи CAN протоколу на МК STM32 публікацій в інтернеті досить багато. Але досить важко налаштувати готовий код під свій пристрій, особливо якщо намагаємося це зробити вперше.

В рамках даної статті я постараюся максимально докладно розібрати програмний код і детально описати "підводні камені", з якими може вперше зіткнутися новачок.

фізична зв'язок

В першу чергу спробуємо розібратися як наш мікроконтролер зв'язується з CAN-шиною.

Більшість контролерів сімейства STM32 мають одне або кілька модулів CAN. Кожен порт - це дві ніжки: TX - для передачі даних і RX - для прийому даних з шини. CAN-порт для зручності можна перенаправити на інші ніжки контролера, це може полегшити розводку плати. Наприклад в stm32f103c8 "за замовчуванням" це Піни PA11 (CAN_RX) і PA12 (CAN_TX), але їх можна перенаправити на Піни PB8 і PB9 відповідно.

Для зв'язку мікроконтролера з шиною недостатньо набудувати ніжки і підчепити їх до CAN - в кращому випадку може вигоріти порт контролера, а в гіршому і все наше пристрій цілком. Для під'єднання контролера до шини потрібно ще один електронний компонент - приймач фізичного рівня мережі (трансивер), як правило це 8-ми контактна мікросхема в корпусі SOIC-8 або DIP-8. також зустрічаються в корпусах SOT23-8 і SOIC-14, але набагато рідше.

Трансівер у вигляді окремої мікросхеми є необхідністю. Пояснюється це, перш за все, високими вимогами до його надійності та принцип роботи даного, оскільки працює він з ланцюгами, фізично що виходять за межі пристрою (в даному випадку це сама шина CAN). А умови, в яких перебувають ці ланцюги, часто не визначені: наприклад, сильні магнітні поля або пролягають поруч силові високовольтні ланцюги. Більш того, при необхідності гальванічної розв'язки її найзручніше здійснювати саме між трансивером і контролером CAN-мережі.

Даний матеріал присвячений більше програмної частини, тому більш детально про "залізної" складової проекту, про види трансиверах і варіантах їх використання, я опишу в окремій статті.

програмна частина

Зрозумівши як це все працює фізично, приступимо до розгляду програмної частини.

Програмну частину можна розділити на кілька частин:

Налаштування порту і ініціалізація CAN шини;
• Налаштування фільтрації повідомлень;
• Прийом повідомлень;
• Передача повідомлень.

До того ж потрібно також передбачити обробку помилок CAN, але зробимо це в окремій статті, так як для першого запуску і розуміння роботи з шиною цього буде достатньо.

Розберемо тепер кожен етап докладніше.

Налаштування порту

Наведу приклад налаштування портів і ініціалізації CAN шини в мікроконтролері STM32F103

Лістинг 1. Налаштування портів: / ******************************************* *********************************** Визначення настройки CAN ************ ************************************************** **************** / #define CAN1_ReMap // Закоментіровать, якщо немає ремапінга портів #ifndef CAN1_ReMap #define CAN1_GPIO_PORT GPIOA #define CAN1_RX_SOURCE GPIO_Pin_11 // RX-порт #define CAN1_TX_SOURCE GPIO_Pin_12 // TX-порт #define CAN1_Periph RCC_APB2Periph_GPIOA // порт периферійних #else #define CAN1_GPIO_PORT GPIOB #define CAN1_RX_SOURCE GPIO_Pin_8 // RX-порт #define CAN1_TX_SOURCE GPIO_Pin_9 // TX-порт #define CAN1_Periph RCC_APB2Periph_GPIOB // порт периферійних #endif GPIO_InitTypeDef GPIO_InitStructure; // CAN GPIOs configuration RCC_APB2PeriphClockCmd (RCC_APB2Periph_AFIO, ENABLE); // включаємо тактирование AFIO RCC_APB2PeriphClockCmd (CAN1_Periph, ENABLE); // включаємо тактирование порту RCC_APB1PeriphClockCmd (RCC_APB1Periph_CAN1, ENABLE); // включаємо тактирование CAN-шини // Налаштовуємо CAN RX pin GPIO_InitStructure.GPIO_Pin = CAN1_RX_SOURCE; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed ​​= GPIO_Speed_50MHz; GPIO_Init (CAN1_GPIO_PORT, & GPIO_InitStructure); // Налаштовуємо CAN TX pin GPIO_InitStructure.GPIO_Pin = CAN1_TX_SOURCE; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed ​​= GPIO_Speed_50MHz; GPIO_Init (CAN1_GPIO_PORT, & GPIO_InitStructure); #ifdef CAN1_ReMap GPIO_PinRemapConfig (GPIO_Remap1_CAN1, ENABLE); // Переносимо Can1 на PB8, PB9 #endif

У визначеннях відразу передбачимо можливість перевизначення портів обміну з CAN шиною. Якщо нам не потрібен ремап, то рядок "#define CAN1_ReMap" повинна бути закоментований, а якщо ж ми використовуємо переадресацію, то просто раскомментіруем цей рядок і CAN буде налаштований на роботу через порт GPIOB на пінах PB8 і PB9.

Слід звернути увагу на те, що якщо у Вашому микроконтроллере кілька CAN пристроїв, то настройка переадресації, як і настройка CAN в цілому, може трохи відрізнятися.

Далі в процедурі ініціалізації ми включаємо тактирование альтернативних функцій, CAN-шини і порту, на якому буде "висіти" наша шина, інакше у нас нічого не заробить, так як контролер не знатиме, що цю периферію потрібно активувати.

Потім налаштовуємо ніжки контролера:

Для CAN RX налаштовуємо режим роботи як GPIO_Mode_IPU - вхід з підтяжкою до харчування,
а для CAN TX налаштовуємо режим роботи як GPIO_Mode_AF_PP - вихід з двома станами (Push-Pull) для альтернативних функцій.

Якщо у нас встановлено переадресацію, то компілятор додасть в код ще й команду ремапінга портів шини.

В принципі це все настроювання пинов, тепер нам залишилося зробити ініціалізацію самого пристрою.

ініціалізація CAN

Визначаємо структуру опису CAN, потім "відключаємо" його для настройки.

Нам необхідно задати кілька параметрів протоколу, а також режим роботи і таймінги.

Лістинг 2. Налаштування CAN: // Ініціалізація шини CAN_InitTypeDef CAN_InitStructure; CAN_DeInit (CAN1); CAN_StructInit (& CAN_InitStructure); // CAN cell init CAN_InitStructure.CAN_TTCM = DISABLE; CAN_InitStructure.CAN_ABOM = ENABLE; CAN_InitStructure.CAN_AWUM = ENABLE; CAN_InitStructure.CAN_NART = DISABLE; CAN_InitStructure.CAN_RFLM = DISABLE; CAN_InitStructure.CAN_TXFP = ENABLE; CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_13tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq; CAN_InitStructure.CAN_Prescaler = 50; CAN_Init (CAN1, & CAN_InitStructure);

Тут ми трохи докладніше розглянемо настройки ініціалізації.

Почнемо з параметрів роботи CAN:

Таб. 1. Параметри CAN Параметр Розшифровка Пояснення CAN_TTCM Enable or disable the time triggered communication mode .
Включення або відключення режиму Time Triggered Mode.
Цей параметр впливає на включення таймера.
Внутрішній 16-бітний таймер використовується для прив'язки мітки часу до кожного прийнятого і відправленого повідомленням. Цей таймер починає рахунок з моменту дозволу роботи контролера CAN.
Цей лічильник може бути скинутий додатком або автоматично після прийому в останній mailbox, коли встановлений Time Triggered Mode
CAN_ABOM Enable or disable the automatic bus-off management.
Включення або відключення автоматичного відключення шини.
Якщо режим включений, то при накопиченні помилок прийому даних з шини, CAN автоматично буде відключений.
У будь-якому випадку необхідно контролювати помилки прийому, вміст поштових скриньок і, при необхідності скидати помилки вручну.
CAN_AWUM Enable or disable the automatic wake-up mode.
Включення або відключення автоматичного пробудження пристрою за сигналом з CAN-шини. При включенні цього параметра пристрій буде автоматично прокидатися, але слід звернути увагу що на активацію пристрою потрібен якийсь час і перший пакет, переданий по шині, може бути втрачено.
CAN_NART Enable or disable the no-automatic retransmission mode.
Включення або відключення режиму перевірки отримання пакету.

Якщо цей режим включений, то мікроконтролер при передачі кадру не перевірятиме підтвердження отримання пакета усіма пристроєм на шині.
Якщо вимкнений - то, при передачі кадру, мікроконтролер буде слухати шину на предмет отримання підтвердження від усіх пристрою про те, що пакет отриманий і, якщо не отримано хоча б одним устройтсво, то буде намагатися відправити повторно до тих пір, поки всі пристрої не підтвердять отримання пакету.
Іншими словами: Якщо увімкнути функцію налаштування передав і забув, при вимкненому - передав і перевірив, якщо не зміг відправити, то намагається ще раз, поки не зможе відправити.
Якщо пристрій не підключений до шини або якщо неправильно налаштовані тайминги, то при виключенні цього параметра контролер буде нескінченно намагатися відправляти пакет в шину.

CAN_RFLM Enable or disable the Receive FIFO Locked

mode .
Включення або відключення режиму блокування Receive FIFO
0 - при переповненні RX_FIF0 прийом не переривається (3 повідомлення до заповнення FIFO), кожен новий пакет затирає попередній
1 - при переповненні RX_FIF0 прийом переривається (3 повідомлення до заповнення FIFO), нові пакети відкидаються до звільнення RX_FIFO.
(Спасибі maxx_ir за підказку) CAN_TXFP Enable or disable the transmit FIFO priority.
Включення або відключення пріоритету передачі FIFO
Включення цього параметра визначає, в якому порядку повідомлення будуть відправлятися в шину.
Увімкнувши цей параметр, то повідомлення відправляються в хронологічному порядку: FIFO - First Input First Output - Перший прийшов - першим пішов.
Якщо ж вимкнений, то пакети передаються в залежності від пріоритету ID пакета. Тобто пакет з більш високим пріоритетом буде відправлений раніше.

Для першого запуску і тестування пристрою нам буде досить включити режим "CAN_NART". При підключенні осцилографа до шини, якщо пристрій нормально функціонує, ми побачимо сплески активності в залежності від того, як часто передаємо дані по шині.

Якщо ж "CAN_NART" вимкнений, то при включеному параметрі "CAN_ABOM" буде зроблено всього 128 спроб передати пакет, а потім мікроконтролер відключить модуль Can (якщо Ви не будете обробляти помилки і скидати лічильники помилок ). При вимкненому "CAN_ABOM" автоматичного відключення модуля Can не відбудеться.

Якщо ж пристрій не отримуватиме підтвердження про отримання пакетів, то осцилограф намалює "гребінець", так як пристрій буде нескінченно намагатися передати пакети, поки не отримає підтвердження.

Наступний параметр CAN_Mode визначає в якому режимі контролер буде працювати з CAN-шиною:

Таб. 2. Режим роботи контролера Параметр Розшифровка Пояснення CAN_Mode_Normal
Таб Normal -Нормально режим роботи При цьому параметрі МК буде працювати в звичайному (нормальному) режимі роботи. Дані будуть передаватися і читатися з шини.
CAN_Mode_LoopBack
LoopBack - слухати себе При виборі режиму LoopBack, контролер буде передавати дані в шину і слухати себе ж одночасно.
Це рівнозначно тому, що в USART ми б замкнули ніжку TX на ніжку RX.
Але пакети з шини доходити до контролера не будуть.
CAN_Mode_Silent
Silent - слухати шину Ідеальний при налаштуванні пристроїв, яким потрібно тільки слухати шину. Наприклад, якщо нам потрібно підключитися до CAN шині автомобіля, але ми боїмося допустити будь-які збої через неправильну відправки пакетів в шину, то цей режим буде ідеальним, так як в шину автомобіля пакети з пристрою потрапляти не будуть.
CAN_Mode_Silent_LoopBack
Це об'єднані режими Silent і LoopBack - слухати тільки себе В даному режимі всі пакети будуть повністю крутиться всередині контролера без виходу в загальну шину.
З шини відповідно жоден пакет даних не дійде до пристрою.
Цей режим ідеальний для налагодження пристрою. При включенні його ми можемо як передати дані в шину, так і обробити ті дані, які ми ж і відправили, при цьому не маючи фізичного підключення до шини.

Повторюся, якщо Ви тільки починаєте працювати з CAN і у Вас немає готового пристрою з трансівером, Ви можете навчиться працювати з шиною на будь-який отладочной платі з мікро контролером STM32, який підтримує CAN. Для цього достатньо вибрати при налаштуванні режим роботи CAN_Mode_Silent_LoopBack або CAN_Mode_LoopBack. У цих режимах Ви зможете відправляти пакети даних і приймати їх же на одному пристрої.

Налаштування таймінгів

Синхронізація і таймінги в CAN - окремий, важливий і складний питання. Однак, завдяки складності і продуманості стає не так важлива можлива рассинхронизация і нестабільність тактових частот вузлів мережі, і зв'язок стає можливою навіть у важких умовах.

Коротенько розберемо як виглядає передача одного біта інформації при передачі повідомлення в CAN шині.

Коротенько розберемо як виглядає передача одного біта інформації при передачі повідомлення в CAN шині

Весь час ділиться на кванти довжиною t_q, і номінальна тривалість біта дорівнює 1 + BS1 + BS2 квантів. Захоплення значення біта відбувається на кордоні BS1 і BS2. У процесі прийому приймач визначає, в який з тимчасових періодів стався перепад сигналу (тобто початок прийому нового біта). У нормі перепад повинен відбутися на кордоні SYNC і BS1, якщо він стався раніше - контролер зменшує BS1, якщо пізніше - збільшує BS2 на величину SJW (від 1 до 4 квантів часу). Таким чином, відбувається постійна пересінхронізація з частотою інших приймачів.

У нашому прикладі ми налаштовуємо тайминги з урахуванням того, що перефирії налаштована на частоту 8MHz. За допомогою калькулятора таймингов, вибираємо оптимальні під нашу шину і мікроконтролер.

Швидкість шини налаштовується за допомогою прескалера. При зазначених параметрах таймінгу і CAN_Prescaler рівним 50 - швидкості передачі по шині складе 10 Кбіт.

Щоб змінити пропускну здатність, в нашому прикладі досить змінити CAN_Prescaler, наприклад при значенні рівному "1", швидкість передачі складе 500 Кбіт, при "2" - 250 Кбіт, ну і так далі. У прикладі коду, наданому у вкладенні до даної статті, розписані всі значення CAN_Prescaler, доступні для даного проекту. В принципі можна добится швидкості аж до 1 Мбита.

За настройку таймінгів при ініціалізації CAN пристрої відповідають чотири параметри:

Таб. 3. Параметри налаштування таймінгів Параметр Розшифровка Пояснення CAN_SJW Розмір SJW SJW (reSynchronization Jump Width) визначає максимальну кількість квантів часу, на яке може бути збільшена або зменшена кількість квантів часу бітових сегментів. Можливі значення цього показника від 1-го до 4-х квантів. CAN_BS1 Довжина сегмента фази 1 BS1 (Bit Segment 1) - визначає місце розташування точки захоплення (Sample Point). Він включає в себе Prop_Seg і PHASE_SEG1 стандарту CAN. Його тривалість програмується від 1 до 16 квантів часу. CAN_BS2 Довжина сегмента фази 2 BS2 (Bit Segment 2) - визначає місце розташування точки передачі. Він являє собою PHASE_SEG2 стандарту CAN. Його тривалість програмується від 1 до 8 квантів часу. CAN_Prescaler Множник Множник, з значення якого розраховується розмір кванта часу. Розраховується виходячи від частоти роботи периферії мікроконтролера.
Важливо не плутати з частотою роботи самого контролера!

Для тестування досить буде використовувати параметри налаштування таймінгів, запропоновані в прикладі. Більш докладно про те що таке таймінги, а також як їх правильно виставити описано в окремій статті ( STM32. Налаштування таймінгів роботи CAN ).

Налаштування фільтрації пакетів CAN

Усі вхідні повідомлення проходять через фільтр. Фільтр можна налаштувати на відстеження як якогось конкретного повідомлення так і групи - настройка маски. Завдяки цьому зменшується навантаження на процесор, так як йому не доводиться самому фільтрувати непотрібні повідомлення - це робиться на апаратному рівні.

Лістинг 3. Налаштування фільтрації пакетів (без обмежень) // CAN filter init CAN_FilterInitTypeDef CAN_FilterInitStructure; CAN_FilterInitStructure.CAN_FilterNumber = 1; CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit (& CAN_FilterInitStructure);

В рамках даної публікації я не буду детально описувати налаштування роботи з фільтрами, це матеріал для окремої статті (див. Поштові ящики. Фільтри пакетів CAN ). Скажу лише, що для початку достатньо встановити фільтри без обмежень, а згодом можна самостійно їх налаштувати під свої вимоги.

Необхідно звернути увагу, що налаштування фільтрів і включення їх обов'язково, інакше Ви не зможе отримувати повідомлення з шини.

Налаштування переривань на прийом повідомлень CAN

З переривань справи йдуть ні трохи не складніше, ніж зі структурою ініціалізації. Для початку треба налаштувати і проинициализировать контролер переривань (NVIC - Nested vectored interrupt controller). В архітектурі STM32 кожному переривання можна виставити свій пріоритет для випадків, коли виникає декілька переривань одночасно. Тому NVIC представляє нам кілька варіантів формування пріоритетних груп. Я не буду вдаватися в подробиці, в нашому випадку це не актуально, так як у нас на даний момент налаштоване лише одне переривання на обробку пакетів CAN /

Для того, щоб ми змогли отримувати повідомлення з CAN шини, ми повинні включити переривання на отримання повідомлень шини, а також дозволити переривання за фактом появи повідомлень в поштовій скриньці.

Лістинг 4. Налаштування обробника переривань // CAN FIFO0 message pending interrupt enable CAN_ITConfig (CAN1, CAN_IT_FMP0, ENABLE); // NVIC Configuration // Enable CAN1 RX0 interrupt IRQ channel NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init (& NVIC_InitStructure);

Слід звернути увагу, що переривання для CAN шини і USB одне і теж. Якщо Ви будете використовувати обидва пристрої в своїй розробці, то необхідно більш ретельно підійти до опрацювання переривань від них. Можуть виникнути проблеми аж до повної відмови одного з пристроїв.

У пункті "NVIC_IRQChannel" ми вказуємо, яке саме переривання ми инициализируем. Константа "USB_LP_CAN1_RX0_IRQn" позначає канал, який відповідає за переривання, пов'язані з CAN1. Знайшовши її визначення у файлі stm32f10x.h, ви побачите ще безліч констант (ADC1_IRQn, TIM1_TRG_COM_TIM17_IRQn і ін.), Що позначають переривання від інших периферійних пристроїв.

Наступними двома рядками ми вказуємо пріоритет переривань (максимальні значення цих двох параметрів визначаються обраної пріоритетною групою). Потім вказуємо, що переривання активно.

Останній рядок, власне, включає використання переривання.

На цьому настройку CAN можна вважати закінченою. Ми врахували всі основні моменти, які можуть виникнуть на початковому етапі вивчення можливостей CAN шини. Залежно від моделей контролерів код може дещо змінюватися, але загальні принципи роботи залишаються і легко портируют на різні сімейства мікроконтролерів.

Отримання даних з шини

Для отримання даних з шини CAN використовується переривання.

У мікроконтролерах STM32 пакети з шини обробляються на рівні заліза. Після отримання контролером повідомлення, він пропускає його через фільтри і тільки після цього поміщає їх в мейлбокс. І вже тільки після того, як повідомлення вміщено в поштову скриньку, відбувається виклик переривання на отримання повідомлення.

Варто звернути увагу, що якщо фільтр не включений або не налаштований, навіть без установки фільтрації, Ви не зможете отримувати повідомлення з шини, так як вони просто не будуть поміщатися в поштову скриньку і, відповідно, не буде викликатися переривання.

Розглянемо варіант обробки переривання на основі тестового повідомлення мережі. Ідентифікатори команд вказані в заголовки can.h (у вкладенні до статті). Але Ви можете використовувати і будь-які свої.

Лістинг 5. Оброблювач переривань void USB_LP_CAN1_RX0_IRQHandler (void) {CanRxMsg RxMessage; // обнулити дані пакета RxMessage.DLC = 0x00; RxMessage.ExtId = 0x00; RxMessage.FMI = 0x00; RxMessage.IDE = 0x00; RxMessage.RTR = 0x00; RxMessage.StdId = 0x00; RxMessage.Data [0] = 0x00; RxMessage.Data [1] = 0x00; RxMessage.Data [2] = 0x00; RxMessage.Data [3] = 0x00; RxMessage.Data [4] = 0x00; RxMessage.Data [5] = 0x00; RxMessage.Data [6] = 0x00; RxMessage.Data [7] = 0x00; if (CAN_GetITStatus (CAN1, CAN_IT_FMP0)! = RESET) // Перевіримо поштову скриньку {CAN_Receive (CAN1, CAN_FIFO0, & RxMessage); // Перевіримо тип заголовка повідомлення if (RxMessage.IDE == CAN_Id_Standard) {if (RxMessage.StdId == CAN_CMD_Test_Send) {// Якщо отримали тестове повідомлення CAN_Send_Ok (); } If (RxMessage.StdId == CAN_CMD_Test_Ok) {// Якщо отримали підтвердження отримання // Вставляємо будь-який свій код, наприклад блимання діодом}}}}

Для початку ми оголошуємо змінну і заповнюємо її нулями. Якщо цього не зробити, то повідомлення буде заповнено "сміттям", що може нам дещо ускладнити життя в разі появи помилок.

Після цього перевіряємо статус нашого поштової скриньки і, якщо є повідомлення, опрацюємо їх.

Потім перевіримо формат кадру: Якщо стандартний, то перевіряємо параметр "StdID", але а якщо розширений, то дані команди будуть в параметрі "ExtId".

Після отримання тестового повідомлення, ми у відповідь відсилаємо підтвердження отримання.

Тут ми не розглядаємо передачу блоку даних (але в тестовому повідомленні ми їх передавали). Для перевірки наявності даних в пакеті, необхідно перевірити параметр повідомлення "DLC", якщо його значення більше нуля, то ми можемо отримати рівно стільки байт, скільки вказано в цьому параметрі. дані зберігаються в масиві "Data [0..7]".

Відправка даних в шину

Для відправки тестового пакета в шину напишемо окрему функцію, яка буде викликатися з основного циклу програми кілька разів на секунду.

Лістинг 6. Відправка даних в шину void CAN_Send_Test (void) {CanTxMsg TxMessage; TxMessage.StdId = CAN_CMD_Test_Send; // Команда шини TxMessage.ExtId = 0x00; // Розширену команду вказувати немає сенсу TxMessage.IDE = CAN_Id_Standard; // Формат кадру TxMessage.RTR = CAN_RTR_DATA; // Тип повідомлення TxMessage.DLC = 3; // Довжина блоку даних 3 - передамо три байта TxMessage.Data [0] = 0x00; // Байт даних №1 TxMessage.Data [1] = 0x01; // Байт даних №2 TxMessage.Data [2] = 0x02; // Байт даних №3 CAN_Transmit (CAN1, & TxMessage); }

Тут все просто: оголошуємо змінну TxMessage, заповнюємо дані для відправки і виконуємо команду передачі даних в шину.

Тепер трохи докладніше про параметри повідомлення:

Таб. 4. Параметри повідомлення Параметр Розшифровка Пояснення StdId Повідомлення стандартного кадру Стандартна команда, яку ми передаємо в шину. Довжина команди не може перевищувати 11 біт.
ExtId Повідомлення розширеного кадру Розширена команда, яку ми передаємо в шину. Довжина становить 29 біт.
IDE Формат кадру Тут ми вказуємо, кокой формат кадру ми використовуємо: CAN_Id_Standard або CAN_Id_Extended.
Виходячи з того, який формат кадру ми обрали, нам потрібно заповнювати команду StdId або ExtId відповідно.
RTR Тип повідомлення Є два типи повідомлень: CAN_RTR_Data і CAN_RTR_Remote. На сьогоднішній момент використання CAN_RTR_Remote зведено до мінімуму, в деяких протоколах взагалі не використовується.
CAN_RTR_Data - передача даних,
CAN_RTR_Remote - передача керуючого повідомлення без блоку даних, в цьому випадку параметр DLC завжди дорівнює нулю.
DLC Довжина блоку даних Тут ми вказуємо скільки байт даних ми передамо в повідомленні. Чи можемо вказати максимум 8 байт.
Data [0..7] Байти даних з 1-го по 7-й Цей блок заповнюємо байтами, які хочемо передати в пакеті.
Необхідно заповнити стільки байт, скільки вказали в параметрі DLC.

Хочеться ще раз звернути увагу на параметр формату кадру "IDE". Якщо ми вибираємо "CAN_Id_Standard", то заповнювати повинні параметр "StdId", а "ExtId" - має дорівнювати нулю. Відповідно якщо вибираємо "CAN_Id_Extended", то Обнуляємо "StdId", а заповнюємо "ExtId".

Стандартний формат кадру має довжину в 44 біта, а формат розширеного кадру - 64 біта. Але корисне навантаження одного пакета вище у розширеного, так як на 64 біта він має 29 біт корисної інформації, а в стандартному на 44 біта всього 11 біт корисного навантаження.

Стандарт CAN дозволяє одночасно ганяти по лінії як розширені, так і стандартні пакети. Якщо нам потрібно просто відправляти загальну команду в шину, наприклад команду установки режиму охорони, то вигідніше користуватися стандартними пакетами, але якщо ж ми ганяємо дані, то правильніше буде використовувати розширений пакет, причому в заголовок повідомлення можна помістити наприклад 11 біт команди і 18 біт даних .

Пошук помилок

У режимі Silent_LoopBack працездатність легко перевірити за допомогою відладчика, встановивши брікпоінти на функції відправки даних і в процедурі обробки переривання на отримання пакету.

У звичайному режимі - бажано мати під рукою осцилограф, так як досить складно без нього визначити звідки вилізла помилка - залізо або код. Також варто звернути увагу на пристрій, на якому виконується тестування: Якщо це STM Discovery, то є ймовірність того, що на пінах CAN висить додаткова обв'язка отладочной плати, яка може спотворювати обмін даних з трансівером. Найкраще використовувати налагоджувальні плати з мінімальним "обвісом".

Так само варто звернути увагу і на тайминги. Наприклад при підключенні парсеру до автомобільної мережі, потрібно налаштувати таймінги відповідно до того, як вони налаштовані в автомобілі, інакше пакети з CAN шини автомобіля Ваше пристрій просто не буде отримувати.

Для своїх мереж Ви можете налаштовувати таймінги на свій смак і вимоги "швидкісного режиму", головне не відходити від стандарту і стежити, щоб на всіх пристроях тайминги були однаковими.

Висновок

У цій статті я постарався докладно описати як налаштувати CAN на мікроконтролері STM32F103. Щоб не дуже перевантажувати інформацією, частина матеріалу з більш детальним матеріалом оформив в окремих статтях.

У вкладеннях до статті наведено повний код програми, що розглядається в статті. Код протестований в режимах Silent_LoopBack і Normal - повністю робочий.

Якщо у Вас є будь-які зауваження по статті або пропозиції - прошу в коменти.

Категории
  • Биология
  • Математика
  • Краеведению
  • Лечебная
  • Наука
  • Физике
  • Природоведение
  • Информатика
  • Новости

  • Новости
    https://banwar.org/
    Наша взаимовыгодная связь https://banwar.org/. Запустив новый сайт, "Пари Матч" обещает своим клиентам незабываемый опыт и возможность выиграть крупные суммы.


    Наши клиенты
    Клиенты

    Быстрая связь

    Тел.: (044) 587-84-78
    E-mail: [email protected]

    Имя:
    E-mail:
    Телефон:
    Вопрос\Комментарий: