Скорость CAN получают двойным делением тактовой частоты контроллера: делитель задаёт длину кванта времени, а число квантов — длину бита. Всё остальное в битовом тайминге — выбор, сколько квантов оставить до точки выборки и сколько после. Калькулятор перебирает все делители, оставляет настройки с точной скоростью, выбирает из них ту, где точка выборки ближе всего к заданной, и переводит её в значения регистров: CAN_BTR для bxCAN в STM32 или CNF1, CNF2, CNF3 для MCP2515.
Как пользоваться калькулятором
- Контроллер. MCP2515 — внешний контроллер CAN с интерфейсом SPI, bxCAN — встроенный контроллер классического CAN в STM32. Для модуля FDCAN значения не подходят: у него другие регистры.
- Частота тактирования. Для MCP2515 это частота кварца или внешнего генератора на выводе OSC1: до 40 МГц при питании 4,5–5,5 В и до 25 МГц при 2,7–5,5 В. Для bxCAN это PCLK1 — частота шины APB1, от которой тактируется модуль, а не частота ядра. Число без приставки — мегагерцы.
- Скорость шины в кбит/с, до 1000: быстрее классический CAN не работает.
- Точка выборки в процентах длины бита, от 50 до 95. Калькулятор возьмёт ближайшую достижимую и покажет рядом заданную.
- SJW — на сколько квантов контроллер может подстроить бит по фронту сигнала, от 1 до 4.
В результате — значения регистров, поле BRP и длина кванта, раскладка бита по сегментам, фактические точка выборки и скорость, допуск частоты генератора. Для STM32 те же числа показаны в виде полей структуры CAN_InitTypeDef библиотеки HAL. Под результатом — до четырёх других настроек с той же скоростью: с другим числом квантов и другой точкой выборки. Введённые значения сохраняются в адресе страницы, поэтому расчётом можно поделиться: кнопка под калькулятором копирует результат вместе со ссылкой.
Формулы
Бит состоит из квантов времени: один квант синхронизации, квантов до точки выборки и после неё. Квант — это периодов тактовой частоты :
У MCP2515 , — сумма Prop_Seg и PS1, — это PS2. У bxCAN , — сегмент BS1, — сегмент BS2. Пределы, в которых калькулятор ищет настройку:
| Параметр | MCP2515 | STM32 bxCAN |
|---|---|---|
| Тактов на квант | 2–128, только чётные | 1–1024 |
| Поле BRP | 0–63 | 0–1023 |
| До точки выборки, квантов | 2–16 (Prop_Seg + PS1) | 1–16 (BS1) |
| После точки выборки, квантов | 2–8 (PS2) | 1–8 (BS2) |
| SJW, квантов | 1–4 | 1–4 |
| Квантов в бите | 5–25 | 3–25 |
Prop_Seg и PS1 у MCP2515 — от 1 до 8 квантов каждый. Даташит добавляет два правила, которые калькулятор проверяет: Prop_Seg + PS1 не короче PS2, а PS2 длиннее SJW. Сегмент до точки выборки калькулятор делит так же, как драйвер Linux: Prop_Seg — половина с округлением вниз, остальное — PS1.
Найденные длины упаковываются в регистры. Каждое поле хранит длину, уменьшенную на единицу:
CAN_BTR = (SJW − 1) << 24 | (BS2 − 1) << 20 | (BS1 − 1) << 16 | BRP
CNF1 = (SJW − 1) << 6 | BRP
CNF2 = 0x80 | (PS1 − 1) << 3 | (Prop_Seg − 1)
CNF3 = PS2 − 1
Слагаемое 0x80 в CNF2 — бит BTLMODE: с ним длину PS2 задаёт регистр CNF3. Бит SAM калькулятор оставляет нулевым — одна выборка на бит; в CAN_BTR нулевыми остаются биты SILM и LBKM, то есть режим обычный.
Допуск частоты генератора — насколько частота каждого узла может отклониться от номинала, чтобы узлы не теряли синхронизацию. Калькулятор считает его по двум условиям из работы инженеров Bosch и берёт меньшее значение:
Для bxCAN на месте PS1 и PS2 стоят BS1 и BS2.
Как калькулятор выбирает настройку
Одну и ту же скорость обычно дают несколько пар «делитель и число квантов». Порядок выбора такой:
- наименьшая ошибка скорости — точные настройки всегда впереди;
- в бите не меньше 8 квантов: спецификация Bosch требует от контроллера поддержки 8–25 квантов, и более короткий бит используется, только если других вариантов нет;
- точка выборки ближе всего к заданной;
- при равном отклонении — более ранняя точка выборки: после неё остаётся больше запаса на подстройку;
- при прочих равных — больше квантов в бите.
Пример расчёта: STM32, PCLK1 = 42 МГц, 250 кбит/с
Точка выборки 87,5 %, SJW = 1.
- На один бит приходится 42 000 000 / 250 000 = 168 периодов PCLK1.
- Раскладываем 168 на делитель и число квантов от 8 до 25: 7 × 24, 8 × 21, 12 × 14, 14 × 12 и 21 × 8.
- Для каждого варианта подбираем BS1 и BS2 так, чтобы точка выборки была ближе к 87,5 %. BS1 не длиннее 16 квантов, поэтому в длинных битах точка выборки получается ранней:
| Делитель | Квантов в бите | BS1 | BS2 | Точка выборки |
|---|---|---|---|---|
| 21 | 8 | 6 | 1 | 87,5 % |
| 12 | 14 | 11 | 2 | 85,7 % |
| 14 | 12 | 9 | 2 | 83,3 % |
| 8 | 21 | 16 | 4 | 81 % |
| 7 | 24 | 16 | 7 | 70,8 % |
- В точку попадает первая строка: делитель 21, то есть BRP = 20, квант 500 нс, в бите 8 = 1 + 6 + 1 квантов.
- Регистр:
CAN_BTR = 0 << 24 | 0 << 20 | 5 << 16 | 20 = 0x00050014. В HAL:Prescaler = 21,TimeSeg1 = CAN_BS1_6TQ,TimeSeg2 = CAN_BS2_1TQ,SyncJumpWidth = CAN_SJW_1TQ. - Допуск генератора: первое условие даёт 1 / (2 · (13 · 8 − 1)) = 0,49 %, второе — 1 / (20 · 8) = 0,625 %. Действует меньшее: ±0,49 %.
Калькулятор покажет то же самое, а остальные четыре строки таблицы — в списке других вариантов. Если поставить SJW = 2, строка с BS2 = 1 отпадает: SJW не может быть длиннее BS2. Тогда калькулятор выберет вторую строку: Prescaler = 12, BS1 = 11, BS2 = 2, 14 квантов, точка выборки 85,7 %, CAN_BTR = 0x011A000B, допуск ±0,56 %.
Готовые значения регистров
Таблицы посчитаны тем же алгоритмом, что и калькулятор, для точки выборки 87,5 % и SJW = 1. В них попали только настройки с точной скоростью и не меньше чем 8 квантами в бите; там, где такой настройки нет, указана причина. Для другой точки выборки или SJW введите свои числа в калькулятор.
STM32 bxCAN: Prescaler, BS1, BS2 и CAN_BTR
Prescaler, BS1 и BS2 — значения для HAL, длины в квантах; CAN_BTR — то же самое одним числом для записи в регистр.
| PCLK1 | Скорость | Prescaler | BS1 | BS2 | Точка выборки | CAN_BTR |
|---|---|---|---|---|---|---|
| 8 МГц | 1000 кбит/с | 1 | 6 | 1 | 87,5 % | 0x00050000 |
| 800 кбит/с | 1 | 8 | 1 | 90 % | 0x00070000 | |
| 500 кбит/с | 1 | 13 | 2 | 87,5 % | 0x001C0000 | |
| 250 кбит/с | 2 | 13 | 2 | 87,5 % | 0x001C0001 | |
| 125 кбит/с | 4 | 13 | 2 | 87,5 % | 0x001C0003 | |
| 100 кбит/с | 5 | 13 | 2 | 87,5 % | 0x001C0004 | |
| 50 кбит/с | 10 | 13 | 2 | 87,5 % | 0x001C0009 | |
| 20 кбит/с | 25 | 13 | 2 | 87,5 % | 0x001C0018 | |
| 10 кбит/с | 50 | 13 | 2 | 87,5 % | 0x001C0031 | |
| 16 МГц | 1000 кбит/с | 1 | 13 | 2 | 87,5 % | 0x001C0000 |
| 800 кбит/с | 1 | 16 | 3 | 85 % | 0x002F0000 | |
| 500 кбит/с | 2 | 13 | 2 | 87,5 % | 0x001C0001 | |
| 250 кбит/с | 4 | 13 | 2 | 87,5 % | 0x001C0003 | |
| 125 кбит/с | 8 | 13 | 2 | 87,5 % | 0x001C0007 | |
| 100 кбит/с | 10 | 13 | 2 | 87,5 % | 0x001C0009 | |
| 50 кбит/с | 20 | 13 | 2 | 87,5 % | 0x001C0013 | |
| 20 кбит/с | 50 | 13 | 2 | 87,5 % | 0x001C0031 | |
| 10 кбит/с | 100 | 13 | 2 | 87,5 % | 0x001C0063 | |
| 36 МГц | 1000 кбит/с | 2 | 15 | 2 | 88,9 % | 0x001E0001 |
| 800 кбит/с | 3 | 12 | 2 | 86,7 % | 0x001B0002 | |
| 500 кбит/с | 9 | 6 | 1 | 87,5 % | 0x00050008 | |
| 250 кбит/с | 9 | 13 | 2 | 87,5 % | 0x001C0008 | |
| 125 кбит/с | 18 | 13 | 2 | 87,5 % | 0x001C0011 | |
| 100 кбит/с | 45 | 6 | 1 | 87,5 % | 0x0005002C | |
| 50 кбит/с | 45 | 13 | 2 | 87,5 % | 0x001C002C | |
| 20 кбит/с | 225 | 6 | 1 | 87,5 % | 0x000500E0 | |
| 10 кбит/с | 225 | 13 | 2 | 87,5 % | 0x001C00E0 | |
| 42 МГц | 1000 кбит/с | 3 | 11 | 2 | 85,7 % | 0x001A0002 |
| 800 кбит/с | точного делителя нет: ближайшая 807,692 кбит/с (+0,96 %) | |||||
| 500 кбит/с | 6 | 11 | 2 | 85,7 % | 0x001A0005 | |
| 250 кбит/с | 21 | 6 | 1 | 87,5 % | 0x00050014 | |
| 125 кбит/с | 21 | 13 | 2 | 87,5 % | 0x001C0014 | |
| 100 кбит/с | 28 | 12 | 2 | 86,7 % | 0x001B001B | |
| 50 кбит/с | 105 | 6 | 1 | 87,5 % | 0x00050068 | |
| 20 кбит/с | 140 | 12 | 2 | 86,7 % | 0x001B008B | |
| 10 кбит/с | 525 | 6 | 1 | 87,5 % | 0x0005020C | |
| 45 МГц | 1000 кбит/с | 3 | 12 | 2 | 86,7 % | 0x001B0002 |
| 800 кбит/с | точного делителя нет: ближайшая 803,571 кбит/с (+0,45 %) | |||||
| 500 кбит/с | 6 | 12 | 2 | 86,7 % | 0x001B0005 | |
| 250 кбит/с | 12 | 12 | 2 | 86,7 % | 0x001B000B | |
| 125 кбит/с | 45 | 6 | 1 | 87,5 % | 0x0005002C | |
| 100 кбит/с | 30 | 12 | 2 | 86,7 % | 0x001B001D | |
| 50 кбит/с | 60 | 12 | 2 | 86,7 % | 0x001B003B | |
| 20 кбит/с | 150 | 12 | 2 | 86,7 % | 0x001B0095 | |
| 10 кбит/с | 300 | 12 | 2 | 86,7 % | 0x001B012B | |
| 48 МГц | 1000 кбит/с | 3 | 13 | 2 | 87,5 % | 0x001C0002 |
| 800 кбит/с | 4 | 12 | 2 | 86,7 % | 0x001B0003 | |
| 500 кбит/с | 6 | 13 | 2 | 87,5 % | 0x001C0005 | |
| 250 кбит/с | 12 | 13 | 2 | 87,5 % | 0x001C000B | |
| 125 кбит/с | 24 | 13 | 2 | 87,5 % | 0x001C0017 | |
| 100 кбит/с | 30 | 13 | 2 | 87,5 % | 0x001C001D | |
| 50 кбит/с | 60 | 13 | 2 | 87,5 % | 0x001C003B | |
| 20 кбит/с | 150 | 13 | 2 | 87,5 % | 0x001C0095 | |
| 10 кбит/с | 300 | 13 | 2 | 87,5 % | 0x001C012B | |
MCP2515: CNF1, CNF2 и CNF3
Значения для BTLMODE = 1. Сумма в столбце «Квантов в бите» — квант синхронизации, Prop_Seg, PS1 и PS2.
| Кварц | Скорость | CNF1 | CNF2 | CNF3 | Квантов в бите | Точка выборки |
|---|---|---|---|---|---|---|
| 8 МГц | 1000 кбит/с | недостижимо при такой частоте | ||||
| 800 кбит/с | только 5 квантов в бите | |||||
| 500 кбит/с | 0x00 | 0x91 | 0x01 | 8 = 1 + 2 + 3 + 2 | 75 % | |
| 250 кбит/с | 0x00 | 0xB5 | 0x01 | 16 = 1 + 6 + 7 + 2 | 87,5 % | |
| 125 кбит/с | 0x01 | 0xB5 | 0x01 | 16 = 1 + 6 + 7 + 2 | 87,5 % | |
| 100 кбит/с | 0x01 | 0xBF | 0x02 | 20 = 1 + 8 + 8 + 3 | 85 % | |
| 50 кбит/с | 0x04 | 0xB5 | 0x01 | 16 = 1 + 6 + 7 + 2 | 87,5 % | |
| 20 кбит/с | 0x09 | 0xBF | 0x02 | 20 = 1 + 8 + 8 + 3 | 85 % | |
| 10 кбит/с | 0x18 | 0xB5 | 0x01 | 16 = 1 + 6 + 7 + 2 | 87,5 % | |
| 16 МГц | 1000 кбит/с | 0x00 | 0x91 | 0x01 | 8 = 1 + 2 + 3 + 2 | 75 % |
| 800 кбит/с | 0x00 | 0x9A | 0x01 | 10 = 1 + 3 + 4 + 2 | 80 % | |
| 500 кбит/с | 0x00 | 0xB5 | 0x01 | 16 = 1 + 6 + 7 + 2 | 87,5 % | |
| 250 кбит/с | 0x01 | 0xB5 | 0x01 | 16 = 1 + 6 + 7 + 2 | 87,5 % | |
| 125 кбит/с | 0x03 | 0xB5 | 0x01 | 16 = 1 + 6 + 7 + 2 | 87,5 % | |
| 100 кбит/с | 0x04 | 0xB5 | 0x01 | 16 = 1 + 6 + 7 + 2 | 87,5 % | |
| 50 кбит/с | 0x09 | 0xB5 | 0x01 | 16 = 1 + 6 + 7 + 2 | 87,5 % | |
| 20 кбит/с | 0x18 | 0xB5 | 0x01 | 16 = 1 + 6 + 7 + 2 | 87,5 % | |
| 10 кбит/с | 0x31 | 0xB5 | 0x01 | 16 = 1 + 6 + 7 + 2 | 87,5 % | |
| 20 МГц | 1000 кбит/с | 0x00 | 0x9A | 0x01 | 10 = 1 + 3 + 4 + 2 | 80 % |
| 800 кбит/с | точного делителя нет: ближайшая 769,231 кбит/с (−3,8 %) | |||||
| 500 кбит/с | 0x00 | 0xBF | 0x02 | 20 = 1 + 8 + 8 + 3 | 85 % | |
| 250 кбит/с | 0x01 | 0xBF | 0x02 | 20 = 1 + 8 + 8 + 3 | 85 % | |
| 125 кбит/с | 0x04 | 0xB5 | 0x01 | 16 = 1 + 6 + 7 + 2 | 87,5 % | |
| 100 кбит/с | 0x04 | 0xBF | 0x02 | 20 = 1 + 8 + 8 + 3 | 85 % | |
| 50 кбит/с | 0x09 | 0xBF | 0x02 | 20 = 1 + 8 + 8 + 3 | 85 % | |
| 20 кбит/с | 0x18 | 0xBF | 0x02 | 20 = 1 + 8 + 8 + 3 | 85 % | |
| 10 кбит/с | 0x31 | 0xBF | 0x02 | 20 = 1 + 8 + 8 + 3 | 85 % | |
Точка выборки у MCP2515 с 8 квантами в бите — 75 %: PS2 не бывает короче 2 квантов. С кварцем 20 МГц на большинстве скоростей бит состоит из 20 квантов, и ближайшая к 87,5 % точка выборки — 85 %.
Типичные ошибки
- Вместо PCLK1 подставлена частота ядра. bxCAN тактируется от шины APB1. Если делитель этой шины не равен единице, PCLK1 ниже частоты ядра, и реальная скорость окажется во столько же раз ниже расчётной.
- В поле Prescaler записан BRP. В HAL поле
Prescaler— это делитель от 1 до 1024, единицу функцияHAL_CAN_Initвычитает сама. BRP на единицу меньше, и он нужен, только если писать вCAN_BTRнапрямую. - Длины сегментов записаны в регистр как есть. Поля регистров хранят длину минус один: BS1 = 6 квантов — это 5 в поле TS1, PS2 = 2 кванта — это 1 в CNF3. Константы HAL вида
CAN_BS1_6TQуже учитывают это. - У MCP2515 не установлен BTLMODE. Без него микросхема не смотрит в CNF3 и берёт PS2 равным большему из PS1 и 2 квантов. Если записать CNF2 = 0x35 вместо 0xB5, PS2 станет 7 квантов вместо 2, бит — 21 квант вместо 16, и с кварцем 16 МГц вместо 500 кбит/с получится 381 кбит/с.
- Частота кварца в программе не та, что на плате. Квант MCP2515 задаётся в периодах кварца, поэтому значения для 16 МГц на плате с кварцем 8 МГц дадут ровно половину скорости.
- Регистры записаны не в том режиме. CNF1–CNF3 меняются только в режиме конфигурации MCP2515.
HAL_CAN_Initперед записьюCAN_BTRсама переводит bxCAN в режим инициализации. - Разные точки выборки у узлов. По спецификации Bosch положение точки выборки следует выбирать общим для всех узлов. Если узлы настраивают разные люди, договоритесь о скорости, точке выборки и SJW заранее.
- Скорость «почти та». Ошибка скорости расходует допуск генератора. Когда калькулятор предупреждает, что ошибка не меньше допуска, настройкой пользоваться нельзя — нужна другая тактовая частота.
Калькулятор отвечает на вопрос, что записать в регистры. Хватит ли сегмента до точки выборки на задержки в линии заданной длины и что происходит с битом при подстройке — в разделе «Битовый тайминг» статьи о шине CAN.
Частые вопросы
Какие Prescaler, BS1 и BS2 задать для 500 кбит/с на STM32 при PCLK1 = 36 МГц?
Prescaler = 9, BS1 = 6 квантов, BS2 = 1 квант, SJW = 1: квант 250 нс, в бите 8 квантов, точка выборки 87,5 %, CAN_BTR = 0x00050008. Если нужен SJW = 2, возьмите Prescaler = 4, BS1 = 15, BS2 = 2: 18 квантов, точка выборки 88,9 %, CAN_BTR = 0x011E0003. PCLK1 — частота шины APB1, а не ядра; 36 МГц — её предел у STM32F103.
Какие CNF1, CNF2 и CNF3 записать в MCP2515 для 500 кбит/с?
С кварцем 16 МГц: CNF1 = 0x00, CNF2 = 0xB5, CNF3 = 0x01 — 16 квантов в бите, точка выборки 87,5 %. С кварцем 8 МГц: CNF1 = 0x00, CNF2 = 0x91, CNF3 = 0x01 — в бите только 8 квантов, и точка выборки не позже 75 %, потому что PS2 у MCP2515 не короче 2 квантов. Значения рассчитаны для BTLMODE = 1, а записать их можно только в режиме конфигурации.
Почему MCP2515 с кварцем 8 МГц не работает на 1 Мбит/с?
Квант у MCP2515 не короче двух периодов кварца: при 8 МГц это 250 нс. Бит на 1 Мбит/с длится 1000 нс — 4 кванта, а микросхеме нужно не меньше 5: квант синхронизации, по одному на Prop_Seg и PS1 и два на PS2. Потолок для кварца 8 МГц — 800 кбит/с с 5 квантами и точкой выборки 60 %. Для 1 Мбит/с нужен кварц не меньше 10 МГц, а чтобы в бите было 8 квантов — 16 МГц.
Какую точку выборки и SJW выбрать?
Если особых требований нет, оставьте 87,5 % и SJW = 1. Такую точку выборки для скоростей до 500 кбит/с берёт по умолчанию драйвер CAN в Linux со ссылкой на рекомендации CiA; до 800 кбит/с он берёт 80 %, выше — 75 %. Важнее самого числа, чтобы точка выборки совпадала у всех узлов шины. SJW больше 1 нужен при неточных генераторах, например керамических резонаторах. Он не может быть больше фазовых сегментов, поэтому при коротком BS2 или PS2 калькулятор подберёт другую раскладку бита — обычно с большим числом квантов.
Что делать, если точная скорость не получается?
Скорость получается точно, только когда частота тактирования делится на скорость нацело, а частное раскладывается на делитель и число квантов в бите — лучше от 8 до 25. Пример: PCLK1 = 42 МГц и 800 кбит/с дают 52,5 — не целое. Ближайшая настройка — 807,692 кбит/с, ошибка +0,96 % при допуске генератора ±0,38 % для этих сегментов: узел будет терять синхронизацию. Выход — другая частота PCLK1 (с 36 или 48 МГц 800 кбит/с получаются точно) или другая скорость.
Чем BS1 и BS2 в STM32 отличаются от Prop_Seg, PS1 и PS2 в MCP2515?
Это одни и те же отрезки бита, нарезанные по-разному. В bxCAN всё между квантом синхронизации и точкой выборки — один сегмент BS1 длиной 1–16 квантов; в MCP2515 он разделён на Prop_Seg и PS1, по 1–8 квантов. BS2 и PS2 — участок после точки выборки: 1–8 квантов у bxCAN и 2–8 у MCP2515. На работу шины влияет только сумма до точки выборки, поэтому калькулятор делит её между Prop_Seg и PS1 примерно пополам.
Источники
- Robert Bosch GmbH. CAN Specification Version 2.0, 1991 — часть B, разд. 10 — сегменты бита, 8–25 квантов на бит, SJW не больше Phase_Seg1, общая для всех узлов точка выборки; часть A, разд. 9 — допуск генератора 1,58 %
- Microchip. MCP2515 Stand-Alone CAN Controller with SPI Interface, DS20001801J — разд. 5 — квант TQ = 2·(BRP + 1)/FOSC, длины сегментов, правила программирования, пример для 20 МГц и 125 кбит/с; регистры CNF1–CNF3; разд. 10.1 — режим конфигурации; табл. 13-2 — частота генератора
- STMicroelectronics. RM0008 Reference manual STM32F101xx–STM32F107xx, Rev 21, 2021 — гл. 24 — bxCAN: разд. 24.7.7 «Bit timing» и регистр CAN_BTR
- STMicroelectronics. STM32F1 HAL driver: stm32f1xx_hal_can.h, stm32f1xx_hal_can.c; CMSIS device header stm32f103xb.h — поле Prescaler 1–1024, константы CAN_BS1_1TQ…16TQ, CAN_BS2_1TQ…8TQ, CAN_SJW_1TQ…4TQ; HAL_CAN_Init записывает в CAN_BTR значение Prescaler − 1; позиции полей регистра
- F. Hartwich, A. Bassemir (Robert Bosch GmbH). The Configuration of the CAN Bit Timing, 6th iCC, 1999 — две формулы допуска частоты генератора
- Linux kernel: drivers/net/can/dev/calc_bittiming.c — порядок подбора: сначала ошибка скорости, затем точка выборки; точки выборки по умолчанию 87,5, 80 и 75 %; деление сегмента до точки выборки на Prop_Seg и Phase_Seg1
Встроить калькулятор на свой сайт
Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах
<iframe src="https://gaw.ru/embed/can-bit-timing/" title="Калькулятор битового тайминга CAN" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/can-bit-timing/">Калькулятор битового тайминга CAN</a> — GAW.ru</p>Автоподстройка высоты рамки
Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.
<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>Обновлено . Нашли ошибку в расчёте? Напишите нам.