This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC1310: EasyLink_transmitCcaAsync with ACK implementation issue

Part Number: CC1310
Other Parts Discussed in Thread: SYSBIOS

Hi everybody!

In my application I start with the example rfWasConcentrator and rfWsnNode with Easylink. 

I modify the example to use EasyLink_transmitCcaAsync in my application. But after few successful transmition the code stuck in 

ti_sysbios_family_arm_m3_Hwi_excHandler__I) 

I am using the SimpleLink SDK 4.10.1.01 . My code is below.

static void sendAgesCompletePacket(struct AgesSensorCompletePacket sensorPacket, uint8_t maxNumberOfRetries, uint32_t ackTimeoutMs)
{
    /* Set destination address in EasyLink API */
    currentRadioOperation.easyLinkTxPacket.dstAddr[0] = RADIO_CONCENTRATOR_ADDRESS;
    
    currentRadioOperation.easyLinkTxPacket.payload[0] = agesSensorC.header.sourceAddress;
    currentRadioOperation.easyLinkTxPacket.payload[1] = agesSensorC.header.packetType;
    currentRadioOperation.easyLinkTxPacket.payload[2] = agesSensorC.id_monitor;
    currentRadioOperation.easyLinkTxPacket.payload[3] = agesSensorC.status;
    currentRadioOperation.easyLinkTxPacket.payload[4] = (agesSensorC.pulse & 0xFF00) >> 8;
    currentRadioOperation.easyLinkTxPacket.payload[5] = (agesSensorC.pulse & 0xFF);
    currentRadioOperation.easyLinkTxPacket.payload[6] = agesSensorC.bat;
    currentRadioOperation.easyLinkTxPacket.payload[7] = (agesSensorC.life & 0xFF00) >> 8;
    currentRadioOperation.easyLinkTxPacket.payload[8] = (agesSensorC.life & 0xFF);

    currentRadioOperation.easyLinkTxPacket.len = sizeof(struct AgesSensorCompletePacket);

    /* Setup retries */
    currentRadioOperation.maxNumberOfRetries = maxNumberOfRetries;
    currentRadioOperation.ackTimeoutMs = ackTimeoutMs;
    currentRadioOperation.retriesDone = 0;
    EasyLink_setCtrl(EasyLink_Ctrl_AsyncRx_TimeOut, EasyLink_ms_To_RadioTime(ackTimeoutMs));


    /* Send packet  */
       EasyLink_transmitCcaAsync(&currentRadioOperation.easyLinkTxPacket, lbtDoneCb);
       Semaphore_pend(lbtDoneSem, BIOS_WAIT_FOREVER);
}

void lbtDoneCb(EasyLink_Status status)
{
    if (status == EasyLink_Status_Success)
    {     
        EasyLink_receiveAsync(rxDoneCallback, 0);

    }
    else if (status == EasyLink_Status_Busy_Error)
    {       
        Event_post(radioOperationEventHandle, RADIO_EVENT_ACK_TIMEOUT);
    }
    else
    {       
        Event_post(radioOperationEventHandle, RADIO_EVENT_ACK_TIMEOUT);
    }

    Semaphore_post(lbtDoneSem);
}

static void rxDoneCallback(EasyLink_RxPacket * rxPacket, EasyLink_Status status)
{
    struct PacketHeader* packetHeader;
    
   
    if (status == EasyLink_Status_Success)
    {
        /* Check the payload header */
        packetHeader = (struct PacketHeader*)rxPacket->payload;

        /* Check if this is an ACK packet */
        if (packetHeader->packetType == RADIO_PACKET_TYPE_ACK_PACKET)
        {
            /* Signal ACK packet received */
            Event_post(radioOperationEventHandle, RADIO_EVENT_DATA_ACK_RECEIVED);
        }
        else
        {            
            Event_post(radioOperationEventHandle, RADIO_EVENT_ACK_TIMEOUT);
        }
    }
    /* did the Rx timeout */
    else if(status == EasyLink_Status_Rx_Timeout)
    {
        /* Post a RADIO_EVENT_ACK_TIMEOUT event */
        Event_post(radioOperationEventHandle, RADIO_EVENT_ACK_TIMEOUT);
    }
    else
    {
        /* The Ack reception may have been corrupted causing an error.
         * Treat this as a timeout
         */
        Event_post(radioOperationEventHandle, RADIO_EVENT_ACK_TIMEOUT);

    }  
}