ねえ皆さん
このドキュメントでは、最近リリースされた FRDMSTBC-A8471 開発ボード と NXP FXLS8471Q 3 軸リニア加速度計用に作成した簡単なベアメタルの例コードについて説明します。このボードはほとんどの NXP Freedom開発ボード と互換性があり、最も人気のあるものの1つである FRDM-KL25Zを使用することにしました。FreeMASTERツールは、SPIインターフェースを介した割り込み手法を使用して、FXLS8471Qから読み取られた加速度データを視覚化するために使用されます。このボードをサポートする Sensor Toolboxソフトウェア と Intelligent Sensing Framework (ISF)については説明しません。
このサンプルでは、次のことを示しています。
1. MKL25Z128 MCU(主にSPIおよびPORTモジュール)の初期化。
2. SPIデータの書き込みおよび読み取り操作。
3.最高の解像度を達成するためのFXLS8471Qの初期化。
4. AN4069に基づく簡単なオフセットキャリブレーション。
5. 割り込み技術を使用してデータを読み出して出力します。
6. レジスタ0x01 – 0x06からの出力値をg単位の実際の加速度値に変換します。
7. FreeMASTERツールでの出力値の視覚化。
1.FRDMSTBC-A8471/FRDM-KL25Zの回路図と下の画像からわかるように、SPI信号はKL25Z MCUのSPI0モジュールにルーティングされ、INT1出力はPTD4ピンに接続されています。PTD0ピン(チップセレクト)はSPI0モジュールによって自動的に制御されないため、汎用出力として構成されています。FXLS8471QのINT1出力はプッシュプルアクティブLOW出力として構成されているため、対応するPTD4ピン構成は、立ち下がりエッジに割り込みを持つGPIOです。コア/システム・クロック周波数は20.97MHz、SPIクロックは524.25kHzです。
したがって、MCUは次のように構成されます。
/******************************************************************************
*MCU初期化機能
******************************************************************************/
void MCU_Init(void)
{
SPI0モジュールの初期化
SIM_SCGC4 |= SIM_SCGC4_SPI0_MASK;SPI0モジュールへのクロックをオンにします
SIM_SCGC5 |= SIM_SCGC5_PORTD_MASK;ポートDモジュールへのクロックをオンにします
PORTD_PCR1 = PORT_PCR_MUX(0x02);PTD1ピンはSPI0 CLKライン
PORTD_PCR2 = PORT_PCR_MUX(0x02);PTD2ピンはSPI0 MOSIライン
PORTD_PCR3 = PORT_PCR_MUX(0x02);PTD3ピンはSPI0 MISOライン
PORTD_PCR0 = PORT_PCR_MUX(0x01);PTD0ピンはGPIOとして構成されています(CSラインは手動で駆動されます)
GPIOD_PSOR |= GPIO_PSOR_PTSO(0x01);PTD0 = 1 (CS 非アクティブ)
GPIOD_PDDR |= GPIO_PDDR_PDD(0x01);PTD0ピンはGPIO出力
SPI0_C1 = SPI_C1_SPE_MASK | SPI_C1_MSTR_MASK; // Enable SPI0 module, master mode
SPI0_BR = SPI_BR_SPPR(0x04) |SPI_BR_SPR(0x02);ボーレート = バスクロック / ((SPPR+1) * 2^(SPR+1)) = 20970000 / ((4+1) * 2^(2+1)) = 524.25 kHz
PTD4ピン(FXLS8471QのINT1に接続)を立ち下がりエッジ割り込み用に構成します
PORTD_PCR4 |= (0|PORT_PCR_ISF_MASK|割り込みフラグをクリアする
PORT_PCR_MUX(0x1)|PTD4 は GPIO として構成されています
PORT_PCR_IRQC(0xA));PTD4 は立ち下がりエッジ割り込み用に構成されています
NVICでPORTD割り込みを有効にする
NVIC_ICPR |= 1 << ((INT_PORTD - 16)%32);
NVIC_ISER |= 1 << ((INT_PORTD - 16)%32);
}
2. FXLS8471Qは「モード0」SPIプロトコルを使用しており、クロック信号の非アクティブ状態がローであり、データはクロック信号のリーディングエッジでキャプチャされ、立ち下がりエッジで変更されます。
CSピンの立下がりエッジでSPI通信が開始されます。書き込み操作は、R/Wビットに1を送信することで開始されます。次に、8ビットレジスタアドレスADDR[7:0]が1番目と2番目のシリアル化されたバイトにエンコードされます。書き込まれるデータは、シリアル化された 3 番目のバイトから開始されます。ビットの順序は次のとおりです。
Byte 0: R/W, ADDR[6], ADDR[5], ADDR[4], ADDR[3], ADDR[2], ADDR[1], ADDR[0]
Byte 1: ADDR[7], X, X, X, X, X, X, X
Byte 2: DATA[7], DATA[6], DATA[5], DATA[4], DATA[3], DATA[2], DATA[1], DATA[0]
CSピンの立ち上がりエッジはSPI通信を停止します。
以下は、CTRL_REG1(0x3A)に値0x3Dを書き込む書き込み操作です。
同様に、読み取り操作は、R/W ビットに 0 を送信することによって開始されます。次に、8ビットレジスタアドレスADDR[7:0]が1番目と2番目のシリアル化されたバイトにエンコードされます。データはMISOピンから読み取られます(MSBが最初に)。
以下のスクリーンショットは、WHO_AM_Iレジスタ(0x0D)から正しい値0x6Aを読み取る読み取り操作を示しています。
複数の読み取り操作は、1 つの読み取りと同様に実行されます。ただし、8 つの SCLK サイクルの倍数でバイトが読み取られる点が異なります。レジスタ アドレスは自動インクリメントされるため、次のクロック エッジの 8 つごとに次のレジスタの MSB がラッチされます。
レジスタ0x01から0x06への6バイトのバースト読み出しを以下に示します。また、加速度出力データを読み出すことでINT1ピンが自動的にクリアされる様子も示しています。
3. ダイナミックレンジを±2gに設定し、最高の分解能を実現するために、LNOISEビットを設定し、最低のODR(1.56Hz)と高分解能モードを選択します(詳細は AN4075を参照)。DRDY割り込みはイネーブルされ、プッシュプルのアクティブロー出力に設定されたINT1割り込みピンに送られます。
/******************************************************************************
* FXLS8471Q初期化機能
******************************************************************************/
void FXLS8471Q_Init (void)
{
FXLS8471Q_WriteRegister(CTRL_REG2, 0x02);高解像度モード
FXLS8471Q_WriteRegister(CTRL_REG3、0x00);プッシュプル、アクティブ LOW 割り込み
FXLS8471Q_WriteRegister(CTRL_REG4、0x01);DRDY割り込みをイネーブルにする
FXLS8471Q_WriteRegister(CTRL_REG5、0x01);INT1-PTD4 にルーティングされた DRDY 割り込み
FXLS8471Q_WriteRegister(CTRL_REG1、0x3D);ODR=1.56Hz、ノイズの低減、アクティブモード
}
4. AN4069 に準拠したシンプルなオフセットキャリブレーション方法が実装されています 。
/******************************************************************************
*簡単な加速度計オフセットキャリブレーション
******************************************************************************/
ボイドFXLS8471Q_Calibrate(ボイド)
{
符号なし文字 reg_val = 0;
while (!reg_val) // 最初のデータ セットを待ちます
{
reg_val = FXLS8471Q_ReadRegister(STATUS_REG) & 0x08;
}
FXLS8471Q_ReadMultiRegisters(OUT_X_MSB_REG、6、AccData);データ出力レジスタの読み取り 0x01-0x06
Xout_14_bit = ((ショート) (AccData[0]<<8 |AccData[1])) >> 2;14ビットX軸出力値を計算
Yout_14_bit = ((ショート) (AccData[2]<<8 |AccData[3])) >> 2;14ビットY軸出力値を計算
Zout_14_bit = ((ショート) (AccData[4]<<8 |AccData[5])) >> 2;14ビットZ軸出力値を計算
Xオフセット= Xout_14_bit / 8 *(-1);X軸オフセット補正値を計算
Yオフセット= Yout_14_bit / 8 *(-1);Y 軸オフセット補正値の計算
Zoffset = (Zout_14_bit - SENSITIVITY_2G) / 8 * (-1);Z 軸オフセット補正値の計算
FXLS8471Q_WriteRegister(CTRL_REG1、0x00);オフセットレジスタへの書き込みを可能にするスタンバイモード
FXLS8471Q_WriteRegister(OFF_X_REG, Xoffset);
FXLS8471Q_WriteRegister(OFF_Y_REG, Yoffset);
FXLS8471Q_WriteRegister(OFF_Z_REG, Zoffset);
FXLS8471Q_WriteRegister(CTRL_REG1、0x3D);ODR=1.56Hz、ノイズの低減、アクティブモード
}
5. ISR では、割り込みフラグのみがクリアされ、新しいデータの到着を示すために DataReady 変数が設定されます。
/******************************************************************************
* PORT D 割り込みハンドラ
******************************************************************************/
void PORTD_IRQHandler()
{
PORTD_PCR4 |= PORT_PCR_ISF_MASK;割り込みフラグをクリアする
データレディ = 1;
}
6.加速度計レジスタ0x01〜0x06からの出力値は、最初に符号付き14ビット値に変換され、その後、g単位の実際の値に変換されます。
if (DataReady) // 新しいデータセットは準備ができていますか?
{
データレディ = 0;
FXLS8471Q_ReadMultiRegisters(OUT_X_MSB_REG、6、AccData);データ出力レジスタの読み取り 0x01-0x06
Xout_14_bit = ((ショート) (AccData[0]<<8 |AccData[1])) >> 2;14ビットX軸出力値を計算
Yout_14_bit = ((ショート) (AccData[2]<<8 |AccData[3])) >> 2;14ビットY軸出力値を計算
Zout_14_bit = ((ショート) (AccData[4]<<8 |AccData[5])) >> 2;14ビットZ軸出力値を計算
Xout_g = ((float) Xout_14_bit) / SENSITIVITY_2G;X 軸の出力値を g で計算します
Yout_g = ((浮動小数点数) Yout_14_bit) / SENSITIVITY_2G;Y 軸の出力値を g で計算します
Zout_g = ((float) Zout_14_bit) / SENSITIVITY_2G;Z 軸の出力値を g で計算します
}
7. 計算された値は、Debugパースペクティブの右上にある「Variables」ウィンドウまたはFreeMASTERアプリケーションで確認できます。FreeMASTERプロジェクトを開いて実行するには、 FreeMASTER 2.0アプリケーション と FreeMASTER通信ドライバをインストールしてください。
MCUのv10.6のCWで書かれた完全なソースコード(FreeMASTERプロジェクトを含む)が添付されています。
この簡単なアプリケーションについて質問がある場合は、以下からお気軽にお問い合わせください。フィードバックや提案も大歓迎です。
よろしくお願いします。
Tomas