У меня есть процессор серии stm32l0, и я не знаю, как рассчитать время i2c. Хочу работать с сенсором Bosh bme680 / bme280. Я нашел только инструмент настройки времени для stm32F0 / f3. Some1 умеют его рассчитать?
ИМХО, лучший метод измерения времени - использовать контрольные точки и осциллограф. Напишите некоторый тестовый код, который утверждает контрольную точку в начале и отменяет контрольную точку в конце измерения. Используйте оскоп, чтобы измерить время.
В процессоре ARM нет метода для точного расчета времени выполнения инструкций из-за кешей инструкций, буферов и алгоритмов упреждающего просмотра, продолжительности выборки и сохранения в памяти, прогнозирования ветвлений. Поищите в Интернете "Расчет времени выполнения инструкций ARM".
Я не уверен, что моя проблема ясна для вас ... ммм, я имею в виду, что хочу настроить параметры для шины i2c, например namei2c.Instance = I2C1; namei2c.Init.OwnAddress1 = 0; namei2c.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; и т.д. и т.д ... Я не уверен, что писать в настройку namei2c.Init.Timing, как рассчитать / выбор хорошо;)





TL; DR: RM0377 Справочное руководство "Ультра-маломощный STM32L0x1 Advanced Arm®-based 32-bit MCU », стр. 614 содержит примеры.
Примечание: я еще не работал с I2C. Все нижеследующее основано на документации.
Руководство пользователя UM1749 "Описание STM32L0 HAL и нижнего уровня. водители » (стр. 233):
uint32_t I2C_InitTypeDef::Timing Specifies the I2C_TIMINGR_register value. This parameter calculated by referring to I2C initialization section in Reference manual
RM0377 Справочное руководство "Ультра-маломощный STM32L0x1 Advanced Arm®-based 32-bit MCU » (стр.641):
Timing register (I2C_TIMINGR)
(...)
PRESC[3:0] : Timing prescaler
This field is used to prescale I2CCLK in order to generate the clock period t_PRESC used for data setup and hold counters (refer to I2C timings on page 587 ) and for SCL high and low level counters (refer to I2C master initialization on page 602 ).
t_PRESC = (PRESC+1) x t_I2CCLKSCLDEL[3:0] : Data setup time This field is used to generate a delay t_SCLDEL between SDA edge and SCL rising edge. In master mode and in slave mode with NOSTRETCH = 0, the SCL line is stretched low during t_SCLDEL.
t_SCLDEL = (SCLDEL+1) x t_PRESCNote: t_SCLDEL is used to generate t_SU:DAT timing.
SDADEL[3:0] : Data hold time This field is used to generate the delay t_SDADEL between SCL falling edge and SDA edge. In master mode and in slave mode with NOSTRETCH = 0, the SCL line is stretched low during t_SDADEL.
t_SDADEL = SDADEL x t_PRESCNote: SDADEL is used to generate t_HD:DAT timing.
SCLH[7:0] : SCL high period (master mode) This field is used to generate the SCL high period in master mode.
t_SCLH = (SCLH+1) x t_PRESCNote: SCLH is also used to generate t_SU:STO and t_HD:STA timing.
SCLL[7:0] : SCL low period (master mode) This field is used to generate the SCL low period in master mode.
t_SCLL = (SCLL+1) x t_PRESCNote: SCLL is also used to generate t_BUF and t_SU:STA timings.
Более подробную информацию о предделителях можно найти в параграфах о таймерах. (стр. 433).
RM0377 (стр. 581):
The interface is connected to the I2C bus by a data pin (SDA) and by a clock pin (SCL). It can be connected with a standard (up to 100 kHz), Fast-mode (up to 400 kHz) or Fast-mode Plus (up to 1MHz) I2C bus.
Таким образом, для связи часы I2C должны иметь соответствующую частоту.
RM0377 (стр. 583):
This independent clock source can be selected from the following three clock sources:
- PCLK1: APB1 clock (default value)
- HSI16: internal 16 MHz RC oscillator
- SYSCLK: system clock Refer to Section 7: Reset and clock control (RCC) for more details.
RM0377 (стр. 602):
t_SCL = t_SYNC1 + t_SYNC2 + {[(SCLH+1) + (SCLL+1)] x (PRESC+1) x t_I2CCLK}The duration of t_SYNC1 depends on these parameters:
- SCL falling slope
- When enabled, input delay induced by the analog filter.
- When enabled, input delay induced by the digital filter: DNF x t_I2CCLK
- Delay due to SCL synchronization with I2CCLK clock (2 to 3 I2CCLK periods)
The duration of t_SYNC2 depends on these parameters:
- SCL rising slope
- When enabled, input delay induced by the analog filter.
- When enabled, input delay induced by the digital filter: DNF x t_I2CCLK
- Delay due to SCL synchronization with I2CCLK clock (2 to 3 I2CCLK periods)
BME280 Лист данных (стр.30):
All modes (standard, fast, high speed) are supported.
Собирать все это: на основе тактовой частоты I2C и скорости, которую вы хотите использовать, вам необходимо выбрать такие значения PRESC, SCLDEL, SDADEL, SCLH, SCLL, которые соответствуют I2C-SMBUS specification clock timings, используя формулу t_SCL = t_SYNC1 + t_SYNC2 + {[(SCLH+1) + (SCLL+1)] x (PRESC+1) x t_I2CCLK}.
Также есть несколько I2C_TIMINGR register configuration examples в RM0377 на странице 614.
(вы также можете продолжить методом проб и ошибок ...)