802.15.4 送信結果イベント
ここでは 802.15.4 の MAC 層の API を用いた、送信後の処理を解説します。送信後には CCA エラーや ACK 受信が出来なかったエラーが伝達されます。
送信処理については、各サンプルを参照してください。
802.15.4 ではイベント処理に AppQApi を用いますが、送信要求を MAC 層に出して送信処理が終った後にMAC層のイベントとして送信結果が伝達されます。
以下にソースコードの概要を記述します。
- AppColdStartのwhile(1)ループとしてアプリケーションが記述されます。
- vAppProcess() がアプリケーションの処理ですが、何らかのタイミングで vTransmitRF() 関数により送信要求が行われたとします。
- 送信要求発行後、結果が得られるまでは数msかかります。
- 結果が得られた時点で、Mcps イベントが伝達され、以下の例では、vProcessIncomingMcps() で処理されています。成功時は MAC_ENUM_SUCCESS を、ACK が来ない場合は MAC_ENUM_NO_ACK を受け取ります。
PUBLIC void AppColdStart(void)
{
(void)u32AHI_Init();
(void)u32AppQApiInit(NULL, NULL, NULL);
...
while(1) {
vCheckEventQueues(); // イベント処理
vAppProcess(); // アプリケーション処理
vAHI_CpuDoze(); // DOZE 処理
}
}
// AppQApi によるイベント処理
PRIVATE void vCheckEventQueues(void)
{
MAC_MlmeDcfmInd_s *psMlmeInd;
MAC_McpsDcfmInd_s *psMcpsInd;
AppQApiHwInd_s *psAHI_Ind;
/* Check for anything on the MCPS upward queue */
do
{
psMcpsInd = psAppQApiReadMcpsInd();
if (psMcpsInd != NULL)
{
vProcessIncomingMcps(psMcpsInd);
vAppQApiReturnMcpsIndBuffer(psMcpsInd);
}
} while (psMcpsInd != NULL);
/* ... 以下省略 Mlme とハード割り込み */
}
PRIVATE void vAppProcess() {
...
vTransmitRF(...); // 無線パケットを送信
...
}
PRIVATE void vProcessIncomingMcps(MAC_McpsDcfmInd_s *psMcpsInd)
{
if (psMcpsInd->u8Type == MAC_MCPS_DCFM_DATA)
{
switch(psMcpsInd->uParam.sDcfmData.u8Status) {
case MAC_ENUM_SUCCESS:
// 送信成功 (ACK を受信)
break;
case MAC_ENUM_NO_ACK:
// 送信失敗 (ACK が来ない)
break;
case MAC_ENUM_CHANNEL_ACCESS_FAILURE:
// CCA失敗
default:
// その他の要因
break;
}
}
}
PRIVATE void vTransmitRF(...) {
...
sMcpsReqRsp.uParam.sReqData.sFrame.u8TxOptions = 0x01;
// 0x00 なら ACK 無し送信。
...
vAppApiMcpsRequest(&sMcpsReqRsp, &sMcpsSyncCfm); // 送信要求
}