MCUXpresso SDKペリフェラルドライバーの使い方~其の二~

MCUXpresso SDKペリフェラルドライバーの使い方~其の二~

今回は、前回に引き続きMCUXpresso SDKのペリフェラルドライバの使い方第2弾で、GUIツールであるMCUXpresso Config Toolを使用したペリフェラルドライバーの組み込み方をご紹介します。

このConfig Toolを使用するとめっちゃドライバーを組み込むのが楽になります。ほとんどソースコードを編集することなく、GUIだけで設定して、あとのコードは自動生成されるので、開発の時短に最適です。

それでは行ってみましょう!

やりたいこと

今回は、SDKのペリフェラルドライバーのSPIマスターをMCUXpresso Config Toolを使用して組み込んでみたいと思います。前回の~其の一~と同じ設定をGUIツールであるコンフィグツールを使って設定するというものです。

前回の其の一は、こちら

設定

SPIマスター
ポーリングモード
10MHzボーレート

事前準備

使用するボード

FRDM-K64F

前回同様少々古いですが、同じボードを使用します。

MCUXpresso IDEとSDKのダウンロード

まずは、前回と同様にMCUXpresso IDEとSDKをそれぞれダウンロードして、インストールしておきます。SDKのインストールは、このサイトでも何度も紹介していますので、参考にしてください。

MCUXpresso Config Toolのワークフロー

  1. SDK Components Managerでドライバーを組み込む
  2. Config Toolでの設定
    • Config Toolでピン構成
    • SPIドライバーのモード設定をする
  3. 初期化コードの挿入
  4. データ送信用バッファとトランスファー構造体の用意
  5. (ハンドルの作成)
  6. ドライバのAPIでデータを送信

出来上がったコード

ソースコードは~其の一~で紹介したものと同じですが、ドライバーの初期化処理がperipherals.h/peripheral.c、pin_mux.cの記述部分が追加されています。

今回は、出来上がったコードよりも、Config Toolでのドライバーの組み込み方が本質なので、コードの全体の紹介はしません。

では、細かくConfig Toolでの設定方法を見ていきましょう。

1. SDK Components Managerでドライバーを組み込む

これは、前回同様SDKコンポーネンツマネージャから希望のドライバーを選んで組み込んでおく必要があります。

Manage SDK Componentsをクリック
Manage SDK Componentsをクリック
ドライバーの選択
ドライバーの選択

2.Config Toolでの設定

次に、いよいよConfig Toolを起動して設定していきます。

MCUXpresso Config Toolの起動方法

まず、起動方法はIDE画面左側にあるプロジェクトビューペイン右上端にある緑の「X」マークの逆三角をクリックして、「Open Pins」をクリックするとConfig Toolが起動します。

Config Toolの起動
Config Toolの起動

ピン設定

次にSPIに使用するピン設定をします。

使用するピンは、FRDMボードのArduinoのピンヘッダJ2コネクタの6番、8番、12番を使用します。10番はSPI入力を使用する場合に使用します。

ピンコンフィグ設定
ピンコンフィグ設定

上の図のような画面(Pinsタブ)にピンリストがずら~~っと並んでいると思います。その中から使用するSPIピンを選んでいきます。

まず、Pinsタブ画面は右の方にスライダーでスクロールさせることができます。

そして、右の方に「SPI」の項目があり、この縦のリストにSPIに設定できるピンがリストアップされています。

SPIに設定できるピンは複数のピンで利用できるのですが、今回FRDMのピンヘッダJ2コネクタで利用できるピンを選びたいので、この中から選択します。でも、どれがJ2ピンで利用できるピンなのか分からないと思います。

そこで、もう一度一番左までスクロールして戻ってみると「Label」という項目があり、この項目にJ2[6]やJ2[8]、J2[12]と書かれているものがJ2コネクタです。角かっこの中の数字がピン番号です。

そして、もう一度SPIの項目までスクロールして、「SPI0_SCK」、「SPI0_PCS」、「SPI0_SOUT」をクリックすると緑色になり、そのピンでSPIが使用できるようになります。さらにPin Nameも自動的にSPIのピン名に変更されます。SPI0_SINも選択しておきます。あとで、Warningが出るので使用しなくても設定しておきます。もちろん設定しなくてもいいです。

