Перейти к содержанию

Регистр I2C_TIMINGR STM32: расчёт и проверка

Задайте частоту ядра I2C, режим шины и времена фронтов — калькулятор рассчитает поля регистра I2C_TIMINGR по формулам справочного руководства STM32, проверит длительности низкого и высокого уровня SCL, удержание и установку данных по спецификации I²C и покажет период SCL на диаграмме. Готовое значение, например из CubeMX, можно проверить.

Исходные данные

Что сделать
МГц

тактовая частота ядра I2C: PCLK, SYSCLK или HSI — по выбору в RCC

кГц
нс

не больше 300 нс

нс

не больше 300 нс

Аналоговый фильтр

0 — выключен, 1–15 периодов I2CCLK

Результат

I2C_TIMINGR
0x00901F49
SCL ≈ 399,7 кГц
Частота SCL с задержками
337,5 кГц … 399,7 кГцаналоговый фильтр 50–260 нс, синхронизация 2–3 периода I2CCLK
tLOW
≈ 1 633,3 нсне меньше 1 300 нс
tHIGH
≈ 758,3 нсне меньше 600 нс
Удержание данных (SDADEL)
20,8 нсдопустимо SDADEL 0…15
Установка данных (SCLDEL)
208,3 нснужно SCLDEL ≥ 9
  • частота SCL не выше 400 кГц
  • tLOW ≥ 1 300 нс
  • tHIGH ≥ 600 нс
  • SDADEL перекрывает спад SCL (удержание данных)
  • данные действительны не позже tVD;DAT = 900 нс
  • установка данных tSU;DAT ≥ 100 нс с учётом фронта
  • I2CCLK достаточно быстрый для tLOW
  • I2CCLK достаточно быстрый для tHIGH
  • фронты в пределах режима

Поля регистра и период SCL

ПолеБитыЗначениеВремя
PRESC31:280 (0x0)tPRESC = 1 × 20,8 нс = 20,8 нс
SCLDEL23:209 (0x9)(SCLDEL + 1) × tPRESC = 208,3 нс
SDADEL19:160 (0x0)SDADEL × tPRESC + tI2CCLK = 20,8 нс
SCLH15:831 (0x1F)(SCLH + 1) × tPRESC = 666,7 нс
SCLL7:073 (0x49)(SCLL + 1) × tPRESC = 1 541,7 нс
Период SCL при I2C_TIMINGR = 0x00901F49SCLSDASCLL + 1 = 74 × tPRESCSCLH + 1 = 32tLOW ≈ 1 633 нсtHIGH ≈ 758 нсSDADEL: 21 нсSCLDEL: 208 нсОранжевым — задержка обнаружения фронта: фильтры и синхронизация с I2CCLK, 92 нс

Код

/* PRESC 0, SCLDEL 9, SDADEL 0, SCLH 31, SCLL 73 */
I2C1->TIMINGR = 0x00901F49; /* while PE = 0 */

/* STM32Cube LL */
LL_I2C_SetTiming(I2C1, __LL_I2C_CONVERT_TIMINGS(0x0, 0x9, 0x0, 0x1F, 0x49));

TIMINGR записывают, пока периферия выключена (бит PE в I2C_CR1 сброшен).

Расчёт выполнен по формулам и данным из источников, приведённых на этой странице, и не заменяет проверку: параметры компонентов у разных производителей и даже партий различаются. Перед применением сверяйте результат с документацией на конкретные детали.

У 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 МГц.

Как пользоваться

  1. Впишите частоту I2CCLK — тактовую частоту блока I2C. Источник выбирается в регистрах RCC: у I2C1 в STM32F0 это HSI или SYSCLK, в других случаях ядро I2C тактируется и от PCLK. Частоту ядра и шин можно посчитать в калькуляторе тактирования STM32.
  2. Выберите режим шины и нужную частоту SCL. Режим определяет требования: Standard-mode — до 100 кГц, Fast-mode — до 400 кГц, Fast-mode Plus — до 1 МГц.
  3. Задайте времена нарастания и спада фронтов на вашей плате. Время нарастания зависит от подтягивающего резистора и ёмкости линии — его считает калькулятор подтяжки I²C. Если фронты неизвестны, введите предельные значения режима: расчёт будет с запасом.
  4. Оставьте аналоговый фильтр включённым, если не выключали его битом ANFOFF.

Справа — значение регистра, частота SCL и проверки. Ниже — поля регистра с временами, диаграмма периода SCL и код. Режим «Проверить значение» разбирает готовый I2C_TIMINGR — например, из функции MX_I2C1_Init проекта CubeMX. Все параметры хранятся в адресе страницы.

Поля регистра

