mirror of
https://github.com/MarlinFirmware/Marlin.git
synced 2025-07-09 07:56:20 -06:00
🧑💻 Fix GD32 EEPROM timings (#27846)
This commit is contained in:
parent
94e2558e6c
commit
b22df8b189
2 changed files with 79 additions and 10 deletions
|
@ -62,7 +62,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
|
||||||
// so only write bytes that have changed!
|
// so only write bytes that have changed!
|
||||||
if (v != eeprom_read_byte(p)) {
|
if (v != eeprom_read_byte(p)) {
|
||||||
eeprom_write_byte(p, v);
|
eeprom_write_byte(p, v);
|
||||||
if (++written & 0x7F) delay(4); else safe_delay(4);
|
if (++written & 0x7F) delay(2); else safe_delay(2);
|
||||||
if (eeprom_read_byte(p) != v) {
|
if (eeprom_read_byte(p) != v) {
|
||||||
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -44,6 +44,10 @@
|
||||||
#define EEPROM_DEVICE_ADDRESS (0x50 << 1)
|
#define EEPROM_DEVICE_ADDRESS (0x50 << 1)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef ARDUINO_ARCH_MFL
|
||||||
|
#define EXTRA_EEPROM_DELAY
|
||||||
|
#endif
|
||||||
|
|
||||||
// IO direction setting
|
// IO direction setting
|
||||||
#ifdef __STM32F1__
|
#ifdef __STM32F1__
|
||||||
#define SDA_IN() do{ PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH &= 0XFFFF0FFF; PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH |= 8 << 12; }while(0)
|
#define SDA_IN() do{ PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH &= 0XFFFF0FFF; PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH |= 8 << 12; }while(0)
|
||||||
|
@ -60,6 +64,14 @@
|
||||||
#define IIC_SDA_1() WRITE(IIC_EEPROM_SDA, HIGH)
|
#define IIC_SDA_1() WRITE(IIC_EEPROM_SDA, HIGH)
|
||||||
#define READ_SDA() READ(IIC_EEPROM_SDA)
|
#define READ_SDA() READ(IIC_EEPROM_SDA)
|
||||||
|
|
||||||
|
#ifdef EXTRA_EEPROM_DELAY
|
||||||
|
#define EXTRA_DELAY 1
|
||||||
|
#define EXTRA_DELAY_LOW 4 // SCL low period (tLOW)
|
||||||
|
#else
|
||||||
|
#define EXTRA_DELAY 0
|
||||||
|
#define EXTRA_DELAY_LOW 0
|
||||||
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// Simple IIC interface via libmaple
|
// Simple IIC interface via libmaple
|
||||||
//
|
//
|
||||||
|
@ -70,28 +82,51 @@ void IIC::init() {
|
||||||
SET_OUTPUT(IIC_EEPROM_SCL);
|
SET_OUTPUT(IIC_EEPROM_SCL);
|
||||||
IIC_SCL_1();
|
IIC_SCL_1();
|
||||||
IIC_SDA_1();
|
IIC_SDA_1();
|
||||||
|
|
||||||
|
#ifdef EXTRA_EEPROM_DELAY
|
||||||
|
delay_us(EXTRA_DELAY); // Ensure bus free time
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate IIC start signal
|
// Generate IIC start signal
|
||||||
void IIC::start() {
|
void IIC::start() {
|
||||||
SDA_OUT(); // SDA line output
|
SDA_OUT(); // SDA line output
|
||||||
IIC_SDA_1();
|
IIC_SDA_1();
|
||||||
|
|
||||||
|
#ifdef EXTRA_EEPROM_DELAY
|
||||||
|
delay_us(4 + EXTRA_DELAY); // Setup time before SCL high
|
||||||
|
#endif
|
||||||
|
|
||||||
IIC_SCL_1();
|
IIC_SCL_1();
|
||||||
delay_us(4);
|
delay_us(4 + EXTRA_DELAY);
|
||||||
IIC_SDA_0(); // START:when CLK is high, DATA change from high to low
|
IIC_SDA_0(); // START:when CLK is high, DATA change from high to low
|
||||||
delay_us(4);
|
delay_us(4 + EXTRA_DELAY);
|
||||||
IIC_SCL_0(); // Clamp the I2C bus, ready to send or receive data
|
IIC_SCL_0(); // Clamp the I2C bus, ready to send or receive data
|
||||||
|
|
||||||
|
#ifdef EXTRA_EEPROM_DELAY
|
||||||
|
delay_us(EXTRA_DELAY_LOW); // Ensure SCL low period
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate IIC stop signal
|
// Generate IIC stop signal
|
||||||
void IIC::stop() {
|
void IIC::stop() {
|
||||||
SDA_OUT(); // SDA line output
|
SDA_OUT(); // SDA line output
|
||||||
IIC_SCL_0();
|
IIC_SCL_0();
|
||||||
|
|
||||||
|
#ifdef EXTRA_EEPROM_DELAY
|
||||||
|
delay_us(EXTRA_DELAY_LOW); // Ensure SCL low period
|
||||||
|
#endif
|
||||||
|
|
||||||
IIC_SDA_0(); // STOP:when CLK is high DATA change from low to high
|
IIC_SDA_0(); // STOP:when CLK is high DATA change from low to high
|
||||||
delay_us(4);
|
delay_us(4 + EXTRA_DELAY);
|
||||||
IIC_SCL_1();
|
IIC_SCL_1();
|
||||||
|
|
||||||
|
#ifdef EXTRA_EEPROM_DELAY
|
||||||
|
delay_us(4 + EXTRA_DELAY); // Setup time with SCL high
|
||||||
|
#endif
|
||||||
|
|
||||||
IIC_SDA_1(); // Send I2C bus end signal
|
IIC_SDA_1(); // Send I2C bus end signal
|
||||||
delay_us(4);
|
delay_us(4 + EXTRA_DELAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wait for the response signal to arrive
|
// Wait for the response signal to arrive
|
||||||
|
@ -100,8 +135,9 @@ void IIC::stop() {
|
||||||
uint8_t IIC::wait_ack() {
|
uint8_t IIC::wait_ack() {
|
||||||
uint8_t ucErrTime = 0;
|
uint8_t ucErrTime = 0;
|
||||||
SDA_IN(); // SDA is set as input
|
SDA_IN(); // SDA is set as input
|
||||||
IIC_SDA_1(); delay_us(1);
|
IIC_SDA_1(); delay_us(1 + EXTRA_DELAY);
|
||||||
IIC_SCL_1(); delay_us(1);
|
IIC_SCL_1(); delay_us(1 + EXTRA_DELAY);
|
||||||
|
|
||||||
while (READ_SDA()) {
|
while (READ_SDA()) {
|
||||||
if (++ucErrTime > 250) {
|
if (++ucErrTime > 250) {
|
||||||
stop();
|
stop();
|
||||||
|
@ -109,29 +145,52 @@ uint8_t IIC::wait_ack() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
IIC_SCL_0(); // Clock output 0
|
IIC_SCL_0(); // Clock output 0
|
||||||
|
|
||||||
|
#ifdef EXTRA_EEPROM_DELAY
|
||||||
|
delay_us(EXTRA_DELAY); // Hold time after SCL falls
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate ACK response
|
// Generate ACK response
|
||||||
void IIC::ack() {
|
void IIC::ack() {
|
||||||
IIC_SCL_0();
|
IIC_SCL_0();
|
||||||
|
|
||||||
|
#ifdef EXTRA_EEPROM_DELAY
|
||||||
|
delay_us(EXTRA_DELAY_LOW); // Ensure SCL low period
|
||||||
|
#endif
|
||||||
|
|
||||||
SDA_OUT();
|
SDA_OUT();
|
||||||
IIC_SDA_0();
|
IIC_SDA_0();
|
||||||
delay_us(2);
|
delay_us(2);
|
||||||
IIC_SCL_1();
|
IIC_SCL_1();
|
||||||
delay_us(2);
|
delay_us(2 + EXTRA_DELAY);
|
||||||
IIC_SCL_0();
|
IIC_SCL_0();
|
||||||
|
|
||||||
|
#ifdef EXTRA_EEPROM_DELAY
|
||||||
|
delay_us(EXTRA_DELAY); // Data hold time
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// No ACK response
|
// No ACK response
|
||||||
void IIC::nAck() {
|
void IIC::nAck() {
|
||||||
IIC_SCL_0();
|
IIC_SCL_0();
|
||||||
|
|
||||||
|
#ifdef EXTRA_EEPROM_DELAY
|
||||||
|
delay_us(EXTRA_DELAY_LOW); // Ensure SCL low period
|
||||||
|
#endif
|
||||||
|
|
||||||
SDA_OUT();
|
SDA_OUT();
|
||||||
IIC_SDA_1();
|
IIC_SDA_1();
|
||||||
delay_us(2);
|
delay_us(2);
|
||||||
IIC_SCL_1();
|
IIC_SCL_1();
|
||||||
delay_us(2);
|
delay_us(2 + EXTRA_DELAY);
|
||||||
IIC_SCL_0();
|
IIC_SCL_0();
|
||||||
|
|
||||||
|
#ifdef EXTRA_EEPROM_DELAY
|
||||||
|
delay_us(EXTRA_DELAY); // Data hold time
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send one IIC byte
|
// Send one IIC byte
|
||||||
|
@ -141,13 +200,18 @@ void IIC::nAck() {
|
||||||
void IIC::send_byte(uint8_t txd) {
|
void IIC::send_byte(uint8_t txd) {
|
||||||
SDA_OUT();
|
SDA_OUT();
|
||||||
IIC_SCL_0(); // Pull down the clock to start data transmission
|
IIC_SCL_0(); // Pull down the clock to start data transmission
|
||||||
|
|
||||||
|
#ifdef EXTRA_EEPROM_DELAY
|
||||||
|
delay_us(EXTRA_DELAY_LOW); // Ensure SCL low period
|
||||||
|
#endif
|
||||||
|
|
||||||
for (uint8_t t = 0; t < 8; ++t) {
|
for (uint8_t t = 0; t < 8; ++t) {
|
||||||
// IIC_SDA = (txd & 0x80) >> 7;
|
// IIC_SDA = (txd & 0x80) >> 7;
|
||||||
if (txd & 0x80) IIC_SDA_1(); else IIC_SDA_0();
|
if (txd & 0x80) IIC_SDA_1(); else IIC_SDA_0();
|
||||||
txd <<= 1;
|
txd <<= 1;
|
||||||
delay_us(2); // All three delays are necessary for TEA5767
|
delay_us(2); // All three delays are necessary for TEA5767
|
||||||
IIC_SCL_1();
|
IIC_SCL_1();
|
||||||
delay_us(2);
|
delay_us(2 + EXTRA_DELAY);
|
||||||
IIC_SCL_0();
|
IIC_SCL_0();
|
||||||
delay_us(2);
|
delay_us(2);
|
||||||
}
|
}
|
||||||
|
@ -161,6 +225,11 @@ uint8_t IIC::read_byte(unsigned char ack_chr) {
|
||||||
IIC_SCL_0();
|
IIC_SCL_0();
|
||||||
delay_us(2);
|
delay_us(2);
|
||||||
IIC_SCL_1();
|
IIC_SCL_1();
|
||||||
|
|
||||||
|
#ifdef EXTRA_EEPROM_DELAY
|
||||||
|
delay_us(EXTRA_DELAY); // Delay before reading to allow EEPROM to output data
|
||||||
|
#endif
|
||||||
|
|
||||||
receive <<= 1;
|
receive <<= 1;
|
||||||
if (READ_SDA()) receive++;
|
if (READ_SDA()) receive++;
|
||||||
delay_us(1);
|
delay_us(1);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue