diff --git a/eink_spi.hpp b/eink_spi.hpp index b3e22ae..34a74d8 100644 --- a/eink_spi.hpp +++ b/eink_spi.hpp @@ -15,17 +15,26 @@ namespace eink { template class Spi { + template static constexpr double calcClockDelay() { - // TODO: Verify static clock cycles - constexpr auto staticClockCycles = 10; - constexpr auto maxFrequency = F_CPU / staticClockCycles; + constexpr auto maxFrequency = F_CPU / StaticClockCycles; static_assert(Freq <= maxFrequency, "SPI frequency not achievable using selected clock speed"); constexpr auto staticDelay = (1.0 * 1000 * 1000 / maxFrequency); const auto delayUs = ((1.0 * 1000 * 1000 / Freq) - staticDelay) / 2; return (delayUs > 0 ? delayUs : 0); } + static constexpr double calcWriteClockDelay() + { + return calcClockDelay<8>(); + } + + static constexpr double calcReadClockDelay() + { + return calcClockDelay<5>(); + } + static constexpr auto THREE_WIRE_SPI = (DcPin == io::P::NONE); public: @@ -42,7 +51,7 @@ class Spi { sm_dc.dir(io::Dir::OUT); } - static void write(const word_t data, const bool command = true) + static void write(word_t data, const bool command = true) { constexpr auto numBits = THREE_WIRE_SPI ? 9 : 8; @@ -66,10 +75,10 @@ class Spi { sm_sda = data >> bitPos & 1; - _delay_us(DELAY_US); + _delay_us(WRITE_DELAY_US); sm_scl.toggle(); - _delay_us(DELAY_US); + _delay_us(WRITE_DELAY_US); sm_scl.toggle(); }, std::make_index_sequence{}); @@ -85,9 +94,9 @@ class Spi { if constexpr (THREE_WIRE_SPI) { sm_sda = true; - _delay_us(DELAY_US); + _delay_us(READ_DELAY_US); sm_scl.toggle(); - _delay_us(DELAY_US); + _delay_us(READ_DELAY_US); sm_scl.toggle(); } @@ -102,13 +111,13 @@ class Spi { [&](const auto idx) { constexpr auto bitPos = numBits - idx.value - 1; - _delay_us(DELAY_US); + _delay_us(READ_DELAY_US); sm_scl.toggle(); const auto receivedBit = sm_sda.read(); res |= word_t{receivedBit} << bitPos; - _delay_us(DELAY_US); + _delay_us(READ_DELAY_US); sm_scl.toggle(); }, std::make_index_sequence{}); @@ -129,7 +138,8 @@ class Spi { static io::Pin sm_cs; static io::Pin sm_dc; - static constexpr auto DELAY_US = calcClockDelay(); + static constexpr auto WRITE_DELAY_US = calcWriteClockDelay(); + static constexpr auto READ_DELAY_US = calcReadClockDelay(); static inline std::uint8_t disableInterrupts() {