ねえ皆さん
ここでは、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)。
この例では、自動集録の時間ステップは可能な限り低い値 (1s) に設定されているため、FIFO は ~32 秒ごとに読み取られます。
計算された値は、デバッグパースペクティブの右上にある「変数」ウィンドウで確認できます。
添付されている完全なソースコードを見つけることができます。この簡単なサンプルプロジェクトに関して質問がある場合は、以下でお気軽にお問い合わせください。フィードバックや提案も大歓迎です。
よろしくお願いします。
Tomas