ПолеБитыЧто задаёт
PRESC31:28шаг всех счётчиков: tPRESC = (PRESC + 1) × tI2CCLK
SCLDEL23:20установка данных: tSCLDEL = (SCLDEL + 1) × tPRESC
SDADEL19:16задержка смены данных после спада SCL: tSDADEL = SDADEL × tPRESC + tI2CCLK
SCLH15:8высокий уровень SCL: tSCLH = (SCLH + 1) × tPRESC
SCLL7:0низкий уровень SCL: tSCLL = (SCLL + 1) × tPRESC

SCLL и SCLH работают только в режиме ведущего, SDADEL и SCLDEL — и в режиме ведущего, и в режиме ведомого. Регистр можно менять, только пока блок I2C выключен — бит PE в I2C_CR1 сброшен.

Период SCL

Ведущий не отсчитывает период вслепую: счётчик низкого уровня запускается, когда блок I2C сам увидит на линии ноль, а счётчик высокого — когда увидит единицу. Так работает синхронизация тактов с другими ведущими и растягивание такта ведомыми. Поэтому

tSCL=tSYNC1+tSYNC2+[(SCLH+1)+(SCLL+1)]⋅(PRESC+1)⋅tI2CCLK,t_{SCL} = t_{SYNC1} + t_{SYNC2} + \left[(SCLH + 1) + (SCLL + 1)\right] \cdot (PRESC + 1) \cdot t_{I2CCLK},

где задержки обнаружения tSYNC1 и tSYNC2 складываются из фронта, задержки аналогового фильтра (50–260 нс по даташиту STM32F072), цифрового фильтра DNF · tI2CCLK и синхронизации с I2CCLK — двух-трёх периодов. Калькулятор считает период с фронтами tr и tf и задержками от самых коротких до самых длинных; по самым коротким проверяются требования к частоте и длительностям, и по той же модели пересчитываются значения CubeMX из примеров STM32Cube.

Период SCL ведущего STM32 при I2CCLK 48 МГц и I2C_TIMINGR = 0x00901850SCLSDASCLL + 1 = 81 × tPRESCSCLH + 1 = 25tLOW ≈ 1 779 нсtHIGH ≈ 612 нсSDADEL: 21 нсSCLDEL: 208 нсОранжевым — задержка обнаружения фронта: фильтры и синхронизация с I2CCLK, 92 нс
Период SCL ведущего STM32F072 при I2CCLK 48 МГц и I2C_TIMINGR = 0x00901850 (Fast-mode, tr = 100 нс, tf = 10 нс): после каждого фронта — задержка обнаружения, затем счёт SCLL или SCLH. Данные на SDA меняются через SDADEL после обнаружения спада, после чего SCLDEL держит SCL в нуле, пока данные устанавливаются.

Требования 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:

tf+tHD;DAT(min)−tAF(min)−(DNF+3) tI2CCLK(PRESC+1) tI2CCLK≤SDADEL≤tVD;DAT(max)−tr−260 нс−(DNF+4) tI2CCLK(PRESC+1) tI2CCLK.\frac{t_f + t_{HD;DAT(min)} - t_{AF(min)} - (DNF + 3)\, t_{I2CCLK}}{(PRESC + 1)\, t_{I2CCLK}} \le SDADEL \le \frac{t_{VD;DAT(max)} - t_r - 260\ \text{нс} - (DNF + 4)\, t_{I2CCLK}}{(PRESC + 1)\, t_{I2CCLK}}.

Задержки аналогового фильтра входят в формулы, только когда он включён. После смены данных SCL держится в нуле ещё tSCLDEL — это время установки с учётом фронта SDA:

SCLDEL≥tr+tSU;DAT(min)(PRESC+1) tI2CCLK−1.SCLDEL \ge \frac{t_r + t_{SU;DAT(min)}}{(PRESC + 1)\, t_{I2CCLK}} - 1.
Параметр (UM10204, RM0091 табл. 90)Standard-modeFast-modeFast-mode Plus
Удержание tHD;DAT, не меньше000
Данные действительны 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 в них — наименьшие допустимые при предельных фронтах режима:

I2CCLK10 кГц100 кГц400 кГцFast-mode Plus
8 МГц0x1042C3C70x10420F130x003103090x00100306 (500 кГц)
16 МГц0x3042C3C70x30420F130x103203090x00200204 (1 МГц)
48 МГц0xB042C3C70xB0420F130x503303090x50100103 (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), и этот калькулятор к ним не подходит.

Источники

  1. 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
  2. STMicroelectronics. DS9826 Rev 6. Datasheet: STM32F072x8, STM32F072xB — таблица 67: задержка аналогового фильтра tAF — от 50 до 260 нс
  3. 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
  4. 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>

Обновлено .

Нашли ошибку в расчёте?