PSoC 4 IDAC のワンタイム オートキャリブレーション - KBA229095- Community Translated (JA)
- RSS フィードを購読する
- 新着としてマーク
- 既読としてマーク
- ブックマーク
- 購読
- 印刷用ページ
- 不適切なコンテンツを報告
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個のブートローダ関数を定義する必要があります。
- void CyBtldrCommStart(void)
- void CyBtldrCommStop(void)
- void CyBtldrCommReset(void)
- cystatus CyBtldrCommWrite(uint8* buffer, uint16 size, uint16* count, uint8 timeOut)
- cystatus CyBtldrCommRead (uint8* buffer, uint16 size, uint16* count, uint8 timeOut)
図 1.: ブートローダ - Communication component の選択
しかし、ブートローダブルブラッシュ領域に書込むことは、ブートローダのチェックサム検証エラーを引き起こす可能性があります。そのため、IDAC の値は“チェックサム除外領域 (checksum exclude region)” と呼ばれるセクションに置く必要があります。これはブータブルアプリケーションのメモリ領域の最後に置かれるチェックサム検証に使用されない領域です。チェックサム除外領域のサイズは ブートローダブル (Bootloadable) コンポーネントのコンフィグレーションウィンドウで設定可能です。サイズはフラッシュ列 (row) の境界に合うように設定することが推奨されます。フラッシュ列のサイズは当該デバイスのデータシートをご参照ください。このように設定することで、チェックサム除外領域の更新をコードとデータ領域の変更なしに行うことが可能になります。
IDAC の値は 8-bit の値です。そのため、センサーの数とフラッシュ列サイズに合わせて、図 3のように適切なチェックサム除外領域のサイズをブートローダブルコンポーネントコンフグレーションで設定する必要があります。
図 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
Bootloader code examples for PSoC® 3/PSoC 4/ PSoC 4BLE/PSoC 5LP