Fdcan На Stm32

Запуск модуля гибкая скорость передачи данных может на STM32H743 на регистрах без HAL и Cubemx.

FDCAN на STM32



Введение.

Новый стандарт FDCAN был разработан компанией BOSCH в 2012 году.

Стандарт обеспечивает больший объем передаваемых данных и скорость более 1 Мбит (для поля данных), скорость которой может достигать 12 Мбит. Размер поля данных увеличен до 64 байт. Что касается совместимости can и fdcan, то приёмники нового стандарта понимают старую версию протокола, а старые приёмники не совместимы с новым стандартом.

Не будем углубляться в особенности протокола, потому что… В Интернете достаточно информации, но перейдем к реализации fdcan из stm.

Инициализация модуля FDCAN.

Основное отличие FDCAN от BxCAN в микроконтроллерах stm32 — реализация выделенной памяти для фильтров и буферов.

В микроконтроллере stm32h743 под fdcan (под fdcan1 и fdcan2) отведено ровно 10 кбайт общей памяти.

Эта область памяти гибко настраивается под любые нужды.



FDCAN на STM32

Эта память адресуется 4 байтами (словами): младшие два бита адреса не используются, а адрес битовых полей xxSA (начальный адрес каждой секции) сдвигается на два бита вправо.

Начальный начальный адрес этой области памяти в микронах stm32h743 = 0x4000AC00. Ниже представлена последовательность настройки: 1) Выберите источник синхронизации модулей fdcan:

  • 00: часы hse_ck выбраны в качестве часов ядра FDCAN (по умолчанию после сброса)
  • 01: часы pll1_q_ck выбраны в качестве часов ядра FDCAN.
  • 10: часы pll2_q_ck выбраны как FDCAN
  
  
  
  
  
  
  
  
  
  
   

RCC->D2CCIP1R |= RCC_D2CCIP1R_FDCANSEL_1;

2) Установите булавки GPIO к нужной нам функции: Если используем стандартный CAN, то ищем пины FDCANx Техас/FDCANx прием .

Если мы используем FDCAN, то пины соответственно FDCANx_ TXFD_ РЕЖИМ/FDCANx RXFD РЕЖИМ .

В моем примере я использовал обычный CAN на контактах PA11 (RX) и PA12 (TX), альтернативная функция №9. Я использую свою собственную инициализацию.

Библиотека находится на github.

gpio_init (PORT_A, 11, MODE_ALT_F, TYPE_PUSH_PULL, SPEED_MAX, PULL_NO, ALTF_9); // RX gpio_init (PORT_A, 12, MODE_ALT_F, TYPE_PUSH_PULL, SPEED_MAX, PULL_NO, ALTF_9); // TX

3) Включите модули FDCAN:

RCC->APB1HENR |= RCC_APB1HENR_FDCANEN;

4) Войдите в процесс инициализации:

FDCAN1->CCCR |= FDCAN_CCCR_INIT; while ((FDCAN1->CCCR & FDCAN_CCCR_INIT) == 0) {};

5) Разрешить запись в регистры конфигурации:

FDCAN1->CCCR |= FDCAN_CCCR_CCE;

6) Включаем классический CAN и отключаем автоматическое реле:

FDCAN1->CCCR &= ~(FDCAN_CCCR_FDOE); FDCAN1->CCCR |= FDCAN_CCCR_DAR; // RETR OFF

7) При необходимости можно включить режим Loopback для отладки:

FDCAN1->CCCR |= FDCAN_CCCR_TEST; FDCAN1->TEST |= FDCAN_TEST_LBCK;

8) Очистите область памяти:

#define FDCAN_MEM_START_ADDR 0x4000AC00UL #define FDCAN_MEM_END_ADDR 0x4000D3FFUL unsigned long *i; for (i = (unsigned long*)FDCAN_MEM_START_ADDR; i < (unsigned long*)FDCAN_MEM_END_ADDR; i++) *i = 0;

9) Настройте номинальные сегменты квантов времени и, при необходимости, сегменты квантов времени для переменного битрейта:

