У STM32 с блоком I2C нового поколения вся настройка скорости шины — один 32-битный регистр I2C_TIMINGR: предделитель, длительности низкого и высокого уровня SCL и две задержки, которые обеспечивают удержание и установку данных. CubeMX считает его сам, но значение из проекта трудно проверить, а ручной расчёт требует формул справочного руководства и таблицы спецификации I²C. Калькулятор делает и то и другое.
Коротко
- Поля: PRESC[31:28], SCLDEL[23:20], SDADEL[19:16], SCLH[15:8], SCLL[7:0]; шаг tPRESC = (PRESC + 1) × tI2CCLK.
- Период: tSCL = tSYNC1 + tSYNC2 + (SCLL + 1 + SCLH + 1) × tPRESC; задержки tSYNC — фронт, фильтры и 2–3 периода I2CCLK.
- Данные: SDADEL задаёт удержание после спада SCL, SCLDEL — установку перед фронтом: SCLDEL ≥ (tr + tSU;DAT) / tPRESC − 1.
- Частота ядра I2C: tI2CCLK < (tLOW − задержка фильтров) / 4 и tI2CCLK < tHIGH.
- Пример: 0x10420F13 — 100 кГц при 8 МГц, 0x00901850 — 400 кГц при 48 МГц.
Как пользоваться
- Впишите частоту I2CCLK — тактовую частоту блока I2C. Источник выбирается в регистрах RCC: у I2C1 в STM32F0 это HSI или SYSCLK, в других случаях ядро I2C тактируется и от PCLK. Частоту ядра и шин можно посчитать в калькуляторе тактирования STM32.
- Выберите режим шины и нужную частоту SCL. Режим определяет требования: Standard-mode — до 100 кГц, Fast-mode — до 400 кГц, Fast-mode Plus — до 1 МГц.
- Задайте времена нарастания и спада фронтов на вашей плате. Время нарастания зависит от подтягивающего резистора и ёмкости линии — его считает калькулятор подтяжки I²C. Если фронты неизвестны, введите предельные значения режима: расчёт будет с запасом.
- Оставьте аналоговый фильтр включённым, если не выключали его битом ANFOFF.
Справа — значение регистра, частота SCL и проверки. Ниже — поля регистра с временами, диаграмма периода SCL и код. Режим «Проверить значение» разбирает готовый I2C_TIMINGR — например, из функции MX_I2C1_Init проекта CubeMX. Все параметры хранятся в адресе страницы.
Поля регистра
| Поле | Биты | Что задаёт |
|---|---|---|
| PRESC | 31:28 | шаг всех счётчиков: tPRESC = (PRESC + 1) × tI2CCLK |
| SCLDEL | 23:20 | установка данных: tSCLDEL = (SCLDEL + 1) × tPRESC |
| SDADEL | 19:16 | задержка смены данных после спада SCL: tSDADEL = SDADEL × tPRESC + tI2CCLK |
| SCLH | 15:8 | высокий уровень SCL: tSCLH = (SCLH + 1) × tPRESC |
| SCLL | 7:0 | низкий уровень SCL: tSCLL = (SCLL + 1) × tPRESC |
SCLL и SCLH работают только в режиме ведущего, SDADEL и SCLDEL — и в режиме ведущего, и в режиме ведомого. Регистр можно менять, только пока блок I2C выключен — бит PE в I2C_CR1 сброшен.
Период SCL
Ведущий не отсчитывает период вслепую: счётчик низкого уровня запускается, когда блок I2C сам увидит на линии ноль, а счётчик высокого — когда увидит единицу. Так работает синхронизация тактов с другими ведущими и растягивание такта ведомыми. Поэтому
где задержки обнаружения tSYNC1 и tSYNC2 складываются из фронта, задержки аналогового фильтра (50–260 нс по даташиту STM32F072), цифрового фильтра DNF · tI2CCLK и синхронизации с I2CCLK — двух-трёх периодов. Калькулятор считает период с фронтами tr и tf и задержками от самых коротких до самых длинных; по самым коротким проверяются требования к частоте и длительностям, и по той же модели пересчитываются значения CubeMX из примеров STM32Cube.
Требования UM10204 (таблица 11) к уровням SCL: низкий не короче 4,7 / 1,3 / 0,5 мкс, высокий не короче 4,0 / 0,6 / 0,26 мкс для Standard-mode, Fast-mode и Fast-mode Plus. Кроме того, справочное руководство требует от частоты ядра I2C, чтобы период I2CCLK был меньше четверти низкого уровня за вычетом задержки фильтров и меньше высокого уровня. Например, при 8 МГц (125 нс) и включённом аналоговом фильтре низкий уровень должен быть длиннее 4 × 125 + 260 = 760 нс — для Fast-mode Plus это больше требования спецификации.
Удержание и установка данных
Передатчик меняет SDA, пока SCL в нуле. Сменить бит слишком рано нельзя: спад SCL ещё не прошёл зону неопределённых уровней. Слишком поздно тоже нельзя: данные должны стать действительными не позже tVD;DAT после спада. RM0091 даёт границы SDADEL:
Задержки аналогового фильтра входят в формулы, только когда он включён. После смены данных SCL держится в нуле ещё tSCLDEL — это время установки с учётом фронта SDA:
| Параметр (UM10204, RM0091 табл. 90) | Standard-mode | Fast-mode | Fast-mode Plus |
|---|---|---|---|
| Удержание tHD;DAT, не меньше | 0 | 0 | 0 |
| Данные действительны tVD;DAT, не позже | 3,45 мкс | 0,9 мкс | 0,45 мкс |
| Установка tSU;DAT, не меньше | 250 нс | 100 нс | 50 нс |
| Время нарастания tr, не больше | 1000 нс | 300 нс | 120 нс |
| Время спада tf, не больше | 300 нс | 300 нс | 120 нс |
Справочное руководство подчёркивает, что в формулы подставляют фронты своей схемы, а предельные значения из таблицы дают запас «на любую плату» ценой более жёстких условий. Верхнюю границу SDADEL можно нарушить, пока SCL растягивается: после каждого спада ведущий или ведомый держит SCL в нуле не меньше [(SDADEL + SCLDEL + 1)(PRESC + 1) + 1] tI2CCLK, и время установки обеспечивает SCLDEL. Поэтому калькулятор отмечает такое нарушение предупреждением, а не ошибкой.
Примеры из справочного руководства
В таблицах 93–95 RM0091 — значения для трёх частот I2CCLK. Значения SCLDEL в них — наименьшие допустимые при предельных фронтах режима:
| I2CCLK | 10 кГц | 100 кГц | 400 кГц | Fast-mode Plus |
|---|---|---|---|---|
| 8 МГц | 0x1042C3C7 | 0x10420F13 | 0x00310309 | 0x00100306 (500 кГц) |
| 16 МГц | 0x3042C3C7 | 0x30420F13 | 0x10320309 | 0x00200204 (1 МГц) |
| 48 МГц | 0xB042C3C7 | 0xB0420F13 | 0x50330309 | 0x50100103 (1 МГц) |
Сами таблицы названы примерами: период SCL в них посчитан с условными задержками tSYNC1 + tSYNC2 от 250 до 1000 нс, и для точных значений руководство отсылает к CubeMX. Проверка в калькуляторе показывает, что при самых коротких задержках часть примеров даёт частоту немного выше номинальной.
Ограничения
- Расчёт — для режима ведущего с одним ведущим на шине. Растягивание такта ведомыми удлиняет период, и это не моделируется.
- Задержка аналогового фильтра взята из даташита STM32F072 (50–260 нс). У других серий она может отличаться — сверяйтесь с таблицей «I2C analog filter characteristics» даташита своего микроконтроллера.
- SMBus с его требованиями к таймаутам и удержанию 300 нс не рассматривается.
- Калькулятор не подходит к STM32F1, F2 и F4: у их блока I2C другие регистры (I2C_CCR и I2C_TRISE).
Частые вопросы
Какое значение I2C_TIMINGR нужно для 100 кГц при 8 МГц?
В таблице 93 справочного руководства RM0091 для I2CCLK = 8 МГц и 100 кГц приведено 0x10420F13: PRESC = 1 (шаг 250 нс), SCLL = 0x13 — низкий уровень 20 × 250 нс = 5,0 мкс, SCLH = 0xF — высокий 16 × 250 нс = 4,0 мкс, SDADEL = 2 — задержка данных 500 нс, SCLDEL = 4 — установка 1250 нс. Для 400 кГц там же — 0x00310309. Это примеры: ST рекомендует считать значение под свои фронты в CubeMX или таком калькуляторе.
Что означает значение 0x00901850 из примера CubeMX?
Поля читаются по тетрадам: PRESC = 0, SCLDEL = 9, SDADEL = 0, SCLH = 0x18, SCLL = 0x50. При I2CCLK = 48 МГц шаг — 20,8 нс: низкий уровень SCL отсчитывается 81 шаг (1687,5 нс), высокий — 25 шагов (520,8 нс), установка данных — 10 шагов (208 нс). С задержками фильтра и синхронизации и фронтами 100 и 10 нс получается около 400 кГц — это пример Fast-mode из STM32CubeF0 для STM32F072.
Почему частота SCL получается ниже заданной?
Счётчики SCLL и SCLH начинают отсчёт только после того, как периферия заметит фронт на линии: ей мешают сам фронт, аналоговый фильтр (50–260 нс), цифровой фильтр и синхронизация с I2CCLK (два-три периода). Эти задержки добавляются к каждому полупериоду, а время нарастания и спада — к периоду. Калькулятор подбирает счётчики так, чтобы даже при самых коротких задержках частота не превысила заданную, а показывает диапазон, в который попадёт реальная частота.
Зачем нужны SDADEL и SCLDEL?
SDADEL задерживает смену данных после спада SCL, чтобы бит не изменился, пока спад SCL ещё не прошёл неопределённую зону уровней — это время удержания tHD;DAT. SCLDEL держит SCL в нуле после смены данных, пока SDA не установится, — это время установки tSU;DAT с учётом фронта: SCLDEL ≥ (tr + tSU;DAT) / tPRESC − 1.
Нужен ли аналоговый фильтр I2C?
Для Fast-mode и Fast-mode Plus спецификация I²C требует подавлять импульсы помех короче 50 нс, и аналоговый фильтр STM32 делает именно это. После сброса он включён (бит ANFOFF = 0). Цена — задержка обнаружения фронта от 50 до 260 нс, которая входит в формулы SDADEL и периода SCL. Цифровой фильтр DNF подавляет импульсы длиной до 15 периодов I2CCLK и добавляет DNF × tI2CCLK к задержке.
У каких STM32 есть регистр I2C_TIMINGR?
У микроконтроллеров с блоком I2C, где тайминги задаются одним регистром: в их числе STM32F0 (RM0091), STM32G0 (RM0444), а также STM32L0, L4 и F7 — для них в пакетах STM32Cube есть примеры с этим регистром. У STM32F1 и STM32F4 другой блок I2C: частоту SCL там задают регистры I2C_CCR и I2C_TRISE (RM0008, RM0090), и этот калькулятор к ним не подходит.
Источники
- STMicroelectronics. RM0091 Rev 10. Reference manual: STM32F0x1/STM32F0x2/STM32F0x8 — раздел 26.4: требования к I2CCLK (26.4.4), фильтры, формулы tSDADEL, tSCLDEL, tSCLL и tSCLH и границы SDADEL и SCLDEL, таблица 90 — удержание, установка и фронты по режимам; 26.4.10 — период SCL ведущего; таблицы 93–95 — примеры I2C_TIMINGR для 8, 16 и 48 МГц; описание регистра I2C_TIMINGR
- STMicroelectronics. DS9826 Rev 6. Datasheet: STM32F072x8, STM32F072xB — таблица 67: задержка аналогового фильтра tAF — от 50 до 260 нс
- NXP Semiconductors. UM10204: I2C-bus specification and user manual, Rev. 7.0, 1 October 2021 — таблица 11: частота SCL, tLOW, tHIGH, tSU;DAT, tHD;DAT, tVD;DAT, предельные tr и tf для Standard-mode, Fast-mode и Fast-mode Plus
- STMicroelectronics. STM32CubeF0, STM32CubeG0, STM32CubeL0, STM32CubeL4: примеры I2C (Projects/…/Examples, Examples_LL) — значения I2C_TIMINGR, рассчитанные CubeMX, с указанными I2CCLK, tr и tf: 0x00901850 (F072, 48 МГц, 400 кГц), 0x00C0216C (G031, 64 МГц), 0x00601B28 (L073, 32 МГц), 0x00F02B86 и 0x00D00E28 (L476, 80 МГц, 400 кГц и 1 МГц), 0x10A13E56 и 0x00B1112E (L053, 32 МГц) — по ним проверены формулы калькулятора
Встроить калькулятор на свой сайт
Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах
<iframe src="https://gaw.ru/embed/stm32-i2c-timing/" title="Регистр I2C_TIMINGR STM32: расчёт и проверка" 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/stm32-i2c-timing/">Регистр I2C_TIMINGR STM32: расчёт и проверка</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>Обновлено .
Нашли ошибку в расчёте?