@@ -9,21 +9,25 @@ using namespace Pinetime::Drivers;
99// TODO use DMA/IRQ
1010
1111TwiMaster::TwiMaster (const Modules module , const Parameters& params) : module {module }, params {params} {
12+ mutex = xSemaphoreCreateBinary ();
1213}
1314
14- void TwiMaster::Init () {
15- if (mutex == nullptr )
16- mutex = xSemaphoreCreateBinary ();
17-
15+ void TwiMaster::ConfigurePins () const {
1816 NRF_GPIO->PIN_CNF [params.pinScl ] =
19- ((uint32_t ) GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) | ((uint32_t ) GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
20- ((uint32_t ) GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) | ((uint32_t ) GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) |
21- ((uint32_t ) GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
17+ (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) |
18+ (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
19+ (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) |
20+ (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
2221
2322 NRF_GPIO->PIN_CNF [params.pinSda ] =
24- ((uint32_t ) GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) | ((uint32_t ) GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
25- ((uint32_t ) GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) | ((uint32_t ) GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) |
26- ((uint32_t ) GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
23+ (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) |
24+ (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
25+ (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) |
26+ (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
27+ }
28+
29+ void TwiMaster::Init () {
30+ ConfigurePins ();
2731
2832 switch (module ) {
2933 case Modules::TWIM1:
@@ -179,7 +183,8 @@ void TwiMaster::Sleep() {
179183}
180184
181185void TwiMaster::Wakeup () {
182- Init ();
186+ ConfigurePins ();
187+ twiBaseAddress->ENABLE = (TWIM_ENABLE_ENABLE_Enabled << TWIM_ENABLE_ENABLE_Pos);
183188 NRF_LOG_INFO (" [TWIMASTER] Wakeup" );
184189}
185190
@@ -194,16 +199,8 @@ void TwiMaster::FixHwFreezed() {
194199 uint32_t twi_state = NRF_TWI1->ENABLE ;
195200 twiBaseAddress->ENABLE = TWIM_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
196201
197- NRF_GPIO->PIN_CNF [params.pinScl ] =
198- ((uint32_t ) GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) | ((uint32_t ) GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
199- ((uint32_t ) GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) | ((uint32_t ) GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) |
200- ((uint32_t ) GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
201-
202- NRF_GPIO->PIN_CNF [params.pinSda ] =
203- ((uint32_t ) GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) | ((uint32_t ) GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
204- ((uint32_t ) GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) | ((uint32_t ) GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) |
205- ((uint32_t ) GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
202+ ConfigurePins ();
206203
207204 // Re-enable I²C
208205 twiBaseAddress->ENABLE = twi_state;
209- }
206+ }
0 commit comments