Skip to main content
Visitor II
September 27, 2025
Question

STM8L052R8 I2C COMMUNICATION FAILURE

  • September 27, 2025
  • 1 reply
  • 702 views
#include "stm8l15x.h"
#include "stm8l15x_i2c.h"
#include "stm8l15x_clk.h"
#include "stm8l15x_conf.h"

#define I2C_SPEED 100000 // 100kHz
#define SLAVE_ADDR 0x27

void I2C_Config(void);
void I2C_SendChar(uint8_t slave_addr, char ch);

int main(void) {
 CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
 I2C_Config();

 while (1) {
volatile long delay_loop;
 I2C_SendChar(SLAVE_ADDR, 'A'); // send character 'A' to slave
 for ( delay_loop= 0; delay_loop < 100000; delay_loop++); // delay
 }
}

void I2C_Config(void) {
 CLK_PeripheralClockConfig(CLK_Peripheral_I2C1, ENABLE);

 I2C_DeInit(I2C1);
 I2C_Init(I2C1, I2C_SPEED, 0x00, I2C_Mode_I2C, I2C_DutyCycle_2,
 I2C_Ack_Enable, I2C_AcknowledgedAddress_7bit);
 I2C_Cmd(I2C1, ENABLE);
}

void I2C_SendChar(uint8_t slave_addr, char ch) {
 // START condition
 I2C_GenerateSTART(I2C1, ENABLE);
 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

 // Send slave address + write
 I2C_Send7bitAddress(I2C1, slave_addr << 1, I2C_Direction_Transmitter);
 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

 // Send character
 I2C_SendData(I2C1, (uint8_t)ch);
 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

 // STOP condition
 I2C_GenerateSTOP(I2C1, ENABLE);
}

I AM SENDING THE CHARACTER INTO SLAVE ADRESS 0X27 IN ESP32 I AM NOT ABLE TO READ FROM SLAVE EVEN THOUGH CONNECTIONS ARE CORRECT THE SDA AND SCL LINE IS NOT PULLED TO HIGH IT IS FAILED TO IDENTIFY THE SLAVE AND ACK 

 

    1 reply

    AA1
    Senior III
    September 29, 2025

    Maybe slave address need to be left-shifted by 1.

    Try with this:

    #define SLAVE_ADDR 0x27 << 1