mirror of
https://github.com/InfiniTimeOrg/InfiniTime.git
synced 2024-12-18 23:21:48 +03:00
Optimize twiMaster
This commit is contained in:
parent
514481ef7f
commit
baa7e1bf12
@ -9,21 +9,25 @@ using namespace Pinetime::Drivers;
|
|||||||
// TODO use DMA/IRQ
|
// TODO use DMA/IRQ
|
||||||
|
|
||||||
TwiMaster::TwiMaster(const Modules module, const Parameters& params) : module {module}, params {params} {
|
TwiMaster::TwiMaster(const Modules module, const Parameters& params) : module {module}, params {params} {
|
||||||
|
mutex = xSemaphoreCreateBinary();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TwiMaster::ConfigurePins() const {
|
||||||
|
NRF_GPIO->PIN_CNF[params.pinScl] =
|
||||||
|
(GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) |
|
||||||
|
(GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
|
||||||
|
(GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) |
|
||||||
|
(GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
|
||||||
|
|
||||||
|
NRF_GPIO->PIN_CNF[params.pinSda] =
|
||||||
|
(GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) |
|
||||||
|
(GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
|
||||||
|
(GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) |
|
||||||
|
(GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TwiMaster::Init() {
|
void TwiMaster::Init() {
|
||||||
if(mutex == nullptr)
|
ConfigurePins();
|
||||||
mutex = xSemaphoreCreateBinary();
|
|
||||||
|
|
||||||
NRF_GPIO->PIN_CNF[params.pinScl] =
|
|
||||||
((uint32_t) GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) | ((uint32_t) GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
|
|
||||||
((uint32_t) GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) | ((uint32_t) GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) |
|
|
||||||
((uint32_t) GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
|
|
||||||
|
|
||||||
NRF_GPIO->PIN_CNF[params.pinSda] =
|
|
||||||
((uint32_t) GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) | ((uint32_t) GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
|
|
||||||
((uint32_t) GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) | ((uint32_t) GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) |
|
|
||||||
((uint32_t) GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
|
|
||||||
|
|
||||||
switch (module) {
|
switch (module) {
|
||||||
case Modules::TWIM1:
|
case Modules::TWIM1:
|
||||||
@ -179,7 +183,8 @@ void TwiMaster::Sleep() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TwiMaster::Wakeup() {
|
void TwiMaster::Wakeup() {
|
||||||
Init();
|
ConfigurePins();
|
||||||
|
twiBaseAddress->ENABLE = (TWIM_ENABLE_ENABLE_Enabled << TWIM_ENABLE_ENABLE_Pos);
|
||||||
NRF_LOG_INFO("[TWIMASTER] Wakeup");
|
NRF_LOG_INFO("[TWIMASTER] Wakeup");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -194,16 +199,8 @@ void TwiMaster::FixHwFreezed() {
|
|||||||
uint32_t twi_state = NRF_TWI1->ENABLE;
|
uint32_t twi_state = NRF_TWI1->ENABLE;
|
||||||
twiBaseAddress->ENABLE = TWIM_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
|
twiBaseAddress->ENABLE = TWIM_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
|
||||||
|
|
||||||
NRF_GPIO->PIN_CNF[params.pinScl] =
|
ConfigurePins();
|
||||||
((uint32_t) GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) | ((uint32_t) GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
|
|
||||||
((uint32_t) GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) | ((uint32_t) GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) |
|
|
||||||
((uint32_t) GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
|
|
||||||
|
|
||||||
NRF_GPIO->PIN_CNF[params.pinSda] =
|
|
||||||
((uint32_t) GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) | ((uint32_t) GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
|
|
||||||
((uint32_t) GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) | ((uint32_t) GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) |
|
|
||||||
((uint32_t) GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
|
|
||||||
|
|
||||||
// Re-enable I²C
|
// Re-enable I²C
|
||||||
twiBaseAddress->ENABLE = twi_state;
|
twiBaseAddress->ENABLE = twi_state;
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,8 @@ namespace Pinetime {
|
|||||||
void Sleep();
|
void Sleep();
|
||||||
void Wakeup();
|
void Wakeup();
|
||||||
|
|
||||||
|
void ConfigurePins() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ErrorCodes Read(uint8_t deviceAddress, uint8_t* buffer, size_t size, bool stop);
|
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);
|
ErrorCodes Write(uint8_t deviceAddress, const uint8_t* data, size_t size, bool stop);
|
||||||
@ -41,4 +43,4 @@ namespace Pinetime {
|
|||||||
static constexpr uint32_t HwFreezedDelay {161000};
|
static constexpr uint32_t HwFreezedDelay {161000};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user