Ich schreibe ein Programm für ein nRF52-basierten Board mit der Redbear Arduino Library. Effektive Behandlung meiner Platine als BLE Nano 2.Aktivieren I2C-Interrupt innerhalb Timer-Interrupt auf nRF52 Arduino
Ich habe einen Timer, der alle x Millisekunden tickt, zum Beispiel 50ms.
In diesem Timer möchte ich Daten von einem I2C-Sensor lesen und den Messwert in einen Puffer hinzufügen.
Ich bin mir bewusst, dass Interrupts standardmäßig innerhalb des Timers ISR deaktiviert sind. Ich würde gerne wissen, wie ich den I2C-Interrupt kurz wieder aktivieren kann und den Sensor lesen und dann die Interrupts wieder deaktivieren kann.
Das Intervall zwischen den Sensormesswerten ist kritisch, und ich möchte nicht nur ein Flag im Timer-ISR setzen, da ich nicht weiß, wie lange es dauern wird, bis dieses Flag überprüft wird.
Kann mir bitte jemand sagen, wie man die I2C Interrupts innerhalb einer Timer ISR kurz aktiviert?
ich mit experimentiert habe:
__disable_irq();
__enable_irq();
NVIC_EnableIRQ(SPI0_TWI0_IRQn);
NRF_TWI0->INTENSET = 1;
Keine Freude mit dieser kommt, verstehe ich, dass einige von ihnen nur von bestimmten Orten in der Software arbeiten, funktioniert so nicht richtig in einer 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);
}
Ich habe auch versucht, mit NVIC_GetPriority und NVIC_SetPriority alle Interrupts SPIx_TWIx_IRQn sowohl höher als auch niedriger als die Priorität aller TIMERx_IRQn Prioritäten zu machen. NVIC_GetPriority bestätigt, dass die Prioritäten gesetzt wurden, aber immer noch keine Freude – Steve