Skip to main content
Visitor II
September 27, 2025
Question

STM8L052R8 I2C COMMUNICATION FAILURE

  • September 27, 2025
  • 1 reply
  • 464 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 

 

    This topic has been closed for replies.

    1 reply

    Visitor II
    September 29, 2025

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

    Try with this:

    #define SLAVE_ADDR 0x27 << 1