Запуск модуля гибкая скорость передачи данных может на STM32H743 на регистрах без HAL и Cubemx.
Введение.
Новый стандарт FDCAN был разработан компанией BOSCH в 2012 году.
Стандарт обеспечивает больший объем передаваемых данных и скорость более 1 Мбит (для поля данных), скорость которой может достигать 12 Мбит. Размер поля данных увеличен до 64 байт. Что касается совместимости can и fdcan, то приёмники нового стандарта понимают старую версию протокола, а старые приёмники не совместимы с новым стандартом.
Не будем углубляться в особенности протокола, потому что… В Интернете достаточно информации, но перейдем к реализации fdcan из stm.
Инициализация модуля FDCAN.
Основное отличие FDCAN от BxCAN в микроконтроллерах stm32 — реализация выделенной памяти для фильтров и буферов.В микроконтроллере stm32h743 под fdcan (под fdcan1 и fdcan2) отведено ровно 10 кбайт общей памяти.
Эта область памяти гибко настраивается под любые нужды.
Эта память адресуется 4 байтами (словами): младшие два бита адреса не используются, а адрес битовых полей xxSA (начальный адрес каждой секции) сдвигается на два бита вправо.
Начальный начальный адрес этой области памяти в микронах stm32h743 = 0x4000AC00. Ниже представлена последовательность настройки: 1) Выберите источник синхронизации модулей fdcan:
- 00: часы hse_ck выбраны в качестве часов ядра FDCAN (по умолчанию после сброса)
- 01: часы pll1_q_ck выбраны в качестве часов ядра FDCAN.
- 10: часы pll2_q_ck выбраны как FDCAN
2) Установите булавки GPIO к нужной нам функции: Если используем стандартный CAN, то ищем пины FDCANx Техас/FDCANx прием .RCC->D2CCIP1R |= RCC_D2CCIP1R_FDCANSEL_1;
Если мы используем 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)
- Сегмент синхронизации (SYNC_SEG):
- Битовый сегмент 1 (включая PROP_SEG и PHASE_SEG1)
- Битовый сегмент 2 (PHASE_SEG2)
Однобитовые сегменты протокола 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
-
Обзор: Дизайн Зеркального Изображения
19 Oct, 24 -
«Твой День» Продвигает Себя В Интернете
19 Oct, 24