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_Transmit's 对于数据包的要求

Guru**** 2482225 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1205280/cc1310-easylink_transmit-s-requirements-for-data-packets

器件型号:CC1310

大家好、

EasyLink_Transmit 函数的实现方式如下:

EasyLink_Status EasyLink_transmit(EasyLink_TxPacket *txPacket)
{
RF_CmdHandle cmdHdl;
uint8_t *pu8Data;

EasyLink_Status status = EasyLink_Status_Tx_Error;

if ( (!configured) || suspended)
{
return EasyLink_Status_Config_Error;
}
if (txPacket->len > EASYLINK_MAX_DATA_LENGTH)
{
return EasyLink_Status_Param_Error;
}
//Check and take the busyMutex
if (Semaphore_pend(busyMutex, 0) == false)
{
return EasyLink_Status_Busy_Error;
}

/* Transmit */
pTransmitDataEntry = (rfc_dataEntryGeneral_t*)txBuffer;
pTransmitDataEntry->length = txPacket->len + NUM_APPENDED_BYTES_TX;
pTransmitDataEntry->status = DATA_ENTRY_PENDING;
pTransmitDataEntry->pNextEntry = (uint8_t*)pTransmitDataEntry; // Circle buffer.

dataTxQueue.pCurrEntry = (uint8_t*)pTransmitDataEntry;
dataTxQueue.pLastEntry = NULL;
/* txPaket copy and send. */
pu8Data = &pTransmitDataEntry->data;
memcpy(pu8Data, &txPacket->payload, txPacket->len);

memcpy(&EasyLink_cmdTx, &RF_cmdTxHS, sizeof(RF_cmdTxHS));
EasyLink_cmdTx.pQueue = &dataTxQueue;
EasyLink_cmdTx.startTrigger.triggerType = TRIG_NOW;
EasyLink_cmdTx.startTrigger.pastTrig = 1;
EasyLink_cmdTx.startTime = 0;
// RF_cmdTxHS.startTime = time;

RF_EventMask result = RF_runCmd(rfHandle, (RF_Op*)&EasyLink_cmdTx, RF_PriorityHigh, 0, 0);

// cmdHdl = RF_postCmd(rfHandle, (RF_Op*)&RF_cmdTxHS, RF_PriorityNormal, &tx_callback, 0);
/* Wait for Command to complete */
// RF_EventMask result = RF_pendCmd(rfHandle, cmdHdl, EASYLINK_RF_EVENT_MASK);

if (result & RF_EventLastCmdDone)
{
status = EasyLink_Status_Success;
}

//Release the busyMutex
Semaphore_post(busyMutex);


return status;
}

其中、EasyLink_MAX_DATA_length 为256。

txPacket[0]= 0xCC

txPacket[1]= 0x77、

txPacket[2]= 16的倍数,小于或等于250

在测试过程中, 我发现如果 txPacket[3-5] 同时为0 (即 txPacket[3]= 0x0、txPacket[4]= 0x0、txPacket[5]= 0x0), EasyLink_Transmit 将无法执行。

EasyLink_Transmit 对 txPacket 有什么要求?

谢谢。

Katherine

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    txPacket 的结构在 EasyLink.h 中定义、如下所示:

    //! \brief Structure for the TX Packet
    typedef struct
    {
    uint8_t dstAddr[8]; //!< Destination address
    uint32_t absTime; //!< Absolute time to Tx packet (0 for immediate)
    //!< Layer will use last SeqNum used + 1
    
    uint8_t len; //!< Payload Length
    uint8_t payload[EASYLINK_MAX_DATA_LENGTH]; //!< Payload
    } EasyLink_TxPacket;

    不能手动覆盖数据包中的任何字段 ,只能通过 define 和有效负载更改长度,通过 txPacket.payload  

    如果在使用 EasyLink_Transmit 函数时遇到问题、您需要提供一个在 LP 上运行的示例、该示例说明了您看到的故障。

    Siri.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    为了提高带宽利用率、我们修改了 EasyLink_TxPacket 的结构、如下所示:

    typedef _RFC_struct 结构体

    uint16_t len;
    uint8_t payload[EasyLink_MAX_DATA_length];
    }_RFC_STRUCT_ATTR EasyLink_TxPacket;

    在参考代码的 EasyLink_TxPacket 结构中、是否对 dstAddr 的值有任何要求?

    Katherine

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果开始弄乱整个 API 所基于的数据包结构、对于需要在 EasyLink 中更改什么、我们没有任何指导。

    我强烈建议您不要更改 EasyLink 实现中的任何内容。  

    如果你这样做,你需要弄清楚自己有什么后果,还有什么需要改变,而不是"打破"任何东西。

    如果 EasyLink 的数据包格式不适合您的应用需求、您只需直接基于 proAPI (CMD_PROP_RX 和 CMD_PROP_TX、或高级命令)来创建应用。 这比尝试更改 EasyLink API 要容易得多。

    Siri.