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: CC1310 easylink Rx problem

Part Number: CC1310

Conditions

  1. SDK version: simplelink_cc13x0_sdk_1_50_00_08
  2. Use EasyLink_receive (Blocking call that waits for an Rx Packet) to receive data.
  3. The receiving timeout is 300 ms.
  4. The transmitter sends a data packet every 100 ms.
  5. There is no problem with the receiver at ambient temperature, and data can be received normally no matter how long it runs.

 

Abnormal conditions:

  1. If the receiver is placed in an environment where the temperature changes rapidly (the temperature is heating from -40 to +50 degree within about half an hour), the transmitter has been sending data at 100 ms interval, and the phenomenon will appear that there is no data received at the receiver and only to reset the receiver can be back to normal.
  2. Under the previous conditions, RF_yield (RfHandle) is added after the data is received every time. If the transmitter has been sending data, the reception has been normal under the same temperature change. However, if the transmitter does not send data, the receiver can only do nothing until time out (the serial port prints a string after the timeout). The chip does not respond during our tests, and it can only be restored to normal by resetting.
  3. Finally, tracing back to the RF_pendCmd function and delete the followings codes: Semaphore_pend (Semaphore_handle(&h->state.semSync), BIOS_WAIT_FOREVER). After tests, the data can be received normally under any conditions.

 

Questions:

  1. Why changes in high low temperature can cause the above phenomenon?
  2. Is there a problem with the third point solution of the abnormal conditions? Could it cause other abnormal problems? If this method is not appropriate, please provide a solution.
  • Without seeing your code, I am not sure, but my understanding is that you only turn off the RF Core (RF_yield) in the cases where you receive packets, and then everything is OK. IF you are not transmitting anything, hence not receiving anything, you never turn off the RF Core. Is that correct? If that is the case, this is why you stop receiving when the temperature changes. You will need to do a calibration of the synth at regular intervals if you are in an environment where temp changes. Doing an RF_yield forces the RF Core off, and the radio driver will make sure to call the CMD_FS (and the setup command) next time you want to enter RX (even if you do not call the CMD_FS from your application.

    You can either add a CMD_FS before every RX command, or you can turn the RF Core off between RX's, to make sure that the RF Driver do this for you.

    Siri

  • Hi Siri,

    Thanks for your quick feedback during your holiday.

    Under quick temperature change condition, even if there is no data to receive, the module still cannot work.

    The code is as follows:

    static void rfEasyLinkRxFnx(UArg arg0, UArg arg1)
    {
        EasyLink_Status status;
        EasyLink_RxPacket MyrxPacket = {0};
        uint8_t addrFilter[EASYLINK_MAX_ADDR_SIZE * EASYLINK_MAX_ADDR_FILTERS] = {0xaa};
        uint8_t put_str[40] = {0};
    
        Error_Block eb;
    
        Error_init(&eb);
    
        EasyLink_init(EasyLink_Phy_Custom);
        //EasyLink_setFrequency(868000000);
    
        EasyLink_enableRxAddrFilter(addrFilter, 1, 1);
    
        //MyrxPacket.absTime = RF_getCurrentTime();
        //MyrxPacket.absTime += EasyLink_ms_To_RadioTime(5);
        MyrxPacket.rxTimeout = EasyLink_ms_To_RadioTime(300);
    
        uart_printf("Device Start!\r\n",strlen("Device Start!\r\n"));
        while(1) {
            status = EasyLink_receive(&MyrxPacket);
            if (status == EasyLink_Status_Success) {
                RF_yield(appRfHandle);
            } else if (status == EasyLink_Status_Rx_Timeout) {
                uart_printf("rx timeout!\n",strlen("rx timeout!\n"));
                RF_yield(appRfHandle);
            } else {
                memset(put_str,0,20);
                sprintf(put_str,"status:%d\n",status);
                uart_printf(put_str,strlen(put_str));
            }
        }
    }

    Looking forward to hearing from you.

    Best regards.

    Sunny

  • With only part of your code I cannot get this to compile. For example, I am not sure what appRfHandle is and if you can do a yield from the application like you do.

    As I said, I suspect that the problem is that the synth does not lock due to temp change. If this is the problem, you should be able to verify this by looking at the EasyLink_cmdPropRxAdv.status in the EasyLink_receive function. It will most likely report PROP_ERROR_NO_FS.

    Instead of doing the RF_Yield, you can try to EasyLink_setFrequency(868000000); in the while(1) loop, before calling EasyLink_receive(&MyrxPacket)


    BR

    Siri