@@ -8,19 +8,20 @@ using namespace Pinetime::Drivers;
88// TODO use shortcut to automatically send STOP when receive LastTX, for example
99// TODO use DMA/IRQ
1010
11- TwiMaster::TwiMaster (const Modules module , const Parameters& params) : module {module }, params {params} {
11+ TwiMaster::TwiMaster (NRF_TWIM_Type* module , uint32_t frequency, uint8_t pinSda, uint8_t pinScl)
12+ : module {module }, frequency {frequency}, pinSda {pinSda}, pinScl {pinScl} {
1213 mutex = xSemaphoreCreateBinary ();
1314}
1415
1516void TwiMaster::ConfigurePins () const {
16- NRF_GPIO->PIN_CNF [params. pinScl ] =
17+ NRF_GPIO->PIN_CNF [pinScl] =
1718 (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) |
1819 (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
1920 (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) |
2021 (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) |
2122 (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
2223
23- NRF_GPIO->PIN_CNF [params. pinSda ] =
24+ NRF_GPIO->PIN_CNF [pinSda] =
2425 (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) |
2526 (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
2627 (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) |
@@ -31,28 +32,12 @@ void TwiMaster::ConfigurePins() const {
3132void TwiMaster::Init () {
3233 ConfigurePins ();
3334
34- switch (module ) {
35- case Modules::TWIM1:
36- twiBaseAddress = NRF_TWIM1;
37- break ;
38- default :
39- return ;
40- }
35+ twiBaseAddress = module ;
4136
42- switch (static_cast <Frequencies>(params.frequency )) {
43- case Frequencies::Khz100:
44- twiBaseAddress->FREQUENCY = TWIM_FREQUENCY_FREQUENCY_K100;
45- break ;
46- case Frequencies::Khz250:
47- twiBaseAddress->FREQUENCY = TWIM_FREQUENCY_FREQUENCY_K250;
48- break ;
49- case Frequencies::Khz400:
50- twiBaseAddress->FREQUENCY = TWIM_FREQUENCY_FREQUENCY_K400;
51- break ;
52- }
37+ twiBaseAddress->FREQUENCY = frequency;
5338
54- twiBaseAddress->PSEL .SCL = params. pinScl ;
55- twiBaseAddress->PSEL .SDA = params. pinSda ;
39+ twiBaseAddress->PSEL .SCL = pinScl;
40+ twiBaseAddress->PSEL .SDA = pinSda;
5641 twiBaseAddress->EVENTS_LASTRX = 0 ;
5742 twiBaseAddress->EVENTS_STOPPED = 0 ;
5843 twiBaseAddress->EVENTS_LASTTX = 0 ;
@@ -63,12 +48,6 @@ void TwiMaster::Init() {
6348
6449 twiBaseAddress->ENABLE = (TWIM_ENABLE_ENABLE_Enabled << TWIM_ENABLE_ENABLE_Pos);
6550
66- /* // IRQ
67- NVIC_ClearPendingIRQ(_IRQn);
68- NVIC_SetPriority(_IRQn, 2);
69- NVIC_EnableIRQ(_IRQn);
70- */
71-
7251 xSemaphoreGive (mutex);
7352}
7453
@@ -194,12 +173,10 @@ void TwiMaster::Wakeup() {
194173 * */
195174void TwiMaster::FixHwFreezed () {
196175 NRF_LOG_INFO (" I2C device frozen, reinitializing it!" );
197- // Disable I²C
176+
198177 uint32_t twi_state = NRF_TWI1->ENABLE ;
199- twiBaseAddress->ENABLE = TWIM_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
200178
201- ConfigurePins ();
179+ Sleep ();
202180
203- // Re-enable I²C
204181 twiBaseAddress->ENABLE = twi_state;
205182}
0 commit comments