How to configure I2C on STM32L4 Discovery kit IoT node using register
Hello everyone, I have a B-L475E-IOT01A board and I'm trying to configure I2C to communicate with a digital barometer (LPS22HB). But I have a problem, I can't get the SCL signal to be generated. I appreciate your help in solving my problem
#include <stdio.h>
#include <stm32l4xx.h>
void system_clock_msi_init(void)
{
RCC->CR |= RCC_CR_MSION; // MSI clock enable
RCC->CFGR |= RCC_CFGR_SW_MSI; // MSI oscillator selection as system clock
while((RCC->CR & RCC_CR_MSIRDY) == 0);
RCC->CR &= RCC_CR_MSIRANGE_Pos;
RCC->CR |= RCC_CR_MSIRANGE_7; // MSI clock ranges 7 around 8 MHz
RCC->CR |= RCC_CR_MSIRGSEL; // Internal Multi Speed oscillator (MSI) range selection
while((RCC->CR & RCC_CR_MSIRDY) == 0);
}
void clock_enable_init(void)
{
RCC->APB1ENR1 |= RCC_APB1ENR1_I2C2EN; // enable I2C Clock
RCC->AHB2ENR |= RCC_AHB2ENR_GPIOBEN; // enable GPIOB Clock
RCC->CCIPR |= RCC_CCIPR_I2C2SEL_0 ; // System clock (SYSCLK) selected as I2C2 clock
}
void GPIO_I2C_Init(void)
{
GPIOB->MODER = 0xFF0FFEBF; // Reset MODER B
GPIOB->MODER |= GPIO_MODER_MODE10_1 | GPIO_MODER_MODE11_1; // Alternate function mode
GPIOB->OTYPER |= GPIO_OTYPER_OT10 | GPIO_OTYPER_OT11; // Output open-drain
GPIOB->OSPEEDR |= GPIO_OSPEEDR_OSPEED10_Msk | GPIO_OSPEEDR_OSPEED11_Msk; // Very high speed
GPIOB->PUPDR |= GPIO_PUPDR_PUPD10_0 | GPIO_PUPDR_PUPD11_0; // pull-up
GPIOB->AFR[0] |= GPIO_AFRL_AFSEL4_2;
}
void I2C_Config (void)
{
I2C2->CR1 |= I2C_CR1_PE; // Peripheral enable
while((I2C2->CR1 & I2C_CR1_PE) == 0);
I2C2->CR1 &= I2C_CR1_PE_Pos; // Peripheral not enable, Reset the I2C
while((I2C2->CR1 & I2C_CR1_PE) == 1);
I2C2->CR1 &= I2C_CR1_ANFOFF_Pos; // Analog noise filter ON
I2C2->CR1 &= I2C_CR1_DNF_Pos; // Digital noise filter OFF
I2C2->TIMINGR |= 0x0 << I2C_TIMINGR_PRESC_Pos;
I2C2->TIMINGR |= 0x9 << I2C_TIMINGR_SCLL_Pos;
I2C2->TIMINGR |= 0x3 << I2C_TIMINGR_SCLH_Pos;
I2C2->TIMINGR |= 0x1 << I2C_TIMINGR_SDADEL_Pos;
I2C2->TIMINGR |= 0x3 << I2C_TIMINGR_SCLDEL_Pos;
I2C2->CR1 |= I2C_CR1_NOSTRETCH; // Clock stretching disable
I2C2->CR1 |= I2C_CR1_PE; // Peripheral enable
while((I2C2->CR1 & I2C_CR1_PE) == 0);
}
void I2C_Master_Init(void)
{
I2C2->CR2 &= ~I2C_CR2_ADD10; // 0: The master operates in 7-bit addressing mode
I2C2->CR2 |= 0xBA << I2C_CR2_SADD_Pos; // slave address 1011101b
I2C2->CR2 &= ~I2C_CR2_RD_WRN; // 0: Master requests a write transfer
I2C2->CR2 |= 0x1 << I2C_CR2_NBYTES_Pos; // The number of bytes is 1
}
int main(void)
{
system_clock_msi_init();
clock_enable_init();
GPIO_I2C_Init();
I2C_Config();
I2C_Master_Init();
while(1)
{
I2C2->CR2 |= I2C_CR2_START; // Generate START
while (!(I2C2->ISR & I2C_ISR_BUSY));
I2C2->TXDR = 0xBA;
while(!(I2C2->ISR & I2C_ISR_TXIS));
}
return 0;
}