Modul MCAL I2C
Podporované rodiny STM32: H5
Nepodporované: G4, H7, L4, U5
Tento modul poskytuje abstrakční vrstvu pro konfiguraci a správu periferií I2C na MCU STM32H5 v režimu master.
Podporuje inicializaci, konfiguraci frekvence SCL s automatickým výpočtem TIMINGR, šumové filtry a přenosy dat v režimu DMA, přerušení nebo pollingu.
Vlastnosti
- Výběr zdroje kernel clock (PCLK / PLLR / HSI / CSI)
- Frekvence SCL v Hz - TIMINGR se vypočítá z časování podle specifikace I2C (Standard-mode, Fast-mode, Fast-mode Plus včetně FMP drive)
- Analogový a digitální šumový filtr
- 7bitové a 10bitové adresování
- Přenosy: zápis, čtení, zápis + opakovaný START + čtení (přístup k registrům), pouze adresa (kontrola přítomnosti zařízení)
- Přenosy delší než 255 bajtů (reload NBYTES)
- Režimy přenosu dat: DMA (GPDMA), ISR, POLL (
I2c_Task()) - stejný požadavek, stejné callbacky - Piny SCL / SDA nakonfigurované jako alternativní funkce s open-drain výstupem
Nepodporováno: režim slave, SMBus, obnova sběrnice (slave drží SDA v nule), timeout přenosu.
Veřejné API
Správa modulu
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);
Konfigurace periferie
I2c_Set_PeriphActive/I2c_Set_PeriphInactive/I2c_Get_PeriphStateI2c_Set_BusFreq/I2c_Get_BusFreq(pro nastavení je vyžadováno PE = 0)I2c_Set_AnalogFilter/I2c_Get_AnalogFilter(pro nastavení je vyžadováno PE = 0)I2c_Set_DigitalFilter/I2c_Get_DigitalFilter(pro nastavení je vyžadováno PE = 0)I2c_Set_AddrMode/I2c_Get_AddrModeI2c_Get_BusState
Přenosy dat
I2c_Set_DataConfig/I2c_Get_DataConfigI2c_Set_XferStart/I2c_Set_XferStopI2c_Get_XferState/I2c_Get_XferError
Přerušení
I2c_Set_IrqPriority/I2c_Get_IrqPriority
Použití
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 = ®Addr, .TxSize = 1u,
.RxData = regData, .RxSize = 2u,
};
(void)I2c_Set_XferStart( I2C_PERIPH_1, &request );
Mapování pinů na periferii modul neověřuje - použijte alternativní funkci z datasheetu zařízení.
Integrace s CMake
- Prolinkujte
I2c_Libse svou knihovnou CMake. - Zahrňte
I2c_Port.hdo svého projektu.
Licence
Tento projekt je licencován pod licencí Creative Commons Uveďte původ–Neužívejte komerčně 4.0 Mezinárodní (CC BY-NC 4.0).
Úplné podmínky najdete v LICENSE.md nebo navštivte creativecommons.org/licenses/by-nc/4.0.
Autoři
- Mr.Nobody — embedbits.com