Routed Pins設定

次に、「Routed Pins」という下にある画面に移動し、以下の項目を編集します。

  • Label Name
  • Identifier
  • Direction

「Label Name」は好きなラベルに変更することができるので、後ろに/SPI_SCKなどのように変更しておいてあげると分かりやすいです。

「Identifier」は、ソースコードで実際に判別できるように好きな名前に変更できます。ここで編集した名前が「Code Review」で確認できます。

最後に各ピンの入出力(OutputかInput)を設定してあげます。

Routed Pins設定
Routed Pins設定

ピンの設定は、基本的にはこれだけです。

GPIOやI2Cなどの設定では、Pullup(Down)や初期状態(初期状態でHighかLow)やピン割り込みの設定をしたりすることが可能です。

今回はSPIでその他の機能は使用しないので、これだけの設定でOKです。

Code Review

最後に、Code Reviewを確認してみます。ピン設定したものがPin_mux.cのソースに追加されている(これから更新すると適用される)と思います。

確かに、「Identifier」で設定した名前が使用されていますね。

コードレビュー画面
コードレビュー画面

SPIドライバーのモード設定をする

次に、SPIのマスターモードや今回設定するポーリング設定、ボーレートを変更してConfigToolでの設定は終わりです。

まず、左側ペインの「Components」タブにある「Peripheral Drivers」をクリックしてSPIを追加します。

SPIコンポーネンツの追加
SPIコンポーネンツの追加
SPIを選択してOK
SPIを選択してOK

「peripheral overview」タブにある「Peripherals」項目を有効にする必要があります。

peripheralsを有効にしておく
peripheralsを有効にしておく

SPIの設定画面が現れるので、必要な項目の設定を変更します。今回は、モードをポーリングにしてボーレートを10MHzに変更します。そして、CS(チップセレクト)信号がピン設定で選択したCSになっているか確認して設定完了です。

SPIの設定
SPIの設定

はい、これだけです。設定したい項目のプルダウンリストから選ぶだけだし、数値設定は直接入力して設定します。

コード自動生成

最後に、設定した内容をプロジェクトに反映してConfig Toolでの設定は完了です。

プロジェクトへの反映
プロジェクトへの反映

自動生成されたコード

自動生成されて追加されたコードは、こちら

自動生成後に追加されたコード
自動生成後に追加されたコード

ファイル:peripherals.c

const dspi_master_config_t SPI0_config = {
  .whichCtar = kDSPI_Ctar0,
  .ctarConfig = {
    .baudRate = 100000,
    .bitsPerFrame = 8,
    .cpol = kDSPI_ClockPolarityActiveHigh,
    .cpha = kDSPI_ClockPhaseFirstEdge,
    .direction = kDSPI_MsbFirst,
    .pcsToSckDelayInNanoSec = 1000,
    .lastSckToPcsDelayInNanoSec = 1000,
    .betweenTransferDelayInNanoSec = 1000
  },
  .whichPcs = kDSPI_Pcs0,
  .pcsActiveHighOrLow = kDSPI_PcsActiveLow,
  .enableContinuousSCK = false,
  .enableRxFifoOverWrite = false,
  .enableModifiedTimingFormat = false,
  .samplePoint = kDSPI_SckToSin0Clock
};

static void SPI0_init(void) {
  /* Initialization function */
  DSPI_MasterInit(SPI0_PERIPHERAL, &SPI0_config, SPI0_CLK_FREQ);
}

/***********************************************************************************************************************
 * Initialization functions
 **********************************************************************************************************************/
void BOARD_InitPeripherals(void)
{
  /* Initialize components */
  SPI0_init();
}

/***********************************************************************************************************************
 * BOARD_InitBootPeripherals function
 **********************************************************************************************************************/
void BOARD_InitBootPeripherals(void)
{
  BOARD_InitPeripherals();
}

ファイル:pin_mux.c

void BOARD_InitPins(void)
{
    /* Port A Clock Gate Control: Clock enabled */
    CLOCK_EnableClock(kCLOCK_PortA);
    /* Port B Clock Gate Control: Clock enabled */
    CLOCK_EnableClock(kCLOCK_PortB);
    /* Port D Clock Gate Control: Clock enabled */
    CLOCK_EnableClock(kCLOCK_PortD);

    gpio_pin_config_t LED_RED_config = {
        .pinDirection = kGPIO_DigitalOutput,
        .outputLogic = 0U
    };
    /* Initialize GPIO functionality on pin PTB22 (pin 68)  */
    GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_PIN, &LED_RED_config);

    /* PORTA2 (pin 36) is configured as TRACE_SWO */
    PORT_SetPinMux(PORTA, 2U, kPORT_MuxAlt7);

    PORTA->PCR[2] = ((PORTA->PCR[2] &
                      /* Mask bits to zero which are setting */
                      (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_DSE_MASK | PORT_PCR_ISF_MASK)))

                     /* Pull Select: Internal pulldown resistor is enabled on the corresponding pin, if the
                      * corresponding PE field is set. */
                     | PORT_PCR_PS(kPORT_PullDown)

                     /* Pull Enable: Internal pullup or pulldown resistor is not enabled on the corresponding pin. */
                     | PORT_PCR_PE(kPORT_PullDisable)

                     /* Drive Strength Enable: Low drive strength is configured on the corresponding pin, if pin
                      * is configured as a digital output. */
                     | PORT_PCR_DSE(kPORT_LowDriveStrength));

    /* PORTB22 (pin 68) is configured as PTB22 */
    PORT_SetPinMux(BOARD_LED_RED_PORT, BOARD_LED_RED_PIN, kPORT_MuxAsGpio);

    /* PORTD0 (pin 93) is configured as SPI0_PCS0 */
    PORT_SetPinMux(BOARD_SPI_PCS_PORT, BOARD_SPI_PCS_PIN, kPORT_MuxAlt2);

    /* PORTD1 (pin 94) is configured as SPI0_SCK */
    PORT_SetPinMux(BOARD_SPI_SCK_PORT, BOARD_SPI_SCK_PIN, kPORT_MuxAlt2);

    /* PORTD2 (pin 95) is configured as SPI0_SOUT */
    PORT_SetPinMux(BOARD_SPI_SOUT_PORT, BOARD_SPI_SOUT_PIN, kPORT_MuxAlt2);

    /* PORTD3 (pin 96) is configured as SPI0_SIN */
    PORT_SetPinMux(BOARD_SPI_SIN_PORT, BOARD_SPI_SIN_PIN, kPORT_MuxAlt2);
}

3.初期化コードの挿入

Config Toolで設定した内容は、pin_mux.cにピンコンフィグ、そしてboardフォルダに新しくperipherals.cとperipherals.hが追加されています。peripherals.cのCソースには、SPIコンフィグの構造体や初期化コードが収められています。

ただし!この初期化コードはメイン関数で実行されていないので、初期化コードを実行してあげる必要があります。

void BOARD_InitBootPeripherals(void)
void BOARD_InitPeripherals(void)

この2つのどちらかをコールしてあげれば、SPIは既に使える状態になっています。
こんな感じです。

int main(void)
{
    /* Board pin init */
    BOARD_InitPins();
    BOARD_InitBootClocks();
    BOARD_InitBootPeripherals();

4.転送用のデータバッファとトランスファー構造体の準備

ここからは、~其の一~で紹介したので、割愛します。

最後に

今回は、MCUXpresso Config Toolの使い方を紹介しました。ソースコードでペリフェラルドライバーを組み込むよりも、GUIによって直観的に設定することができるので、マニュアルやデータシートを睨みながらコーディングすることがなくとても便利ですよね。

さらに、使用するピンのコンフィグもグラフィカルなパッケージのピン配を確認しながら、またピンのマルチプレックスも簡単に選択することができるようになっているので、初心者にはおすすめなツールです。もちろん、上級者も時短の目的で使用しているので、初級者から上級者までおすすめできるツールです。