Я пишу программу для платы на базе nRF52 с использованием библиотеки Redbear Arduino. Эффективное обращение с моей доской как с BLE Nano 2.
У меня есть таймер, который отсчитывает каждые x миллисекунд, например 50 мс.
Внутри этого таймера я хотел бы прочитать данные с датчика I2C и добавить их в буфер.
Я знаю, что по умолчанию, когда внутри таймера ISR, прерывания отключены. Я хотел бы знать, как ненадолго повторно включить прерывание I2C и получить показания датчика, а затем снова отключить прерывания.
Интервал между показаниями датчиков имеет решающее значение, и я не хочу просто устанавливать флаг в таймере ISR, поскольку я не знаю, сколько времени пройдет до того, как этот флаг будет проверен.
Пожалуйста, может кто-нибудь проинструктировать меня, как кратко включить прерывания I2C из таймера ISR?
Я экспериментировал с:
__disable_irq();
__enable_irq();
NVIC_EnableIRQ(SPI0_TWI0_IRQn);
NRF_TWI0->INTENSET = 1;
Никакого удовольствия от любого из них, я понимаю, что некоторые из них работают только из определенных мест в программном обеспечении, поэтому не работали правильно в ISR.
void setup() {
// put your setup code here, to run once
NVIC_SetPriority (TIMER0_IRQn, 2);
NVIC_SetPriority (TIMER1_IRQn, 2);
NVIC_SetPriority (TIMER2_IRQn, 2);
NVIC_SetPriority (SPI0_TWI0_IRQn, 3);
NVIC_SetPriority (SPI1_TWI1_IRQn, 3);
Serial.begin(9600);
Serial.println("Start ");
Serial.print("Priority of TWI0: ");
Serial.println(NVIC_GetPriority (SPI0_TWI0_IRQn));
Serial.println(NVIC_GetPriority (SPI1_TWI1_IRQn));
Serial.print("Priority of Ticker: ");
Serial.println(NVIC_GetPriority (TIMER0_IRQn));
Serial.println(NVIC_GetPriority (TIMER1_IRQn));
Serial.println(NVIC_GetPriority (TIMER2_IRQn));
Wire.begin();
__disable_irq();
__enable_irq();
ticker1s.attach(task_handle, 1);
Wire.requestFrom(0x02,6);
}
void task_handle(void) {
__enable_irq();
Serial.println("Task handle ");
Serial.println("-IRQ enable status: ");
Serial.println(NVIC_GetEnableIRQ(SPI0_TWI0_IRQn));
Serial.println(NVIC_GetEnableIRQ(SPI1_TWI1_IRQn));
NVIC_EnableIRQ(SPI0_TWI0_IRQn);
NRF_TWI0->INTENSET = 1;
NVIC_EnableIRQ(SPI1_TWI1_IRQn);
NRF_TWI1->INTENSET = 1;
Serial.println("-IRQ enable status: ");
Serial.println(NVIC_GetEnableIRQ (SPI0_TWI0_IRQn));
Serial.println(NVIC_GetEnableIRQ (SPI1_TWI1_IRQn));
delay(1000);
Wire.requestFrom(0x02,6);
}