diff options
| author | JF002 <JF002@users.noreply.github.com> | 2020-10-27 18:48:39 (GMT) |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-10-27 18:48:39 (GMT) |
| commit | 45e65b66b11b6b8533b225067ce4c2a4b5eac653 (patch) | |
| tree | dbf1b486ad1493f11d5a5485c231a85309db02fc /src/drivers/TwiMaster.h | |
| parent | e888b92b1f2e239223a31e21f0f6bfdc9f2e6a9b (diff) | |
| parent | 8a8c8aa86312840a84533318bff92fdb6c42b8de (diff) | |
Merge pull request #111 from JF002/fix-twi-hang
Workaround for TWI driver freeze
Diffstat (limited to 'src/drivers/TwiMaster.h')
| -rw-r--r-- | src/drivers/TwiMaster.h | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/drivers/TwiMaster.h b/src/drivers/TwiMaster.h index 9b6b507..52e3909 100644 --- a/src/drivers/TwiMaster.h +++ b/src/drivers/TwiMaster.h @@ -10,6 +10,7 @@ namespace Pinetime { public: enum class Modules { TWIM1 }; enum class Frequencies {Khz100, Khz250, Khz400}; + enum class ErrorCodes {NoError, TransactionFailed}; struct Parameters { uint32_t frequency; uint8_t pinSda; @@ -19,15 +20,19 @@ namespace Pinetime { TwiMaster(const Modules module, const Parameters& params); void Init(); - void Read(uint8_t deviceAddress, uint8_t registerAddress, uint8_t* buffer, size_t size); - void Write(uint8_t deviceAddress, uint8_t registerAddress, const uint8_t* data, size_t size); + ErrorCodes Read(uint8_t deviceAddress, uint8_t registerAddress, uint8_t* buffer, size_t size); + ErrorCodes Write(uint8_t deviceAddress, uint8_t registerAddress, const uint8_t* data, size_t size); void Sleep(); void Wakeup(); private: - void Read(uint8_t deviceAddress, uint8_t* buffer, size_t size, bool stop); - void Write(uint8_t deviceAddress, const uint8_t* data, size_t size, bool stop); + ErrorCodes ReadWithRetry(uint8_t deviceAddress, uint8_t registerAddress, uint8_t* buffer, size_t size); + ErrorCodes WriteWithRetry(uint8_t deviceAddress, uint8_t registerAddress, const uint8_t* data, size_t size); + + ErrorCodes Read(uint8_t deviceAddress, uint8_t* buffer, size_t size, bool stop); + ErrorCodes Write(uint8_t deviceAddress, const uint8_t* data, size_t size, bool stop); + void FixHwFreezed(); NRF_TWIM_Type* twiBaseAddress; SemaphoreHandle_t mutex; const Modules module; @@ -35,7 +40,8 @@ namespace Pinetime { static constexpr uint8_t maxDataSize{8}; static constexpr uint8_t registerSize{1}; uint8_t internalBuffer[maxDataSize + registerSize]; - + uint32_t txStartedCycleCount = 0; + static constexpr uint32_t HwFreezedDelay{161000}; }; } }
\ No newline at end of file |
