From 5cb7de5929640b20b64c45b82058271eaa50663d Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 17 Oct 2020 17:05:24 +0200 Subject: [PATCH 1/2] make reset timing device specific reset timings seem to be device specific, trying to reset the 7in5_v2 with timings from other devices does not reset the display. Timings taken from https://github.com/waveshare/e-Paper/blob/master/RaspberryPi%26JetsonNano/python/lib/waveshare_epd --- src/epd1in54/mod.rs | 2 +- src/epd1in54b/mod.rs | 2 +- src/epd2in13_v2/mod.rs | 2 +- src/epd2in9/mod.rs | 2 +- src/epd2in9bc/mod.rs | 2 +- src/epd4in2/mod.rs | 2 +- src/epd7in5/mod.rs | 2 +- src/epd7in5_v2/mod.rs | 2 +- src/interface.rs | 15 ++++++++++----- 9 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/epd1in54/mod.rs b/src/epd1in54/mod.rs index d532106..e4f833f 100644 --- a/src/epd1in54/mod.rs +++ b/src/epd1in54/mod.rs @@ -94,7 +94,7 @@ where spi: &mut SPI, delay: &mut DELAY, ) -> Result<(), SPI::Error> { - self.interface.reset(delay); + self.interface.reset(delay, 10); // 3 Databytes: // A[7:0] diff --git a/src/epd1in54b/mod.rs b/src/epd1in54b/mod.rs index dd74a19..11fd985 100644 --- a/src/epd1in54b/mod.rs +++ b/src/epd1in54b/mod.rs @@ -52,7 +52,7 @@ where spi: &mut SPI, delay: &mut DELAY, ) -> Result<(), SPI::Error> { - self.interface.reset(delay); + self.interface.reset(delay, 10); // set the power settings self.interface diff --git a/src/epd2in13_v2/mod.rs b/src/epd2in13_v2/mod.rs index b0b53f8..b636c9f 100644 --- a/src/epd2in13_v2/mod.rs +++ b/src/epd2in13_v2/mod.rs @@ -71,7 +71,7 @@ where delay: &mut DELAY, ) -> Result<(), SPI::Error> { // HW reset - self.interface.reset(delay); + self.interface.reset(delay, 10); if self.refresh == RefreshLUT::QUICK { self.set_vcom_register(spi, (-9).vcom())?; diff --git a/src/epd2in9/mod.rs b/src/epd2in9/mod.rs index 6ccd551..46a9155 100644 --- a/src/epd2in9/mod.rs +++ b/src/epd2in9/mod.rs @@ -94,7 +94,7 @@ where spi: &mut SPI, delay: &mut DELAY, ) -> Result<(), SPI::Error> { - self.interface.reset(delay); + self.interface.reset(delay, 10); self.wait_until_idle(); diff --git a/src/epd2in9bc/mod.rs b/src/epd2in9bc/mod.rs index e3bc43d..9bab93b 100644 --- a/src/epd2in9bc/mod.rs +++ b/src/epd2in9bc/mod.rs @@ -111,7 +111,7 @@ where ) -> Result<(), SPI::Error> { // Values taken from datasheet and sample code - self.interface.reset(delay); + self.interface.reset(delay, 10); // start the booster self.interface diff --git a/src/epd4in2/mod.rs b/src/epd4in2/mod.rs index 582b409..8894132 100644 --- a/src/epd4in2/mod.rs +++ b/src/epd4in2/mod.rs @@ -105,7 +105,7 @@ where delay: &mut DELAY, ) -> Result<(), SPI::Error> { // reset the device - self.interface.reset(delay); + self.interface.reset(delay, 10); // set the power settings self.interface.cmd_with_data( diff --git a/src/epd7in5/mod.rs b/src/epd7in5/mod.rs index 2c6e76b..cdc142e 100644 --- a/src/epd7in5/mod.rs +++ b/src/epd7in5/mod.rs @@ -55,7 +55,7 @@ where delay: &mut DELAY, ) -> Result<(), SPI::Error> { // Reset the device - self.interface.reset(delay); + self.interface.reset(delay, 10); // Set the power settings self.cmd_with_data(spi, Command::POWER_SETTING, &[0x37, 0x00])?; diff --git a/src/epd7in5_v2/mod.rs b/src/epd7in5_v2/mod.rs index 89d5614..11e2ca3 100644 --- a/src/epd7in5_v2/mod.rs +++ b/src/epd7in5_v2/mod.rs @@ -59,7 +59,7 @@ where delay: &mut DELAY, ) -> Result<(), SPI::Error> { // Reset the device - self.interface.reset(delay); + self.interface.reset(delay, 4); // V2 procedure as described here: // https://github.com/waveshare/e-Paper/blob/master/RaspberryPi%26JetsonNano/python/lib/waveshare_epd/epd7in5bc_V2.py diff --git a/src/interface.rs b/src/interface.rs index 2f7c8ee..71c2cd8 100644 --- a/src/interface.rs +++ b/src/interface.rs @@ -159,13 +159,18 @@ where /// /// Often used to awake the module from deep sleep. See [EPD4in2::sleep()](EPD4in2::sleep()) /// - /// TODO: Takes at least 400ms of delay alone, can it be shortened? - pub(crate) fn reset>(&mut self, delay: &mut DELAY) { + /// The timing of keeping the reset pin low seems to be important and different per device. + /// Most displays seem to require keeping it low for 10ms, but the 7in5_v2 only seems to reset + /// properly with 4ms + pub(crate) fn reset>(&mut self, delay: &mut DELAY, duration: u8) { + let _ = self.rst.set_high(); + delay.delay_ms(10); + let _ = self.rst.set_low(); - //TODO: why 200ms? (besides being in the arduino version) - delay.delay_ms(200); + delay.delay_ms(duration); let _ = self.rst.set_high(); - //TODO: same as 3 lines above + //TODO: the upstream libraries always sleep for 200ms here + // 10ms works fine with just for the 7in5_v2 but this needs to be validated for other devices delay.delay_ms(200); } } From 674b88e3271bb89c8d2f9714ecc2261390a025fc Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 19 Oct 2020 16:51:41 +0200 Subject: [PATCH 2/2] use correct 7in5_v2 reset delay, not the b/c variant --- src/epd7in5_v2/mod.rs | 2 +- src/interface.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/epd7in5_v2/mod.rs b/src/epd7in5_v2/mod.rs index 11e2ca3..3c0fcc4 100644 --- a/src/epd7in5_v2/mod.rs +++ b/src/epd7in5_v2/mod.rs @@ -59,7 +59,7 @@ where delay: &mut DELAY, ) -> Result<(), SPI::Error> { // Reset the device - self.interface.reset(delay, 4); + self.interface.reset(delay, 2); // V2 procedure as described here: // https://github.com/waveshare/e-Paper/blob/master/RaspberryPi%26JetsonNano/python/lib/waveshare_epd/epd7in5bc_V2.py diff --git a/src/interface.rs b/src/interface.rs index 71c2cd8..58fbebb 100644 --- a/src/interface.rs +++ b/src/interface.rs @@ -161,7 +161,7 @@ where /// /// The timing of keeping the reset pin low seems to be important and different per device. /// Most displays seem to require keeping it low for 10ms, but the 7in5_v2 only seems to reset - /// properly with 4ms + /// properly with 2ms pub(crate) fn reset>(&mut self, delay: &mut DELAY, duration: u8) { let _ = self.rst.set_high(); delay.delay_ms(10);