1120509_ja-JP

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

1120509_ja-JP

1120509_ja-JP

MPL3115A2 - FIFO フィル モードのサンプル コード<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

ねえ皆さん

ここでは、NXP FRDM-KL25Zプラットフォーム FRDMSTBC-P3115シールドボード を使用して MPL3115A2 用に作成した例の1つを共有したいと思います。これは、組み込みFIFOバッファを使用して、I2Cインターフェースを介した割り込み手法を使用してFIFOから読み取られる圧力/温度または高度/温度データを収集する方法を示しています。FIFO は、最大サンプル数 (32) を格納するように設定されています。各サンプルは、3 バイトの圧力 (または高度) データと 2 バイトの温度データで構成されます。したがって、FIFOがいっぱいになり、FIFO割り込みがアサートされると、合計160バイト(32 x (3 + 2))がFIFOから読み取られます。

MPL3115A2は次のように初期化されます。

/******************************************************************************
* MPL3115A2 initialization function
******************************************************************************

void MPL3115A2_Init (void)
{
 I2C_WriteRegister(MPL3115A2_I2C_ADDRESS, CTRL_REG1, 0x04); // Reset all registers to POR values

 Pause(0x631); // ~1ms delay

 I2C_WriteRegister(MPL3115A2_I2C_ADDRESS, F_SETUP_REG, 0xA0); // FIFO Fill mode, 32 samples
 I2C_WriteRegister(MPL3115A2_I2C_ADDRESS, CTRL_REG4, 0x40); // Enable FIFO interrupt
 I2C_WriteRegister(MPL3115A2_I2C_ADDRESS, CTRL_REG5, 0x40); // Route the FIFO interrupt to INT1 - PTA5
 I2C_WriteRegister(MPL3115A2_I2C_ADDRESS, CTRL_REG2, 0x00); // Time step = ~1s
 I2C_WriteRegister(MPL3115A2_I2C_ADDRESS, CTRL_REG3, 0x00); // Push-pull, active low interrupt
 I2C_WriteRegister(MPL3115A2_I2C_ADDRESS, CTRL_REG1, 0x39); // Active barometer mode, OSR = 128
 //I2C_WriteRegister(MPL3115A2_I2C_ADDRESS, CTRL_REG1, 0xB9); // Active altimeter mode, OSR = 128
}‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

ISR では、割り込みフラグのみがクリアされ、FIFO_DataReady 変数は FIFO がいっぱいであることを示すように設定されます。

/******************************************************************************
* PORT A Interrupt handler
******************************************************************************/

void PORTA_IRQHandler()
{
 PORTA_PCR5 |= PORT_PCR_ISF_MASK;
 FIFO_DataReady = 1;
}‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

FIFO_DataReady変数が設定されると、STATUSレジスタ(0x00)が読み取られ、FIFO割り込みステータスビットがクリアされ、INT1ピンがディアサートされます。その後、FIFOは、OUT_P_MSBレジスタ(0x01)から始まる160バイト(5 x 32バイト)のバースト読み取りを使用して読み取られます。次に、生の圧力(または高度)と温度のデータが実際の値に変換されます。

if (FIFO_DataReady)
{
 FIFO_DataReady = 0;
 FIFO_Status = I2C_ReadRegister(MPL3115A2_I2C_ADDRESS, STATUS_REG); // Read the Status register to clear the FIFO interrupt status bit

 I2C_ReadMultiRegisters(MPL3115A2_I2C_ADDRESS, OUT_P_MSB_REG, 5*Watermark_Val, RawData); // Read the FIFO using a burst read

 for (i = 0; i < Watermark_Val; i++)
 {
 /* Get pressure, the 20-bit measurement in Pascals is comprised of an unsigned integer component and a fractional component.
 The unsigned 18-bit integer component is located in OUT_P_MSB, OUT_P_CSB and bits 7-6 of OUT_P_LSB.
 The fractional component is located in bits 5-4 of OUT_P_LSB. Bits 3-0 of OUT_P_LSB are not used. */

 Pressure[i] = (float) (((RawData[0 + i*5] << 16) | (RawData[1 + i*5] << 8) | (RawData[2 + i*5] & 0xC0)) >> 6) + (float) ((RawData[2 + i*5] & 0x30) >> 4) * 0.25;

 /* Get temperature, the 12-bit temperature measurement in °C is comprised of a signed integer component and a fractional component.
 The signed 8-bit integer component is located in OUT_T_MSB. The fractional component is located in bits 7-4 of OUT_T_LSB.
 Bits 3-0 of OUT_T_LSB are not used. */

 Temperature[i] = (float) ((short)((RawData[3 + i*5] << 8) | (RawData[4 + i*5] & 0xF0)) >> 4) * 0.0625;

 /* Get altitude, the 20-bit measurement in meters is comprised of a signed integer component and a fractional component.
 The signed 16-bit integer component is located in OUT_P_MSB and OUT_P_CSB.
 The fraction component is located in bits 7-4 of OUT_P_LSB. Bits 3-0 of OUT_P_LSB are not used */

 //Altitude[i] = (float) ((short) ((RawData[0 + i*5] << 8) | RawData[1 + i*5])) + (float) (RawData[2 + i*5] >> 4) * 0.0625;
 }
} ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

STATUSレジスタを読み取った後のINT1ピンのディアサート(0x00)。

Interrupt.JPG

この例では、自動集録の時間ステップは可能な限り低い値 (1s) に設定されているため、FIFO は ~32 秒ごとに読み取られます。

FIFO Flush.JPG

計算された値は、デバッグパースペクティブの右上にある「変数」ウィンドウで確認できます。

Values.JPG

添付されている完全なソースコードを見つけることができます。この簡単なサンプルプロジェクトに関して質問がある場合は、以下でお気軽にお問い合わせください。フィードバックや提案も大歓迎です。


よろしくお願いします。

Tomas

圧力センサ
タグ(1)
評価なし
バージョン履歴
最終更新日:
‎01-05-2026 09:55 AM
更新者: