2025-06-27 7:10 AM
Hello,
i'm using arduino to code a STM32C011J6M6 and I want to use the Energy harvesting pin of ST25DV04K to source the IC when the VCC be off and the NFC Field be on.
But with this code the EH is on just when VCC and NFC Field are on.
if I remove all the EH_MODE code part, the circuit continues to works, so i believe that I'm coding this wrong. Someone already works with this kind of programming?
Best Regards
#include <Wire.h>
#define LED PC13
#define SCL_PIN PB6
#define SDA_PIN PB7
#define TILT PA13
#define ST25DV64K_ADDR 0x53
int memAddr = 0;
int counter = 0;
#define PTR_EH_MODE 0x0002
#define PTR_EH_CTRL_DYN 0x2002
void setup() {
pinMode(LED, OUTPUT);
pinMode(TILT, INPUT);
Wire.begin();
configureEnergyHarvesting();
}
void loop() {
digitalWrite(LED, HIGH);
delay(500);
uint8_t tiltCount = countTiltEvents();
writeEEPROM(memAddr++, 5);
writeEEPROM(memAddr++, (uint8_t)26);
writeEEPROM(memAddr++, 52);
writeEEPROM(memAddr, (uint8_t)counter);
counter = (counter + 1) % 256;
uint8_t readData = readEEPROM(memAddr++);
if (memAddr >= 1000) { memAddr = 0; }
digitalWrite(LED, LOW);
}
void configureEnergyHarvesting() {
Wire.beginTransmission(ST25DV64K_ADDR);
Wire.write((uint8_t)(PTR_EH_MODE >> 8));
Wire.write((uint8_t)(PTR_EH_MODE & 0xFF));
Wire.write(0x00);
Wire.endTransmission();
delay(10);
Wire.beginTransmission(ST25DV64K_ADDR);
Wire.write((uint8_t)(PTR_EH_CTRL_DYN >> 8));
Wire.write((uint8_t)(PTR_EH_CTRL_DYN & 0xFF));
Wire.write(0x01);
Wire.endTransmission();
delay(10);
}
uint8_t countTiltEvents() {
uint8_t count = 0;
unsigned long startTime = millis();
bool lastState = digitalRead(TILT);
while (millis() - startTime < 1000) {
bool currentState = digitalRead(TILT);
if (currentState && !lastState) {
count++;
if (count == 255) break;
}
lastState = currentState;
delay(1);
}
return count;
}
void writeEEPROM(uint16_t addr, uint8_t data) {
Wire.beginTransmission(ST25DV64K_ADDR);
Wire.write((uint8_t)(addr >> 8));
Wire.write((uint8_t)(addr & 0xFF));
Wire.write(data);
Wire.endTransmission();
delay(10);
}
uint8_t readEEPROM(uint16_t addr) {
Wire.beginTransmission(ST25DV64K_ADDR);
Wire.write((uint8_t)(addr >> 8));
Wire.write((uint8_t)(addr & 0xFF));
Wire.endTransmission();
Wire.requestFrom(ST25DV64K_ADDR, (uint8_t)1);
if (Wire.available()) {
return Wire.read();
}
return 0xFF;
}