Optimize twiMaster
This commit is contained in:
parent
514481ef7f
commit
baa7e1bf12
2 changed files with 23 additions and 24 deletions
|
@ -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,15 +199,7 @@ 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);
|
||||||
|
|
Loading…
Reference in a new issue