Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob

PSoC 4 IDAC のワンタイム オートキャリブレーション - KBA229095- Community Translated (JA)

PSoC 4 IDAC のワンタイム オートキャリブレーション - KBA229095- Community Translated (JA)

ChaitanyaV_61
Employee
Employee
50 questions asked 25 likes received 25 sign-ins

Community Translated by  MoTa_728816          Version: **

質問:

PSoC® 4 で、プログラムの書込み時に一度だけ IDAC のオートキャリブレーション値を取得して以降の電源投入時にはその値を使用することは可能でしょうか

回答:

はい、基板毎に手動の設定をしなくてもオートキャリブレーションの値を取得して、その同じ値をアプリケーションに使用することは可能です。これはブートローダ (bootloader) 機構を使用して実装可能です

パワーオンリセット時、ブートローダは最初に起動します。ブートローダファームウェアはオートキャリブレーションアルゴリズムを実行してCapSense_GetParam API を使用して取得した IDAC の値をフラッシュに保存することが可能です。オートキャリブレーションが完了後、ブートローダブル (Bootloadable) アプリケーションをロードすることが可能です。その後、ブートローダブルアプリケーションは保存されたデータを読んで CapSense_SetParam API を使用して IDAC の値を設定します。どちらの API (CapSense_GetParam CapSense_SetParam) CapSense_Start() 実行後にコールする必要があります

もしブートローダプロジェクトが新しいアプリケーションをロードする必要が無い場合には、コミュニケーションコンポーネントを Custom Interface に設定して、以降の5個のブートローダ関数を定義する必要があります

  1. void CyBtldrCommStart(void)
  2. void CyBtldrCommStop(void)
  3. void CyBtldrCommReset(void)
  4. cystatus CyBtldrCommWrite(uint8* buffer, uint16 size, uint16* count, uint8 timeOut)
  5. cystatus CyBtldrCommRead (uint8* buffer, uint16 size, uint16* count, uint8 timeOut)

pastedImage_6.png

1.: ートローダ - Communication component の選

しかし、ブートローダブルブラッシュ領域に書込むことは、ブートローダのチェックサム検証エラーを引き起こす可能性があります。そのため、IDAC の値はチェックサム除外領域 (checksum exclude region) と呼ばれるセクションに置く必要があります。これはブータブルアプリケーションのメモリ領域の最後に置かれるチェックサム検証に使用されない領域です。チェックサム除外領域のサイズは ートローダブル (Bootloadable) コンポーネントのコンフィグレーションウィンドウで設定可能です。サイズはフラッシュ列 (row) の境界に合うように設定することが推奨されます。フラッシュ列のサイズは当該デバイスのデータシートをご参照ください。このように設定することで、チェックサム除外領域の更新をコードとデータ領域の変更なしに行うことが可能になります

IDAC の値は 8-bit の値です。そのため、センサーの数とフラッシュ列サイズに合わせて、 3のように適切なチェックサム除外領域のサイズをブートローダブルコンポーネントコンフグレーションで設定する必要があります

pastedImage_11.png

pastedImage_12.png

3: ートローダブル - チェックサム除外領域のサイズ設定

これにより GUI で設定されたチェックサム除外領域がリンカスクリプトに反映されます。ブートローダプロジェクトで IDAC の値を書き込みますが、そのデータはブートローダブルアプリケーションで確保されたチェックサム除外領域に書込む必要がりますCY_FLASH_NUMBER_ROWS マクロはフラッシュの全列の数を返します;この値からチェックサム除外領域に予約された数+1 を引く必要があります (最後の列はメタデータですので、変更されないようにしなくてはいけません。そのため追加の一列分のフラッシュを残しておく必要があります)

ータは CySysFlashWriteRow API を使用してフラッシュに書き込むことができ、これは正常終了時には  CY_SYS_FLASH_SUCCESS を返します。

ートローダのコードスニペット

// IDACの値を書くための列(row)を定義する。この場合、2列予約する必要があるので、

// ータは最後から3列目の列から書き始める必要がある。

        #define CY_TEST_FLASH_ROW (CY_FLASH_NUMBER_ROWS - 3u)

     //IDAC の値を取得するコ

        uint32 val;

    

CapSense_1_GetParam(CapSense_1_LINEARSLIDER0_IDAC_MOD0_PARAM_ID, &val);

data[0] = (uint8) val;

CapSense_1_GetParam(CapSense_1_LINEARSLIDER0_SNS0_IDAC_COMP0_PARAM_ID, &val);

data[1] = (uint8)val;

     //ータをフラッシュに書き込

returnValue = CySysFlashWriteRow(CY_TEST_FLASH_ROW, data);

        if (returnValue != CY_SYS_FLASH_SUCCESS)

{

while(1);

}

     //ートローダブルアプリケーションを起動す

Bootloader_1_Start();

ートローダブルプロジェクトからは、フラッシュのデータはポインタを使用して直接参照が可能です

     //フラッシュ列(row)の絶対アドレ

        #define CY_TEST_FLASH_ADDR (CY_TEST_FLASH_ROW * CY_FLASH_SIZEOF_ROW)

        for (i = 0u; i < 2; i++)

{        

source = (*((uint8 *) (CY_TEST_FLASH_ADDR + i)));

/* ースの値と書込み先の値が等しいことを確認する。*/

data = source;

}

    

imodval = data[0];

CapSense_1_SetParam(CapSense_1_LINEARSLIDER0_IDAC_MOD0_PARAM_ID, imodval);

icompval = data[1];

CapSense_1_SetParam(CapSense_1_LINEARSLIDER0_SNS0_IDAC_COMP0_PARAM_ID, icompval);

参考文献

Bootloader component data sheet

Introduction to Bootloaders

Bootloader code examples for PSoC® 3/PSoC 4/ PSoC 4BLE/PSoC 5LP

0 件の賞賛
324 件の閲覧回数
寄稿者