2025-02-28 9:24 AM - last edited on 2025-02-28 10:24 AM by Tesla DeLorean
Hello,
I'm using an STM32C011J6M6 with the Arduino IDE to register with theST25DV64KC-IE6S3 's EEPROM.
I previously used the ATTiny85 and would like to replace it with the STM32C0 to maintain the entire solution with ST components.
I made some changes to the code but I can't register with the SDA/SCL of the STM32C0.
According to the datasheet, I should use pin 8 as SCL and pin 1 as SDA, but the registration with the EEPROM isn't working, I tested the eeprom address with ATTiny85 and it is 0x53
In the project with the ATTiny85, I didn't need to declare the terminal to perform this registration. Does anyone have a programming example that communicates via I2C?
#include <Wire.h>
#include <EEPROM.h>
#define EEPROM_ADDRESS 0x53
#define START_ADDRESS 0
int currentAddress = START_ADDRESS;
int counter = 0;
void setup() {
Wire.begin();
}
void loop() {
writeToEEPROM(currentAddress, currentAddress);
currentAddress++;
counter = (counter > 499) ? 0 : counter + 1;
currentAddress = (currentAddress >= 999) ? START_ADDRESS : currentAddress;
...
void writeToEEPROM(int address, uint8_t value) {
Wire.beginTransmission(EEPROM_ADDRESS);
Wire.write((address >> 8) & 0xFF); // High address byte
Wire.write(address & 0xFF); // Low address byte
Wire.write(value);
Wire.endTransmission();
}
Solved! Go to Solution.
2025-04-03 12:19 PM
I found the problem, the Wire.h library does not work on the STM32C011J6M6 in the SO8N footprint for some reason that I could not identify.
I changed it to an I²C communication code without the library and reading the datasheet I got to the terminals that are specified as SDA and SCL in the code
#define LED PA8
#define SCL_PIN 7
#define SDA_PIN PB7
#define ST25DV64K_ADDR 0x53
void i2c_init();
void i2c_start();
void i2c_stop();
void i2c_write_byte(uint8_t data);
void writeEEPROM(uint16_t memAddr, uint8_t data);
int memAddr = 0;
int counter = 0;
void setup() {
pinMode(LED, OUTPUT);
i2c_init();
}
void loop() {
digitalWrite(LED, HIGH);
delay(500);
writeEEPROM(memAddr, counter & 0xFF);
memAddr++;
counter++;
if (counter > 255) {
counter = 0;
}
if (memAddr >= 1000) {
memAddr = 0;
}
digitalWrite(LED, LOW);
}
void i2c_init() {
pinMode(SCL_PIN, OUTPUT_OPEN_DRAIN);
pinMode(SDA_PIN, OUTPUT_OPEN_DRAIN);
digitalWrite(SCL_PIN, HIGH);
digitalWrite(SDA_PIN, HIGH);
}
void i2c_start() {
digitalWrite(SDA_PIN, HIGH);
digitalWrite(SCL_PIN, HIGH);
delayMicroseconds(5);
digitalWrite(SDA_PIN, LOW);
delayMicroseconds(5);
digitalWrite(SCL_PIN, LOW);
delayMicroseconds(5);
}
void i2c_stop() {
digitalWrite(SCL_PIN, LOW);
digitalWrite(SDA_PIN, LOW);
delayMicroseconds(5);
digitalWrite(SCL_PIN, HIGH);
delayMicroseconds(5);
digitalWrite(SDA_PIN, HIGH);
delayMicroseconds(5);
}
void i2c_write_byte(uint8_t data) {
for (int8_t i = 7; i >= 0; i--) {
digitalWrite(SDA_PIN, (data & (1 << i)) ? HIGH : LOW);
delayMicroseconds(2);
digitalWrite(SCL_PIN, HIGH);
delayMicroseconds(5);
digitalWrite(SCL_PIN, LOW);
delayMicroseconds(3);
}
digitalWrite(SDA_PIN, HIGH);
digitalWrite(SCL_PIN, HIGH);
delayMicroseconds(5);
digitalWrite(SCL_PIN, LOW);
delayMicroseconds(2);
}
void writeEEPROM(int memAddr, int data) {
i2c_start();
i2c_write_byte(ST25DV64K_ADDR << 1);
i2c_write_byte(memAddr >> 8);
i2c_write_byte(memAddr & 0xFF);
i2c_write_byte(data & 0xFF);
i2c_stop();
delay(50);
}
2025-02-28 10:26 AM
Please use the code pasting tool "</>" icon rather than dump partial source in-line. This way the formatting/indentation won't be lost.
You can also EDIT your own posts via the "V" to the upper right of your post(s)
2025-04-03 12:19 PM
I found the problem, the Wire.h library does not work on the STM32C011J6M6 in the SO8N footprint for some reason that I could not identify.
I changed it to an I²C communication code without the library and reading the datasheet I got to the terminals that are specified as SDA and SCL in the code
#define LED PA8
#define SCL_PIN 7
#define SDA_PIN PB7
#define ST25DV64K_ADDR 0x53
void i2c_init();
void i2c_start();
void i2c_stop();
void i2c_write_byte(uint8_t data);
void writeEEPROM(uint16_t memAddr, uint8_t data);
int memAddr = 0;
int counter = 0;
void setup() {
pinMode(LED, OUTPUT);
i2c_init();
}
void loop() {
digitalWrite(LED, HIGH);
delay(500);
writeEEPROM(memAddr, counter & 0xFF);
memAddr++;
counter++;
if (counter > 255) {
counter = 0;
}
if (memAddr >= 1000) {
memAddr = 0;
}
digitalWrite(LED, LOW);
}
void i2c_init() {
pinMode(SCL_PIN, OUTPUT_OPEN_DRAIN);
pinMode(SDA_PIN, OUTPUT_OPEN_DRAIN);
digitalWrite(SCL_PIN, HIGH);
digitalWrite(SDA_PIN, HIGH);
}
void i2c_start() {
digitalWrite(SDA_PIN, HIGH);
digitalWrite(SCL_PIN, HIGH);
delayMicroseconds(5);
digitalWrite(SDA_PIN, LOW);
delayMicroseconds(5);
digitalWrite(SCL_PIN, LOW);
delayMicroseconds(5);
}
void i2c_stop() {
digitalWrite(SCL_PIN, LOW);
digitalWrite(SDA_PIN, LOW);
delayMicroseconds(5);
digitalWrite(SCL_PIN, HIGH);
delayMicroseconds(5);
digitalWrite(SDA_PIN, HIGH);
delayMicroseconds(5);
}
void i2c_write_byte(uint8_t data) {
for (int8_t i = 7; i >= 0; i--) {
digitalWrite(SDA_PIN, (data & (1 << i)) ? HIGH : LOW);
delayMicroseconds(2);
digitalWrite(SCL_PIN, HIGH);
delayMicroseconds(5);
digitalWrite(SCL_PIN, LOW);
delayMicroseconds(3);
}
digitalWrite(SDA_PIN, HIGH);
digitalWrite(SCL_PIN, HIGH);
delayMicroseconds(5);
digitalWrite(SCL_PIN, LOW);
delayMicroseconds(2);
}
void writeEEPROM(int memAddr, int data) {
i2c_start();
i2c_write_byte(ST25DV64K_ADDR << 1);
i2c_write_byte(memAddr >> 8);
i2c_write_byte(memAddr & 0xFF);
i2c_write_byte(data & 0xFF);
i2c_stop();
delay(50);
}