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..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); + 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 2f7c8ee..58fbebb 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 2ms + 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); } }