#include "stm32c0xx.h"
#define I2C_GPIO_PORT GPIOB
#define I2C_SCL_PIN GPIO_PIN_6
#define I2C_SDA_PIN GPIO_PIN_7
#define I2C_PORT I2C1
#define I2C_CLOCK_FREQ 100000 // 100 kHz
#define I2C_TIMEOUT 10000 // Timeout value for I2C operations
void I2C_Init() {
RCC->IOPENR |= RCC_IOPENR_GPIOBEN;
I2C_GPIO_PORT->MODER &= ~(GPIO_MODER_MODE6 | GPIO_MODER_MODE7);
I2C_GPIO_PORT->MODER |= (GPIO_MODER_MODE6_1 | GPIO_MODER_MODE7_1);
I2C_GPIO_PORT->AFR[0] |= (0x01 << (6 * 4)) | (0x01 << (7 * 4));
RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;
I2C_PORT->CR1 = 0;
I2C_PORT->TIMINGR = 0x00201D2B;
I2C_PORT->CR1 |= I2C_CR1_PE;
}
void I2C_Start() {
I2C_PORT->CR2 |= I2C_CR2_START;
while (!(I2C_PORT->ISR & I2C_ISR_BUSY));
}
void I2C_Stop() {
I2C_PORT->CR2 |= I2C_CR2_STOP;
while (I2C_PORT->ISR & I2C_ISR_BUSY);
}
void I2C_WriteAddress(uint8_t address) {
I2C_PORT->TXDR = (address << 1);
while (!(I2C_PORT->ISR & I2C_ISR_TXE));
}
uint8_t I2C_ReadAck() {
I2C_PORT->CR2 &= ~I2C_CR2_NACK;
I2C_PORT->CR2 |= I2C_CR2_RD_WRN;
while (!(I2C_PORT->ISR & I2C_ISR_RXNE));
return I2C_PORT->RXDR;
}
uint8_t I2C_Scan() {
uint8_t deviceCount = 0;
I2C_Start();
for (uint8_t address = 1; address <= 0x7F; address++) {
I2C_WriteAddress(address);
if (!(I2C_PORT->ISR & I2C_ISR_NACKF)) {
deviceCount++;
}
I2C_Stop();
for (volatile uint32_t delay = 0; delay < 1000; delay++);
I2C_Start();
}
I2C_Stop();
return deviceCount;
}
int main() {
I2C_Init();
uint8_t deviceCount = I2C_Scan();
while (1) {
}
return 0;
}