#define CAN_PRESCALER 6 #define CAN_SYNC_JW 2 #define CAN_SYNC_SEG 1 #define CAN_PHASE_SEG1 11 #define CAN_PHASE_SEG2 4 // nominal time quanta segments FDCAN1->NBTP = (CAN_SYNC_JW - 1) << FDCAN_NBTP_NSJW_Pos; FDCAN1->NBTP |= (CAN_PRESCALER - 1) << FDCAN_NBTP_NBRP_Pos; FDCAN1->NBTP |= (CAN_PHASE_SEG1 - 1) << FDCAN_NBTP_NTSEG1_Pos; FDCAN1->NBTP |= (CAN_PHASE_SEG2 - 1) << FDCAN_NBTP_NTSEG2_Pos; // flexible bitrate time quanta segments FDCAN1->DBTP = (CAN_SYNC_JW - 1) << FDCAN_DBTP_DSJW_Pos; FDCAN1->DBTP |= (CAN_PRESCALER - 1) << FDCAN_DBTP_DBRP_Pos; FDCAN1->DBTP |= (CAN_PHASE_SEG1 - 1) << FDCAN_DBTP_DTSEG1_Pos; FDCAN1->DBTP |= (CAN_PHASE_SEG2 - 1) << FDCAN_DBTP_DTSEG2_Pos;

В результате на частоте fdcan Частота ядра равна 48 МГц, битрейт 500 КГц.

Один бит протокола can состоит из четырех временных сегментов:

  • Сегмент синхронизации (SYNC_SEG)
  • Сегмент распространения (PROP_SEG)
  • Фазовый сегмент 1 (PHASE_SEG1)
  • Фазовый сегмент 2 (PHASE_SEG2)
Реализация stm использует три сегмента:
  • Сегмент синхронизации (SYNC_SEG):
  • Битовый сегмент 1 (включая PROP_SEG и PHASE_SEG1)
  • Битовый сегмент 2 (PHASE_SEG2)


FDCAN на STM32

Однобитовые сегменты протокола CAN Кванты времени — это минимальная неделимая единица времени в протоколе CAN. Мы получаем его, разделив единицу на частоту ядра fdcan. Получаем Tq = 2,08333333e-8. Далее в игру вступает прескалер частоты.

Умножаем наш Tq на значение CAN_PRESCALER и получаем Tq = 0,000000125 сек.

Чтобы получить конечное время одного бита, мы умножаем сумму наших отрезков (1+11+4) на Tq и получаем 0,000002 секунды.

В последнем действии мы берем единицу и делим ее на наше время в один бит. 1/0,000002 = 500 000 Гц.

10) Отключаем прием ненужных пакетов:

FDCAN1->GFC |= FDCAN_GFC_ANFS; // Reject non-matching frames standard FDCAN1->GFC |= FDCAN_GFC_ANFE; // Reject non-matching frames extended FDCAN1->GFC |= FDCAN_GFC_RRFS; // Reject all remote frames with 11-bit standard ID FDCAN1->GFC |= FDCAN_GFC_RRFE; // Reject all remote frames with 29-bit standard ID

11) Настройте количество фильтров и их начальные адреса в выделенной области памяти:

// 11-bit filters #define FDCAN_11B_FILTER_EL_CNT 0UL #define FDCAN_11B_FILTER_EL_SIZE 4UL #define FDCAN_11B_FILTER_EL_W_SIZE (FDCAN_11B_FILTER_EL_SIZE / 4) #define FCCAN_11B_FILTER_START_ADDR (FDCAN_MEM_START_ADDR) #define FDCAN_11B_FILTER_OFFSET 0UL // 29-bit filters #define FDCAN_29B_FILTER_EL_CNT 4UL #define FDCAN_29B_FILTER_EL_SIZE 8UL #define FDCAN_29B_FILTER_EL_W_SIZE (FDCAN_29B_FILTER_EL_SIZE / 4) #define FCCAN_29B_FILTER_START_ADDR (FCCAN_11B_FILTER_START_ADDR + FDCAN_11B_FILTER_EL_CNT * FDCAN_11B_FILTER_EL_SIZE) #define FDCAN_29B_FILTER_OFFSET (FDCAN_11B_FILTER_OFFSET + FDCAN_11B_FILTER_EL_CNT * FDCAN_11B_FILTER_EL_W_SIZE) FDCAN1->SIDFC = (FDCAN_11B_FILTER_EL_CNT << FDCAN_SIDFC_LSS_Pos); // standart filter count FDCAN1->XIDFC = (FDCAN_29B_FILTER_EL_CNT << FDCAN_XIDFC_LSE_Pos); // extended filter count

Теги: #Программирование микроконтроллеров #stm32 #Сделай сам или Сделай сам #программирование #can #cortex-m #cmsis #FDCAN

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.