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(¤tRadioOperation.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); } }