diff --git a/SHAL/Include/Peripheral/I2C/Reg/SHAL_I2C_REG_F072xB.h b/SHAL/Include/Peripheral/I2C/Reg/SHAL_I2C_REG_F072xB.h index 0e2d114..4a9812c 100644 --- a/SHAL/Include/Peripheral/I2C/Reg/SHAL_I2C_REG_F072xB.h +++ b/SHAL/Include/Peripheral/I2C/Reg/SHAL_I2C_REG_F072xB.h @@ -40,7 +40,7 @@ constexpr SHAL_I2C_Pair getI2CPair(const I2C_Pair pair){ __builtin_unreachable(); } -constexpr SHAL_I2C_Enable_REG getI2CEnableReg(const I2C_Pair pair){ +constexpr SHAL_I2C_Enable_Reg getI2CEnableReg(const I2C_Pair pair){ switch(pair){ case I2C_Pair::SCL1B6_SDA1B7: case I2C_Pair::SCL1B8_SDA1B9: @@ -56,4 +56,37 @@ constexpr SHAL_I2C_Enable_REG getI2CEnableReg(const I2C_Pair pair){ __builtin_unreachable(); } +constexpr SHAL_I2C_Reset_Reg getI2CResetReg(const I2C_Pair pair){ + switch(pair){ + case I2C_Pair::SCL1B6_SDA1B7: + case I2C_Pair::SCL1B8_SDA1B9: + return {&RCC->APB1RSTR,RCC_APB1RSTR_I2C1RST}; + case I2C_Pair::SCL2B10_SDA2B11: + case I2C_Pair::SCL2B13_SDA2B14: + return {&RCC->APB1RSTR,RCC_APB1RSTR_I2C2RST}; + case I2C_Pair::NUM_PAIRS: + case I2C_Pair::INVALID: + assert(false); + return {nullptr, 0}; + } + __builtin_unreachable(); +} + +//Gets all the bits in the I2C timer register, these values should rarely be manually set, but I wanted to support it anyway +constexpr SHAL_I2C_Timing_Reg getI2CTimerReg(const I2C_Pair pair){ + switch(pair){ + case I2C_Pair::SCL1B6_SDA1B7: + case I2C_Pair::SCL1B8_SDA1B9: + return {&I2C1->TIMINGR,31,4,23,4,19,4,15,8,7,0}; + case I2C_Pair::SCL2B10_SDA2B11: + case I2C_Pair::SCL2B13_SDA2B14: + return {&I2C2->TIMINGR,31,4,23,4,19,4,15,8,7,0}; + case I2C_Pair::NUM_PAIRS: + case I2C_Pair::INVALID: + assert(false); + __builtin_unreachable(); + } + __builtin_unreachable(); +} + #endif //SHAL_I2C_REG_F072XB_H diff --git a/SHAL/Include/Peripheral/I2C/Reg/SHAL_I2C_TYPES.h b/SHAL/Include/Peripheral/I2C/Reg/SHAL_I2C_TYPES.h index 3b93c27..d0f0146 100644 --- a/SHAL/Include/Peripheral/I2C/Reg/SHAL_I2C_TYPES.h +++ b/SHAL/Include/Peripheral/I2C/Reg/SHAL_I2C_TYPES.h @@ -17,9 +17,29 @@ struct SHAL_I2C_Pair { GPIO_Alternate_Function SDA_Mask; }; -struct SHAL_I2C_Enable_REG{ +struct SHAL_I2C_Enable_Reg{ volatile uint32_t* reg; uint32_t mask; }; +struct SHAL_I2C_Reset_Reg{ + volatile uint32_t* reg; + uint32_t mask; +}; + +//Manual values for I2C timer register +struct SHAL_I2C_Timing_Reg{ + volatile uint32_t* reg; + uint8_t prescaler_offset; + uint8_t prescaler_width; + uint8_t dataSetupTime_offset; + uint8_t dataSetupTime_width; + uint8_t dataHoldTime_offset; + uint8_t dataHoldTime_width; + uint8_t SCLHighPeriod_offset; + uint8_t SCLHighPeriod_width; + uint8_t SCLLowPeriod_offset; + uint8_t SCLLowPeriod_width; +}; + #endif //SHMINGO_HAL_SHAL_I2C_TYPES_H diff --git a/SHAL/Include/Peripheral/I2C/SHAL_I2C.h b/SHAL/Include/Peripheral/I2C/SHAL_I2C.h index 4a9768d..9a9470c 100644 --- a/SHAL/Include/Peripheral/I2C/SHAL_I2C.h +++ b/SHAL/Include/Peripheral/I2C/SHAL_I2C.h @@ -15,6 +15,16 @@ class SHAL_I2C{ public: + void init(I2C_Pair pair) volatile; + + void masterTransmit(); + + //Manually set the clock configuration. Refer to your MCU's reference manual for examples + void setClockConfig(uint8_t prescaler, uint8_t dataSetupTime, uint8_t dataHoldTime, uint8_t SCLHighPeriod, uint8_t SCLLowPeriod); + + //Set clock configuration based on a value calculated from STM32CubeMX, or other similar tools + void setClockConfig(uint32_t configuration); + private: SHAL_I2C() = default; diff --git a/SHAL/Src/Peripheral/I2C/SHAL_I2C.cpp b/SHAL/Src/Peripheral/I2C/SHAL_I2C.cpp index 65df69c..c7f749c 100644 --- a/SHAL/Src/Peripheral/I2C/SHAL_I2C.cpp +++ b/SHAL/Src/Peripheral/I2C/SHAL_I2C.cpp @@ -2,3 +2,9 @@ // Created by Luca on 9/9/2025. // +#include "SHAL_I2C.h" + +void SHAL_I2C::init() volatile { + +} +