2025-09-26 11:17 PM - last edited on 2025-09-29 2:35 PM by mƎALLEm
#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
2025-09-29 9:40 AM
Maybe slave address need to be left-shifted by 1.
Try with this:
#define SLAVE_ADDR 0x27 << 1