2017-07-01 42 views
1

Redbear Arduinoライブラリを使用してnRF52ベースのボード用のプログラムを作成しています。私のボードを効果的にBLEナノ2として扱います。nRF52のタイマ割り込み内でI2C割り込みを有効にするArduino

私はタイマーが毎ミリ秒ごとにティックする、例えば50msです。

このタイマーの中で、I2Cセンサーからデータを読み込み、その読みをバッファに追加したいと思います。

私は、デフォルトでは、タイマISRの内部で割り込みが無効になっていることを知っています。私は簡単にI2C割り込みを再び有効にし、センサーの読み込みを取得し、次に割り込みを再び無効にする方法を知りたいと思います。

センサの読み取り間隔は重要です。タイマーISRにフラグを設定したいだけではなく、フラグがチェックされるまでの時間がわからないため、

タイマーISR内からI2C割り込みを簡単にイネーブルにする方法を教えてもらえますか?

私が実験している:これらのいずれかと

__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); 

} 
+0

NVIC_GetPriorityとNVIC_SetPriorityを使用して、すべてのSPIx_TWIx_IRQn割り込みをTIMERx_IRQn優先順位のすべての優先順位よりも高くしたり低くしたりしてみました。 NVIC_GetPriorityは優先順位が設定されていることを確認していますが、まだ喜んではいません – Steve

答えて

0

、割り込みは皮質-M上のISRで無効にされるのではなく、割り込みが横取りNVIC(NVICの故に「ネスト」部分)に設定された優先順位に基づいています。これは、通常通りにI2C割り込みを有効にしてから、NVIC_SetPriority(IRQn, priority)を使用して優先度を設定するだけでよいことを意味します。

の順番はであるため、優先度0の場合は優先度が6になります。この場合、タイマーの割り込み優先度を1、I2C割り込みを0に設定します

+0

ありがとう、私はそのように想定していましたが、すべてのタイマーの優先度を2に設定しましたが、SPIx_TWIx割り込みはすべて1、 3. NVIC_GetEnableIRQを使って設定されていることを確認したところ、正しい値が報告されているように見えましたが、タイマーISRで使用するとI2Cコールがプログラムをハングアップさせています – Steve

+0

@Steveスケッチしかし、I2CコントローラのISRが欠落していることに気付きます。デフォルトでは、ArduinoコアはI2Cを処理するために割り込みを使用しているとは思わないので、割り込みを有効にするとデフォルトのハンドラにジャンプします。これはハングを説明する可能性が高いです。 –

+0

また、「タイマー」オブジェクトを「タイマー」として使用していることに気づきましたが、通常はCortex-MのすべてのSysTickタイマーを使用して実装されており、割り込み優先度は通常の「タイマー"NRF52で入手可能です。 –

関連する問題