皆さん、こんにちは。
2秒間オフの後に再びRFフィールドをオンにするとカチカチという音が鳴ります。私のソフトウェアにはlpuart/GPIO/CardDetectのタスクがあります。カードが検出されると、ブザーで2秒が発動しました(RFフィールドは2秒オフ)。以下は関連するコードです。
void CardDetect ( void * pParams)
{
phStatus_t st;
uint32_t dwStatus = 0;
uint16_t wStatus = 0;
uint16_t wTagsDetected;
uint8_t bAtqa[2] = {0x00};
phOsal_ThreadSecureStack(512);
/*ディスクループ設定を初期化します(1回のみ) */
st = phacDiscLoop_SetConfig(pDiscLoop, PHAC_DISCLOOP_CONFIG_TYPEA_DEVICE_LIMIT, 1);
st = phacDiscLoop_SetConfig(pDiscLoop, PHAC_DISCLOOP_CONFIG_BAIL_OUT,
PHAC_DISCLOOP_POS_BIT_MASK_A);
( 1)
{
DEBUG_PRINTF( "\r\n[CardDetect] 検出準備完了\r\n" );
/* ---- DiscLoop ポール(追加のRFトグルなし、ビープ音なし)---- */
do
{
st = phhalHw_FieldOff(pHal); CHECK_STATUS(st);
// st = phhalHw_Wait(pHal, PHHAL_HW_TIME_MICROSECONDS, 5100); CHECK_STATUS( st );
vTaskDelay(pdMS_TO_TICKS(100));
if (Buzzer_Status==2)
{
vTaskDelay(pdMS_TO_TICKS(2000));
}
else if (Buzzer_Status==1)
{
vTaskDelay(pdMS_TO_TICKS(200));
}
st = phacDiscLoop_SetConfig(pDiscLoop,
PHAC_DISCLOOP_CONFIG_NEXT_POLL_STATE、
PHAC_DISCLOOP_POLL_STATE_DETECTION); CHECK_STATUS(st);
st = phacDiscLoop_Run(pDiscLoop, PHAC_DISCLOOP_ENTRY_POINT_POLL );
/* カードなし:RFデューティサイクルを短縮するための短い遅延とビープ音 */
// if (( st & PH_ERR_MASK) != PHAC_DISCLOOP_DEVICE_ACTIVATED) {
// vTaskDelay(pdMS_TO_TICKS(200));
// }
} while ((st & PH_ERR_MASK) != PHAC_DISCLOOP_DEVICE_ACTIVATED);
/* ---- カードが検出されました ---- */
st = phacDiscLoop_GetConfig(pDiscLoop,
PHAC_DISCLOOP_CONFIG_TECH_DETECTED、&wTagsDetected);
if ((st & PH_ERR_MASK) != PH_ERR_SUCCESS) continue ;
if (!PHAC_DISCLOOP_CHECK_ANDMASK(wTagsDetected,
PHAC_DISCLOOP_POS_BIT_MASK_A))続行;
/* UID / ATQA / SAK を出力 */
DEBUG_PRINTF( "\r\n[CardDetect] UID: " );
phApp_Print_Buff(pDiscLoop-> sTypeATargetInfo . aTypeA_I3P3 [0]. aUid 、
pDiscLoop-> sTypeATargetInfo 。 aTypeA_I3P3 [0]。 bUidSize );
DEBUG_PRINTF( "\r\n[CardDetect] ATQA: " );
phApp_Print_Buff(pDiscLoop-> sTypeATargetInfo.aTypeA_I3P3 [ 0] .aAtqa , 2 );
DEBUG_PRINTF( "\r\n[CardDetect] SAK: 0x%02X\r\n" ,
pDiscLoop- > sTypeATargetInfo.aTypeA_I3P3 [0] .aSak ) ;
/* Bridge DiscLoop ?phNfcLib stateでカードプロセッシング機能が動作します */
Bridge_DiscLoopToNfcLib();
// DEBUG_PRINTF(" \r\n[CardDetect] ATQA=0x%04X SAK=0x%02X アクティブ化されたタイプ: %d (0x%08X)、UID len =%d \r\n",
// PeerInfo.uTi.uInitiator.tIso14443_3a.wAtqa,
// PeerInfo.uTi.uInitiator.tIso14443_3a.bSak,
// ( int )PeerInfo.dwActivatedType、
// (unsigned int )PeerInfo.dwActivatedType、
// PeerInfo.uTi.uInitiator.tIso14443_3a.bUidLength);
/* 検出されたカードを処理する */
switch(PeerInfo.dwActivatedType)
{
CASE E_PH_NFCLIB_MIFARE_CLASSIC_1K:
case E_PH_NFCLIB_MIFARE_CLASSIC_4K:
DEBUG_PRINTF(" \r\n[CardDetect] => MIFARE Classic \r\n");
dwStatus = NfcLib_MifareClassic_1k_Reference_app();
壊す;
ケースE_PH_NFCLIB_TYPEA_LAYER4:
DEBUG_PRINTF( " \r\n[CardDetect] => タイプ A レイヤー 4 (CPU カード) \r\n" );
dwStatus = NfcLib_Layer4TypeA_Reference_app();
壊す;
デフォルト:
DEBUG_PRINTF( " \r\n[CardDetect] => 不明なタイプ、処理されません \r\n" );
dwStatus = PH_NFCLIB_STATUS_INTERNAL_ERROR;
壊す;
}
/* phNfcLibの状態をリセットしてDiscLoopが再度ポーリングできるようにしてください */
gphNfcLib_State.bNfcLibState = eNfcLib_InitializedState ;
/* ---- カードの取り外しを待つ ---- */
DEBUG_PRINTF( "\r\n[CardDetect] カードを取り外してください\r\n" );
st = phhalHw_FieldReset(pHal); CHECK_STATUS(st);
/* UART経由でレポートカードのUIDと認証結果を送信 */
// st = phhalHw_FieldOff(pHal); CHECK_STATUS( st );
//vTaskDelay(pdMS_TO_TICKS(50));
report_card_result(( uint8_t )dwStatus);
vTaskDelay(pdMS_TO_TICKS(100));
do
{
wStatus = ( uint16_t )phpalI14443p3a_WakeUpA(
pDiscLoop-> pPal1443p3aDataParams 、
pDiscLoop- > sTypeATargetInfo.aTypeA_I3P3 [0] .aAtqa ) ;
if (wStatus != PH_ERR_SUCCESS)
壊す;
( void )phpalI14443p3a_HaltA(pDiscLoop-> pPal1443p3aDataParams );
//phhalHw_Wait(pHal, PHHAL_HW_TIME_MILLISECONDS, 50);
vTaskDelay(pdMS_TO_TICKS(50));
} while (1);
//while(Buzzer_Status);
}
}
void Buzzer_Burst_2S ( void )
{
uint32_t i;
ブザーの状態 = 2;
( i = 0; i < 2000; i++)
{
GPIO_PinWrite (DEMO_BUZZER_GPIO_PIN, 0U);
DelayUs(BUZZER_HALF_PERIOD_US);
GPIO_PinWrite (DEMO_BUZZER_GPIO_PIN, 1U);
DelayUs(BUZZER_HALF_PERIOD_US);
}
GPIO_PinWrite (DEMO_BUZZER_GPIO_PIN, 1U);
ブザーの状態 = 0;
}
void Led_Task ( void *pDataParams)
{
( void )pDataParams;
uint32_t tick = 0;
uint8_t led_on = 0;
uint8_t led_reset = 0;
uint32_t blink_ticks = 0;
card_status_t prev_status = CARD_STATUS_IDLE ;
uint32_t prev_seq = 0;
bool beep_done = false;
phOsal_ThreadSecureStack(512);
のために(;;)
{
if (g_card_status != prev_status || g_card_event_seq != prev_seq)
{
prev_status = g_card_status;
prev_seq = g_card_event_seq;
ティック = 0;
led_on = 0;
led_reset = 0;
blink_ticks = 0;
beep_done = false;
}
スイッチ (g_card_status)
{
ケースCARD_STATUS_ACCESS_GRANTED:
{
/* LED1 緑色 250ms 点滅 */
GPIO_PinWrite (LED2_GPIO_PIN, 1U);
if (++tick >= BLINK_FAST_TICKS) { tick = 0; led_on = !led_on; }
GPIO_PinWrite (LED1_GPIO_PIN, led_on ? 0U : 1U);
led_reset = 0;
/* リレーパルス:最初の100msはオン、その後オフ */
if (blink_ticks < 2)
GPIO_PinWrite (RELAY_GPIO_PIN, 0U);
そうでない場合、
GPIO_PinWrite (RELAY_GPIO_PIN, 1U);
/* 100ms間隔で150msのビープ音を2回鳴らします */
if (!beep_done)
{
beep_done = true;
ブザー音();
}
if (++blink_ticks >= SEQUENCE_TICKS)
g_card_status = CARD_STATUS_IDLE ;
壊す;
}
ケースCARD_STATUS_ACCESS_DENIED:
{
/* LED2 赤 500ms 点滅 */
GPIO_PinWrite (LED1_GPIO_PIN, 1U);
if (++tick >= BLINK_SLOW_TICKS) { tick = 0; led_on = !led_on; }
GPIO_PinWrite (LED2_GPIO_PIN, led_on ? 0U : 1U);
led_reset = 0;
/* 2秒ごとに1回のビープ音 */
if (!beep_done)
{
beep_done = true;
ブザーが2秒間鳴り続ける();
}
if (++blink_ticks >= SEQUENCE_TICKS)
g_card_status = CARD_STATUS_IDLE ;
壊す;
}
デフォルト:
/* アイドル状態: LED1点灯、LED2消灯、リレーオフ */
if (!led_reset)
{
led_reset = 1;
GPIO_PinWrite (LED1_GPIO_PIN, 0U);
GPIO_PinWrite (LED2_GPIO_PIN, 1U);
GPIO_PinWrite (RELAY_GPIO_PIN, 1U);
ティック = 0;
led_on = 0;
}
壊す;
}
vTaskDelay(pdMS_TO_TICKS(TICK_MS));
}
}
#define RX_TASK_PRIORITY 3
#define TX_TASK_PRIORITY 3
#define CARD_TASK_PRIO 2
#define UART_TASK_PRIO 3
#define LED_TASK_PRIO 4
なぜRFフィールドをオンにした後にカチカチという音がするのですか?そして、この問題をどうやって大事にすればいいのか。
ありがとうございます。
イーソン
こんにちは@wangea
お客様が直面されている問題は、オンラインデバッグが必要です。例えば、RFをオフにしてから再びオンにした後、アプリケーションはどのような動作をしましたか?クリック音はブザーの動作によるものかもしれません。適切なブレークポイントを設定し、オンラインデバッグを実行して問題を特定することをお勧めします。
こんにちは、NXPさん。
他に誰かが、なぜ2秒間オフ後にRFフィールドをオンにすると必ずカチカチという音がするのか説明できるでしょう。ブザーは2秒間一度だけ作動しましたが、その後はRFフィールドをオン・オフするたびにカチカチという音が鳴りました。
ありがとうございます。