Перейти до основного вмісту

Модуль I2C MCAL

Підтримувані родини STM32: H5
Не підтримуються: G4, H7, L4, U5

Цей модуль надає рівень абстракції для налаштування та керування периферією I2C в MCU STM32H5 у режимі master.
Він підтримує ініціалізацію, налаштування частоти SCL з автоматичним обчисленням TIMINGR, фільтри шуму та передачу даних у режимі DMA, переривань або опитування (polling).


Можливості​

  • Вибір джерела тактування ядра (PCLK / PLLR / HSI / CSI)
  • Частота SCL у Гц - TIMINGR обчислюється за таймінгами зі специфікації I2C (Standard-mode, Fast-mode, Fast-mode Plus, включно з FMP drive)
  • Аналоговий і цифровий фільтр шуму
  • 7-бітна та 10-бітна адресація
  • Передачі: запис, читання, запис + повторний START + читання (доступ до регістрів), лише адреса (перевірка наявності пристрою)
  • Передачі довші за 255 байтів (перезавантаження NBYTES)
  • Режими передачі даних: DMA (GPDMA), ISR, POLL (I2c_Task()) - той самий запит, ті самі callback-и
  • Виводи SCL / SDA налаштовуються як альтернативна функція open-drain

Не підтримуються: режим slave, SMBus, відновлення шини (slave утримує SDA у низькому рівні), тайм-аут передачі.


Публічний API​

Керування модулем​

  • i2c_ModuleVersion_t I2c_Get_ModuleVersion(void);
  • i2c_RequestState_t I2c_Init(const i2c_Config_t * const i2cConfig);
  • i2c_RequestState_t I2c_Deinit(i2c_PeriphId_t periphId);
  • void I2c_Task(void);
  • i2c_RequestState_t I2c_Get_DefaultConfig(i2c_Config_t * const i2cConfig);

Конфігурація периферії​

  • I2c_Set_PeriphActive / I2c_Set_PeriphInactive / I2c_Get_PeriphState
  • I2c_Set_BusFreq / I2c_Get_BusFreq (для встановлення потрібен PE = 0)
  • I2c_Set_AnalogFilter / I2c_Get_AnalogFilter (для встановлення потрібен PE = 0)
  • I2c_Set_DigitalFilter / I2c_Get_DigitalFilter (для встановлення потрібен PE = 0)
  • I2c_Set_AddrMode / I2c_Get_AddrMode
  • I2c_Get_BusState

Передачі даних​

  • I2c_Set_DataConfig / I2c_Get_DataConfig
  • I2c_Set_XferStart / I2c_Set_XferStop
  • I2c_Get_XferState / I2c_Get_XferError

Переривання​

  • I2c_Set_IrqPriority / I2c_Get_IrqPriority

Використання​

static const i2c_DataConfig_t i2cData =
{
.XferMode = I2C_XFER_MODE_ISR,
.IrqPriority = 5u,
.XferCompleteCallback = App_I2cDone,
.ErrorCallback = App_I2cError,
};

i2c_Config_t i2cConfig;

(void)I2c_Get_DefaultConfig( &i2cConfig );

i2cConfig.PeriphId = I2C_PERIPH_1;
i2cConfig.BusFreq = 400000u;
i2cConfig.DataConfig = &i2cData;
i2cConfig.SclPin = (i2c_PinConfig_t)I2C_PIN_CONFIG( GPIO_PORT_B, GPIO_PIN_ID_6, GPIO_ALT_FUNC_4 ); /* check datasheet */
i2cConfig.SdaPin = (i2c_PinConfig_t)I2C_PIN_CONFIG( GPIO_PORT_B, GPIO_PIN_ID_7, GPIO_ALT_FUNC_4 ); /* check datasheet */

(void)I2c_Init( &i2cConfig );

/* Read 2 bytes from register 0x10 of slave 0x48 */
static const i2c_Data_t regAddr = 0x10u;
static i2c_Data_t regData[ 2u ];

const i2c_XferRequest_t request =
{
.SlaveAddr = 0x48u,
.TxData = &regAddr, .TxSize = 1u,
.RxData = regData, .RxSize = 2u,
};

(void)I2c_Set_XferStart( I2C_PERIPH_1, &request );

Відповідність виводів периферії модулем не перевіряється - використовуйте альтернативну функцію з datasheet пристрою.


Інтеграція з CMake​

  1. Злінкуйте I2c_Lib з вашою CMake-бібліотекою.
  2. Підключіть I2c_Port.h у вашому проєкті.

Ліцензія​

Цей проєкт ліцензовано за Creative Commons Attribution–NonCommercial 4.0 International (CC BY-NC 4.0).

Повні умови дивіться у LICENSE.md або на creativecommons.org/licenses/by-nc/4.0.


Автори​