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.

[参考译文] LP-EM-CC1354P10:如何使用高级数据包格式发送超过 255 字节的数据

Guru**** 2556060 points
Other Parts Discussed in Thread: LP-EM-CC1354P10, SYSCONFIG

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1567614/lp-em-cc1354p10-how-to-send-more-than-255-bytes-with-advanced-packet-format

部件号:LP-EM-CC1354P10
主题: SysConfig 中讨论的其他器件

工具/软件:

您好:

我正在尝试发送和接收数据 超过 255 字节 使用的 LP-EM-CC1354P10 CMD_PROP_TX_ADV CMD_PROP_RX_ADV 处于高级数据包模式

我使用 wakeonradiTX、wakeonradiTX 示例。

我提到了这个 TI E2E 主题关于更大的数据包,但没有收到.
https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/993297/cc1312r-transmission-of-data-which-is-1000-byte-length-stops-after-4-minute/3669128?tisearch=e2e-sitesearch&keymatch=big%252525252525252520payloads#3669128

我附加了我的 发送器 接收器 代码片段。
您能检查一下并告诉我我出了什么问题吗?

发送器:

/***** 包括*** /
#include

/* POSIX 头文件*/
#include
#include

/* TI-RTOS 头文件*/
#include
#include
#include

#include
#include DeviceFamily_constructPath (driverlib/cpu.h)

//*板头文件*/
#include “ti_drivers_config.h"</s>“

/*射频设置*/
#include

/***** 定义*** /
/*无线电唤醒配置*/
#define WOR_wakeups_PER_second 2.

/* TX 随机有效载荷字节数*/
#define PAYLOAD_LENGTH 300

/* WOR 示例配置定义*/
#define WOR_PREAMPLE_TIME_RAT_TICKS (x)\
((uint32_t)(4000000*(1.0f/(x)))

/* TX 任务栈大小和优先级*/
#define TX_TASK_STACK_SIZE 1024
#define TX_TASK_PRIORITY 2.

/* TX 数据包有效载荷(长度+1 到时基故障长度字节)和序列号*/
静态 uint8_t packet[payload_length +2];

/*射频驱动程序对象和句柄*/
静态 RF_Object rfObject;
静态 RF_Handle rfHandle;

/* TX 信标*/
静态 sem_t txSemaphore;


/***** 函数定义*** /
/* CONFIG_GPIO_BTN1 的 GPIO 中断回调函数。 */
void buttonCallbackFunction (uint_least8_t index){
CPUdelay ((uint32_t)((48000000/3)*0.050f));
if(!GPIO_READ (INDEX)){
SEM_POST (&txSemaphore);
}
}
void *mainThread (void *arg0)

内部视网膜;
display_init();
GPIO_setConfig (CONFIG_GPIO_GLED、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
GPIO_setConfig (CONFIG_GPIO_BTN1、GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_FALLING);
GPIO_setCallback (CONFIG_GPIO_BTN1、buttonCallbackFunction);
GPIO_enableInt (CONFIG_GPIO_BTN1);
RETC = SEM_INIT (&txSemaphore、0、0);
如果 (retc !=0){
while (1);
}
RF_Params rfParams;
RF_Params_init (&rfParams);
RF_cmdPropTxAdv.pktLen = payload_length + 2;/*+2(对于长度字节)*/
RF_cmdPropTxAdv.ppkt =数据包;
RF_cmdPropTxAdv.Pretime = WOR_PREAMPLE_TIME_RAT_TICKS (WOR_wakeups_PER_second);
RF_cmdPropTxAdv.startTriggerType = TRIG_NOW;
RF_cmdPropTxAdv.startTrigger.pastTrig = 0x1;
RF_cmdPropTxAdv.condition.rule = 1;
RF_cmdPropTxAdv.pktConf.bUseCrc = 1;
RF_cmdPropTxAdv.pktConf.bCrcIncSw = 0;
RF_cmdPropTxAdv.pktConf.bCrcIncHdr = 0;
rfHandle = RF_open (&rfObject、&RF_prop、(RF_RadioSetup*)&RF_cmdPropRadioDivSetup、&rfParams);
RF_runCmd (rfHandle、(RF_Op*)&RF_cmdFs、RF_PriorityNormal、NULL、0);
while (1)

内部视网膜;
RETC = SEM_WAIT (&txSemaphore);
if (retc ==–1){
while (1);
}
Packet[0]=(uint8_t)(payload_length);
Packet[1]=(uint8_t)(payload_length >> 8);
uint16_t i;
对于 (i = 2;i < PAYLOAD_LENGTH + 2;i++)

Packet[i]= i;
}
RF_runCmd (rfHandle、(RF_Op*)&RF_cmdPropTxAdv、RF_PriorityNormal、NULL、0);
GPIO_TOGGLE (CONFIG_GPIO_GLED);
}
}

接收器:

/***** 包括*** /
/*标准 C 库*/
#include

/* TI 驱动程序*/
#include
#include

/* Driverlib 头文件*/
#include DeviceFamily_constructPath (driverlib/rf_prop_mailbox.h)

//*板头文件*/
#include “ti_drivers_config.h"</s>“

/*应用程序头文件*/
#include “RFQueue.h"</s>“
#include

/***** 定义*** /

#define DATA_ENTRY_HEADER_SIZE 8 /*通用数据条目的常量标头大小*/
#define MAX_LENGTH 300 /*无线电将接受的最大长度字节*/
/*如果 size_of_lenght_field = 1、则必须小于 256 */
#define NUM_DATA_ENTRY 2 /*注意:目前只支持两个数据条目*/
#define SIZE_OF_LENGTH_FIELD 2.
#define NUM_PASSIDED_BYTES 1 + SIZE_OF_LENGTH_FIELD /*数据条目数据字段将包含:
* 1 或 2 标头字节(包含长度)
* MAX_LENGTH 有效载荷字节的最大值
* 1 个状态字节 (RF_cmdPropRxAdv.rxConf.bAppendStatus = 0x1)*/

/***** 原型*** /
静态 void 回调 (RF_handle h、RF_CmdHandle ch、RF_EventMask e);

/***** 变量声明*** /
静态 RF_Object rfObject;
静态 RF_Handle rfHandle;

#elif defined (__GNUC__)
静态 uint8_t
rxDataEntryBuffer[RF_QUEUE_DATA_ENTRY_BUFFER_SIZE (NUM_DATA_ENTRY、
MAX_LENGTH、
NUM_SUPPTED_Bytes)]
__attribute__(aligned (4));

/*接收射频内核的数据队列以填充数据*/
静态 dataQueue_t dataQueue;
static RFC_dataEntryGeneral_t* currentDataEntry;
静态 uint16_t packetLength;
静态 uint8_t* packetDataPointer;
static RFC_propRxOutput_t rxStatistics;

静态 uint8_t packet[MAX_LENGTH + NUM_EXTEND_BYTE];

/***** 函数定义*** /

void *mainThread (void *arg0)

RF_Params rfParams;
RF_Params_init (&rfParams);


if( RFQueue_defineQueue(&dataQueue,
rxDataEntryBuffer、
sizeof (rxDataEntryBuffer)、
num_data_entries、
MAX_LENGTH + NUM_EXTENDED_BYTES)

/*无法为所有数据条目分配空间*/
while (1);
}

/*根据应用需求修改 CMD_PROP_RX 命令*/
/*为接收的数据设置数据实体队列*/
rf_cmdPropRxAdv.pQueue =&dataQueue;
/*丢弃 Rx 队列中忽略的数据包*/
RF_cmdPropRxAdv.rxConf.bAutoFlushIgnored = 1;
/*从 Rx 队列中丢弃带有 CRC 错误的数据包*/
RF_cmdPropRxAdv.rxConf.bAutoFlushCrcErr = 1;
/*实现数据包长度过滤以避免 PROP_ERROR_RXBUF */
RF_cmdPropRxAdv.maxPktLen = MAX_LENGTH;
RF_cmdPropRxAdv.pktConf.brepeatOk = 1;
RF_cmdPropRxAdv.pktConf.brepeatNok = 1;
RF_cmdPropRxAdv.pOutput =(uint8_t*)&rxStatistics;

RF_cmdPropRxAdv.condition.rule = 1;
RF_cmdPropRxAdv.pktConf.bUseCrc = 0x1;
RF_cmdPropRxAdv.rxConf.bIncludeHdr = 0x1;
RF_cmdPropRxAdv.rxConf.bAppendStatus = 0x1;
RF_cmdPropRxAdv.endTriggerType = 0x1;
RF_cmdPropRxAdv.pktConf.bCrcIncHdr = 0x1;

RF_cmdPropRxAdv.hdrConf.numHdrBits = 16;
RF_cmdPropRxAdv.hdrConf.numLenBits = 16;

/*请求访问对讲机*/
rfHandle = RF_open (&rfObject、&RF_prop、(RF_RadioSetup*)&RF_cmdPropRadioDivSetup、&rfParams);

/*设置频率*/
RF_postCmd (rfHandle、(RF_Op*)&RF_cmdFs、RF_PriorityNormal、NULL、0);

/*进入 RX 模式并在 RX 中永远保持*/
RF_EventMask terminationReason = RF_runCmd (rfHandle、(RF_Op*)&RF_cmdPropRxAdv、RF_PriorityNormal、&callback、RF_EventRxEntryDone);
while (1);
}

void 回调 (RF_handle h、RF_CmdHandle ch、RF_EventMask e)

IF (e & RF_EventRxEntryDone)

/*切换引脚以指示 RX */

GPIO_TOGGLE (CONFIG_GPIO_RLED);

/*获取当前未处理的数据条目*/
currentDataEntry = RFQueue_getDataEntry ();

packetLength =((uint16_t)(*(uint8_t*)(&currentDataEntry->data+1))<< 8)|
(uint16_t)(*(uint8_t*)(&currentDataEntry->data));
packetDataPointer =(uint8_t*)(&currentDataEntry->data + size_of_lenght_field);

/*将有效载荷和状态字节复制到数据包变量*/
memcpy (packet、packetDataPointer、(packetLength + NUM_SUPLID_Bytes - size_of_lenght_field);
}
RFQueue_nextEntry();
}

 

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

    至少对于 TX 端,你做同样的错误,我在帖子中指出,你链接到.

    应按如下方式写入两字节数据包长度:

    packet[0] = (uint8_t)(PAYLOAD_LENGTH >> 8);
    packet[1] = (uint8_t)(PAYLOAD_LENGTH);

    不是其它方式(除非您使用的是 SLR 模式)

    请正确配置您的长度并告诉我结果

    Siri

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

    尊敬的 Siri:

    感谢您的答复。

    我已实施您建议的更改、但接收器端仍未收到任何内容。

    以下是我当前使用的参数:

    //参数摘要
    频率 (MHz):916.0000
    偏差 (kHz):190.0
    最大数据包长度:2047
    前导码计数:7 个字节
    前导码模式:发送 0 作为第一个前导码位
    RX 滤波器 BW (kHz):621.6
    符号速率 (kBaud):500.000
    同步字:0x55904E
    同步字长:24 位
    TX 功率 (dBm):12
    白化:动态 IEEE 802.15.4g 兼容白化器和 16/32 位 CRC

    我怀疑问题仅发生在接收器侧。 您能否检查并帮助解决此问题?

    谢谢您、
    Anbu

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

    嗨、Anbu

    您选择的 PHY 不使用正常的数据包格式、其中长度是同步后的前 1 或两个字节。 它使用符合 IEEE 802.15.4g 标准的数据包格式、其中 SYNC 后的前两个字节包括模式切换设置、有关 CRC 长度的信息、白化以及 11 位长数据包长度字段。

    以下代码可用于发送和接收采用此格式的 2047 字节长数据包:

    TX:

    // Packet TX Configuration
    #define PAYLOAD_LENGTH      2045                            // Max 2045, as the length in the header is 11 bits, and can be max 2047
    
    #define SIZE_OF_HEADER      2                               // Do Not Change
    #define LENGTH_IN_HEADER    PAYLOAD_LENGTH + SIZE_OF_HEADER // Max 2047 (11 bits)
    
    #define _802_15_4_G_HEADER  0x18                            // MS = 0
                                                                // FCS = 1 (2 byte CRC)
                                                                // DW = 1 (Data Whitening enabled)
    
    #define PACKET_INTERVAL     500000                          // Set packet interval to 500000 us or 500 ms
    
    static RF_Object rfObject;
    static RF_Handle rfHandle;
    
    uint16_t header;
    uint8_t packet[SIZE_OF_HEADER + PAYLOAD_LENGTH];
    uint16_t seqNumber;
    
    void *mainThread(void *arg0)
    {
        RF_Params rfParams;
        RF_Params_init(&rfParams);
    
        GPIO_setConfig(CONFIG_GPIO_GLED, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    
        GPIO_write(CONFIG_GPIO_GLED, CONFIG_GPIO_LED_OFF);
    
        RF_cmdPropTxAdv.pktLen = LENGTH_IN_HEADER;
        RF_cmdPropTxAdv.pPkt = packet;
    
        // Request access to the radio
        rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioDivSetup, &rfParams);
    
        // Set the frequency
        RF_postCmd(rfHandle, (RF_Op*)&RF_cmdFs, RF_PriorityNormal, NULL, 0);
    
        while(1)
        {
            // IEEE_802_15_4_g Header (2 byte CRC, whitening, 11 bits length)
            header = (_802_15_4_G_HEADER << 8) + (LENGTH_IN_HEADER & 0x07FF);
    
            packet[0] = (uint8_t)(header);
            packet[1] = (uint8_t)(header >> 8);
    
            for (uint16_t i = 2; i < PAYLOAD_LENGTH + SIZE_OF_HEADER; i++)
            {
                packet[i] = (i - 1);
            }
    
            // Send packet
            RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropTxAdv, RF_PriorityNormal, NULL, 0);
    
            GPIO_toggle(CONFIG_GPIO_GLED);
    
            // Power down the radio
            RF_yield(rfHandle);
    
            // Sleep for PACKET_INTERVAL us
            usleep(PACKET_INTERVAL);
        }
    }

    接收:

    #define DATA_ENTRY_HEADER_SIZE 8    // Constant header size of a Generic Data Entry
    #define NUM_DATA_ENTRIES       2    // NOTE: Only two data entries supported at the moment
    
    #define SIZE_OF_HEADER         2    // Cannot be changed (IEEE_802_15_4_g)
    
    // Optional appended bytes at the end of the packet
    //  -------------------------------------------------------
    //  | CRC1 | CRC0 | RSSI | TS0 | TS1 | TS2 | TS3 | Status |
    //  -------------------------------------------------------
    
    #define CRC                     0   // 2 if .rxConf.bIncludeCrc = 0x1, 0 otherwise
    #define RSSI                    0   // 1 if .rxConf.bAppendRssi = 0x1, 0 otherwise
    #define TIMESTAMP               0   // 4 if .rxConf.bAppendTimestamp = 0x1, 0 otherwise
    #define STATUS                  0   // 1 if .rxConf.bAppendStatus = 0x1, 0 otherwise
    
    #define NUM_APPENDED_BYTES      CRC + RSSI + TIMESTAMP + STATUS
    
    #define MAX_LENGTH              2047 // Max length byte the radio will accept
    
    #define PAYLOAD_LENGTH          (MAX_LENGTH - SIZE_OF_HEADER)
    
    static void callback(RF_Handle h, RF_CmdHandle ch, RF_EventMask e);
    
    static RF_Object rfObject;
    static RF_Handle rfHandle;
    
    /* Buffer which contains all Data Entries for receiving data.
     * Pragmas are needed to make sure this buffer is 4 byte aligned (requirement from the RF Core) */
    static uint8_t rxDataEntryBuffer[RF_QUEUE_DATA_ENTRY_BUFFER_SIZE(NUM_DATA_ENTRIES,
                                                                     MAX_LENGTH,
                                                                     NUM_APPENDED_BYTES)]
                                                                     __attribute__((aligned(4)));
    // Receive dataQueue for RF Core to fill in data
    dataQueue_t dataQueue;
    rfc_dataEntryGeneral_t* currentDataEntry;
    uint16_t packetLength;
    uint8_t* packetDataPointer;
    rfc_propRxOutput_t rxStatistics;
    
    uint8_t packet[PAYLOAD_LENGTH + NUM_APPENDED_BYTES];
    
    void *mainThread(void *arg0)
    {
        RF_Params rfParams;
        RF_Params_init(&rfParams);
    
        GPIO_setConfig(CONFIG_GPIO_RLED, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
        GPIO_write(CONFIG_GPIO_RLED, CONFIG_GPIO_LED_OFF);
    
        if( RFQueue_defineQueue(&dataQueue,
                                rxDataEntryBuffer,
                                sizeof(rxDataEntryBuffer),
                                NUM_DATA_ENTRIES,
                                MAX_LENGTH + NUM_APPENDED_BYTES))
        {
            // Failed to allocate space for all data entries
            while(1);
        }
    
        // Modify CMD_PROP_RX command for application needs
        // Set the Data Entity queue for received data
        RF_cmdPropRxAdv.pQueue = &dataQueue;
    
        // Discard ignored packets from Rx queue
        RF_cmdPropRxAdv.rxConf.bAutoFlushIgnored = 1;
    
        // Discard packets with CRC error from Rx queue
        RF_cmdPropRxAdv.rxConf.bAutoFlushCrcErr = 1;
    
        // Implement packet length filtering to avoid PROP_ERROR_RXBUF
        RF_cmdPropRxAdv.maxPktLen = MAX_LENGTH;
        RF_cmdPropRxAdv.pktConf.bRepeatOk = 1;
        RF_cmdPropRxAdv.pktConf.bRepeatNok = 1;
        RF_cmdPropRxAdv.pOutput = (uint8_t*)&rxStatistics;
    
        // Optional bytes to append:
        RF_cmdPropRxAdv.rxConf.bIncludeCrc = 0x0;
        RF_cmdPropRxAdv.rxConf.bAppendRssi = 0x0;
        RF_cmdPropRxAdv.rxConf.bAppendTimestamp = 0x0;
        RF_cmdPropRxAdv.rxConf.bAppendStatus = 0x0;
    
        // Request access to the radio
        rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioDivSetup, &rfParams);
    
        // Set the frequency
        RF_postCmd(rfHandle, (RF_Op*)&RF_cmdFs, RF_PriorityNormal, NULL, 0);
    
        RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropRxAdv, RF_PriorityNormal, &callback, RF_EventRxEntryDone);
    
        while(1);
    }
    
    void callback(RF_Handle h, RF_CmdHandle ch, RF_EventMask e)
    {
        if (e & RF_EventRxEntryDone)
        {
            // Toggle pin to indicate RX
            GPIO_toggle(CONFIG_GPIO_RLED);
    
            // Get current unhandled data entry
            currentDataEntry = RFQueue_getDataEntry();
    
            packetLength = 0x07FF & (((uint16_t)((*(uint8_t*)(&currentDataEntry->data+1)) << 8) |
                                      (uint16_t)(*(uint8_t*)(&currentDataEntry->data))));
            packetDataPointer = (uint8_t*)(&currentDataEntry->data + SIZE_OF_HEADER);
    
            // Copy the payload and the status bytes to the packet variable
            memcpy(packet, packetDataPointer, (packetLength + NUM_APPENDED_BYTES));
    
            RFQueue_nextEntry();
        }
    }
    

    BR

    Siri

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

    尊敬的 Siri:

    我尝试了你建议的方法,但接收器仍然没有收到任何数据包。 我附上了更新后的 TX 和 RX 代码—请查看并帮助确定问题

    观察/行为

    在 TX 端、我在循环中重复发布 TX 命令 (RF_cmdPropTxAdv) 并切换 TX LED;传输按预期运行。

    在 RX 端、我调用 RF_runCmd (...、&callback、0)、然后切换主循环内的 RX LED 以确认接收器线程正在运行。 但是、在 RF_runCmd 执行后、执行似乎会立即返回、RX LED 不会切换。

    当我在 wfi wait-for-interrupt 指令 (__asm volatile(“ wfi\n“);)暂停调试器中的代码时、接收器的行为就像正在运行一样、但 LED 在正常执行过程中仍然不会切换。

    TX:
    #define PAYLOAD_LENGTH 2045
    #define SIZE_OF_HEADER 2 // Do Not Change

    #define LENGTH_IN_HEADER PAYLOAD_LENGTH + SIZE_OF_HEADER // Max 2047 (11 bits)
    #define _802_15_4_G_HEADER 0x18 // MS = 0

    #define PACKET_INTERVAL 500000 // Set packet interval to 500000 us or 500 ms
    uint16_t header;
    uint16_t total_length = PAYLOAD_LENGTH; // PHR length includes CRC but not PHR itself
    uint8_t packet[SIZE_OF_HEADER + PAYLOAD_LENGTH];
    uint16_t seqNumber;

    /********************************************/
    rfc_CMD_PROP_TX_ADV_t RF_cmdPropTxAdv;
    static RF_Object rfObject;
    static RF_Handle rfHandle;

    rfc_CMD_PROP_RADIO_DIV_SETUP_PA_t RF_cmdPropRadioDivSetup;
    RF_Mode RF_prop;
    rfc_CMD_FS_t RF_cmdFs;
    /*
    * ======== mainThread ========
    */
    void *mainThread(void *arg0)
    {

    RF_Params rfParams;
    RF_Params_init(&rfParams);
    RF_cmdPropTxAdv.pktLen = LENGTH_IN_HEADER;
    RF_cmdPropTxAdv.pPkt = packet;
    RF_cmdPropTxAdv.startTrigger.triggerType = TRIG_NOW;

    rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioDivSetup, &rfParams);
    RF_postCmd(rfHandle, (RF_Op*)&RF_cmdFs, RF_PriorityNormal, NULL, 0);
    while(1)
    {
    // IEEE_802_15_4_g Header (2 byte CRC, whitening, 11 bits length)
    header = (_802_15_4_G_HEADER << 8) + (LENGTH_IN_HEADER & 0x07FF);

    packet[0] = (uint8_t)(header);
    packet[1] = (uint8_t)(header >> 8);

    uint16_t i;
    for ( i = 2; i < PAYLOAD_LENGTH + SIZE_OF_HEADER; i++)
    {
    packet[i] = (i - 1);
    }

    RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropTxAdv, RF_PriorityNormal, NULL, 0);

    GPIO_toggle(CONFIG_GPIO_GLED);
    RF_yield(rfHandle);
    usleep(500000);
    }
    }
    接收:

    /***** Defines *****/
    /* TX Configuration */
    #define DATA_ENTRY_HEADER_SIZE 8 // Constant header size of a Generic Data Entry
    #define NUM_DATA_ENTRIES 2 // NOTE: Only two data entries supported at the moment
    #define SIZE_OF_HEADER 2 // Cannot be changed (IEEE_802_15_4_g)
    #define CRC 0 // 2 if .rxConf.bIncludeCrc = 0x1, 0 otherwise
    #define RSSI 0 // 1 if .rxConf.bAppendRssi = 0x1, 0 otherwise
    #define TIMESTAMP 0 // 4 if .rxConf.bAppendTimestamp = 0x1, 0 otherwise
    #define STATUS 0 // 1 if .rxConf.bAppendStatus = 0x1, 0 otherwise

    #define NUM_APPENDED_BYTES CRC + RSSI + TIMESTAMP + STATUS

    #define MAX_LENGTH 2047 // Max length byte the radio will accept

    #define PAYLOAD_LENGTH (MAX_LENGTH - SIZE_OF_HEADER)

    /***** Variable declarations *****/

    /* RF driver object and handle */
    static RF_Object rfObject;
    static RF_Handle rfHandle;
    /* General wake-on-radio sniff status statistics and statistics from the RF Core about received packets */
    rfc_propRxOutput_t rxStatistics;
    static uint8_t rxDataEntryBuffer [RF_QUEUE_DATA_ENTRY_BUFFER_SIZE(NUM_DATA_ENTRIES,MAX_LENGTH, NUM_APPENDED_BYTES)] __attribute__ ((aligned (4)));

    /* RX Data Queue and Data Entry pointer to read out received packets */
    dataQueue_t dataQueue;
    rfc_dataEntryGeneral_t* currentDataEntry;

    /* Received packet's length and pointer to the payload */
    uint16_t packetLength;
    uint8_t* packetDataPointer;

    /* Sniff command for doing combined Carrier Sense and RX*/
    rfc_CMD_PROP_RX_ADV_t RF_cmdPropRxAdv;
    /***** Prototypes *****/
    static void callback(RF_Handle h, RF_CmdHandle ch, RF_EventMask e);
    uint8_t packet[PAYLOAD_LENGTH + NUM_APPENDED_BYTES];

    /* RX task function. Executed in Task context when the scheduler starts. */
    void *mainThread(void *arg0)
    {
    RF_Params rfParams;
    RF_Params_init(&rfParams);
    /* Create queue and data entries */
    if (RFQueue_defineQueue(&dataQueue,rxDataEntryBuffer,sizeof(rxDataEntryBuffer),NUM_DATA_ENTRIES,MAX_LENGTH + NUM_APPENDED_BYTES))
    {
    while(1);
    }
    // Modify CMD_PROP_RX command for application needs
    // Set the Data Entity queue for received data
    RF_cmdPropRxAdv.pQueue = &dataQueue;

    // Discard ignored packets from Rx queue
    RF_cmdPropRxAdv.rxConf.bAutoFlushIgnored = 1;

    // Discard packets with CRC error from Rx queue
    RF_cmdPropRxAdv.rxConf.bAutoFlushCrcErr = 1;

    // Implement packet length filtering to avoid PROP_ERROR_RXBUF
    RF_cmdPropRxAdv.maxPktLen = MAX_LENGTH;
    RF_cmdPropRxAdv.pktConf.bRepeatOk = 1;
    RF_cmdPropRxAdv.pktConf.bRepeatNok = 1;
    RF_cmdPropRxAdv.pOutput = (uint8_t*)&rxStatistics;

    // Optional bytes to append:
    RF_cmdPropRxAdv.rxConf.bIncludeCrc = 0x0;
    RF_cmdPropRxAdv.rxConf.bAppendRssi = 0x0;
    RF_cmdPropRxAdv.rxConf.bAppendTimestamp = 0x0;
    RF_cmdPropRxAdv.rxConf.bAppendStatus = 0x0;

    rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioDivSetup, &rfParams);
    RF_postCmd(rfHandle, (RF_Op*)&RF_cmdFs, RF_PriorityNormal, NULL, 0);
    RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropRxAdv, RF_PriorityNormal, &callback, 0);
    while(1)
    {
    GPIO_toggle(CONFIG_GPIO_RLED);
    usleep(500000);
    }
    }
    /* Called for every received packet and command done */
    void callback(RF_Handle h, RF_CmdHandle ch, RF_EventMask e)
    {
    if (e & RF_EventRxEntryDone)
    {
    /* Toggle LED on RX */
    GPIO_toggle(CONFIG_GPIO_GLED);
    currentDataEntry = RFQueue_getDataEntry();

    // Get current unhandled data entry
    currentDataEntry = RFQueue_getDataEntry();

    packetLength = 0x07FF & (((uint16_t)((*(uint8_t*)(&currentDataEntry->data+1)) << 8) |
    (uint16_t)(*(uint8_t*)(&currentDataEntry->data))));
    packetDataPointer = (uint8_t*)(&currentDataEntry->data + SIZE_OF_HEADER);

    // Copy the payload and the status bytes to the packet variable
    memcpy(packet, packetDataPointer, (packetLength + NUM_APPENDED_BYTES));

    RFQueue_nextEntry();

    }
    }

    请检查我的 RX 配置、射频队列使用情况和源代码以找到问题。

    谢谢、
    ANBU。

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

    如果您在未进行修改的情况下运行我与您共享的代码、它的工作原理是:

    我共享的 RX 代码对 RX 使用重复模式:

    RF_cmdPropRxAdv.pktConf.bRepeatOk = 1;
    RF_cmdPropRxAdv.pktConf.bRepeatNok = 1;

    因此、  除非您(例如)在某处设置断点、否则永远不会从 RF_runCmd(因为这是一个分块命令)返回。

    在无线电位于 RX 中时设置断点将停止 CPU、但射频内核仍将运行、因此您将耗尽数据条目来存储接收到的数据包 (RX 命令的状态将为 PROP_ERROR_RXBUF)

    如果您希望能够为每个接收到的数据包设置断点、则需要关闭重复模式、并 在 while 循环中调用 RF_runCmd(为每个接收到的数据包调用一次)。

    Siri

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

    您好、

    我更新了代码、现在数据包已正确接收。 但是、最后 4 个字节始终为0。 即使我增加了有效负载大小,也会出现同样的问题 — 最后 4 个字节始终丢失。 您能检查我的代码、找到错误并提出解决方法建议吗? 我附上了代码以供参考。

    例如、当我传输:
    1 2 3 4 5 6 7 8 9 A

    我收到:
    1 2 3 4 5 6 0 0 0 0

    TX 代码:

    #define CRC_LEN 2 // if modem configured for CRC-16; change to 4 for CRC-32
    #define PAYLOAD_LENGTH 10
    #define SIZE_OF_HEADER 2 // Do Not Change
    #define LENGTH_IN_HEADER PAYLOAD_LENGTH + SIZE_OF_HEADER // Max 2047 (11 bits)
    #define _802_15_4_G_HEADER 0x18 // MS = 0

    #define PACKET_INTERVAL 500000 // Set packet interval to 500000 us or 500 ms
    uint16_t header;
    uint16_t total_length = PAYLOAD_LENGTH; // PHR length includes CRC but not PHR itself
    uint8_t packet[SIZE_OF_HEADER + PAYLOAD_LENGTH];
    uint16_t seqNumber;
    static RF_Object rfObject;
    static RF_Handle rfHandle;

    rfc_CMD_PROP_TX_ADV_t RF_cmdPropTxAdv;
    rfc_CMD_PROP_RADIO_DIV_SETUP_PA_t RF_cmdPropRadioDivSetup;
    RF_Mode RF_prop;
    rfc_CMD_FS_t RF_cmdFs;
    void *mainThread(void *arg0)
    {
    RF_Params rfParams;
    RF_Params_init(&rfParams);
    RF_cmdPropTxAdv.pktLen = LENGTH_IN_HEADER;
    RF_cmdPropTxAdv.pPkt = packet;

    RF_cmdPropTxAdv.condition.rule = 0;
    RF_cmdPropTxAdv.pktConf.bUseCrc = 0;
    /****************************/
    rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioDivSetup, &rfParams);
    RF_postCmd(rfHandle, (RF_Op*)&RF_cmdFs, RF_PriorityNormal, NULL, 0);
    while(1)
    {
    header = (_802_15_4_G_HEADER << 8) + (LENGTH_IN_HEADER & 0x07FF);

    packet[0] = (uint8_t)(header);
    packet[1] = (uint8_t)(header >> 8);

    uint16_t i;
    for ( i = 2; i < PAYLOAD_LENGTH + SIZE_OF_HEADER; i++)
    {
    packet[i] = (i - 1);
    }
    RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropTxAdv, RF_PriorityNormal, NULL, 0);

    GPIO_toggle(CONFIG_GPIO_GLED);
    RF_yield(rfHandle);
    usleep(500000);
    }
    }

    Rx 代码:

    #define DATA_ENTRY_HEADER_SIZE 8 // Constant header size of a Generic Data Entry
    #define NUM_DATA_ENTRIES 2 // NOTE: Only two data entries supported at the moment
    #define SIZE_OF_HEADER 2 // Cannot be changed (IEEE_802_15_4_g)
    #define NUM_APPENDED_BYTES 0
    #define MAX_LENGTH 2047 // Max length byte the radio will accept
    #define PAYLOAD_LENGTH (MAX_LENGTH - SIZE_OF_HEADER)
    static RF_Object rfObject;
    static RF_Handle rfHandle;
    static rfc_propRxOutput_t rxStatistics;
    static uint8_t rxDataEntryBuffer [RF_QUEUE_DATA_ENTRY_BUFFER_SIZE(NUM_DATA_ENTRIES,MAX_LENGTH, NUM_APPENDED_BYTES)] __attribute__ ((aligned (4)));
    static dataQueue_t dataQueue;
    static rfc_dataEntryGeneral_t* currentDataEntry;

    static uint16_t packetLength;
    static uint8_t* packetDataPointer;

    rfc_CMD_PROP_RX_ADV_t RF_cmdPropRxAdv;
    static void callback(RF_Handle h, RF_CmdHandle ch, RF_EventMask e);
    static void ReceiveonUARTcallback(UART2_Handle handle, void *buffer, size_t count, void *userArg, int_fast16_t status);

    uint8_t packet[PAYLOAD_LENGTH + NUM_APPENDED_BYTES];
    void *mainThread(void *arg0)
    {
    RF_Params rfParams;
    RF_Params_init(&rfParams);
    if (RFQueue_defineQueue(&dataQueue,rxDataEntryBuffer,sizeof(rxDataEntryBuffer),NUM_DATA_ENTRIES,MAX_LENGTH + NUM_APPENDED_BYTES))
    {
    while(1);
    }
    RF_cmdPropRxAdv.rxConf.bAppendRssi = 0x0;
    RF_cmdPropRxAdv.rxConf.bAppendTimestamp = 0x0;
    RF_cmdPropRxAdv.rxConf.bAppendStatus = 0x0;

    RF_cmdPropRxAdv.pQueue = &dataQueue;
    RF_cmdPropRxAdv.pOutput = (uint8_t*)&rxStatistics;
    RF_cmdPropRxAdv.maxPktLen = MAX_LENGTH;

    RF_cmdPropRxAdv.hdrConf.numHdrBits = 16;
    RF_cmdPropRxAdv.hdrConf.numLenBits = 16;
    RF_cmdPropRxAdv.hdrConf.lenPos = 0; // ensure this is set

    RF_cmdPropRxAdv.pktConf.bUseCrc = 0;
    RF_cmdPropRxAdv.rxConf.bIncludeCrc = 0; // Deliver CRC bytes to your RX buffer

    RF_cmdPropRxAdv.condition.rule = 1;
    RF_cmdPropRxAdv.endTrigger.triggerType = 0x1;

    RF_cmdPropRxAdv.pktConf.bRepeatOk = 0;
    RF_cmdPropRxAdv.pktConf.bRepeatNok = 0;

    rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioDivSetup, &rfParams);
    RF_postCmd(rfHandle, (RF_Op*)&RF_cmdFs, RF_PriorityNormal, NULL, 0);
    RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropRxAdv, RF_PriorityNormal, &callback, 0);
    while(1)
    {
    RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropRxAdv, RF_PriorityNormal, &callback, RF_EventRxEntryDone);
    GPIO_toggle(CONFIG_GPIO_RLED);
    usleep(500000);
    }
    }
    /* Called for every received packet and command done */
    void callback(RF_Handle h, RF_CmdHandle ch, RF_EventMask e)
    {
    if (e & RF_EventRxEntryDone)
    {
    GPIO_toggle(CONFIG_GPIO_RLED);

    currentDataEntry = RFQueue_getDataEntry();

    packetLength = 0x07FF & (((uint16_t)((*(uint8_t*)(&currentDataEntry->data+1)) << 8) |
    (uint16_t)(*(uint8_t*)(&currentDataEntry->data))));
    packetDataPointer = (uint8_t*)(&currentDataEntry->data + SIZE_OF_HEADER);

    memcpy(packet, packetDataPointer, (packetLength + NUM_APPENDED_BYTES));

    RFQueue_nextEntry();
    }
    }

    在接收模式下、不会连续接收数据包。 仅当RF_runCmd在循环中执行时才会接收到数据;然后 LED 才会切换。 这不是我想要的行为。 相反、我需要通过 RF 持续接收数据包、而while循环中的功能独立运行。

    谢谢、
    ANBU

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

    我真的很抱歉,但我不明白你想做什么。

    您选择了符合 802.15.4g 标准的 PHY、并且正在传输包含 802.15.4g 标头(具有 11 位长度字段)的数据包、但您关闭了 CRC????

    在接收器上、您也正在关闭 CRC(为什么不使用 CRC?)、并且您将无线电配置为不兼容 802.15.4g 的数据包格式 (16 位长度而不是 11)、但在回调中、您将标头视为 802.15.4 g 标头。

    与其发布您的代码、我需要了解您实际尝试执行的操作:

    您希望/需要使用什么 PHY?

    是否发送/接收符合 802.15.4g 标准的数据包?

    您需要发送/接收的最大有效载荷大小是多少?

    为什么您不使用 CRC?

    如果您希望在等待射频数据包时执行其他代码、则不能使用阻塞函数、如 RF_runCmd。 您需要改用非阻塞 RF_postCmd。

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

    尊敬的 Siri:

    感谢您的反馈。 让我澄清一下我的要求:

    1. 使用中的 PHY:
      我正在使用 专有定制 PHY 使用以下设置:

      • 频段:868MHz

      • PHY 类型:500kbps、190kHz 偏差、2-GFSK、622kHz RX 带宽

    2. 数据包格式:
      我的预期数据包格式为:

      • 前 2 个字节: 长度字段

      • 然后是有效载荷数据
        (稍后我计划扩展格式:2 字节长度+ 2 字节地址+有效载荷数据)。

    3. 有效载荷大小:
      所需的最大有效载荷大小为 最多 500 字节

    4. CRC 使用情况:
      最初、我启用了 CRC、但接收器没有收到任何数据包。 当我禁用 CRC 时、会收到数据包(尽管存在我先前描述的问题)。
      理想情况下、我更喜欢保留 CRC 被启用 为了确保可靠性、我是否可以正确配置它、以便 RX 仍然正常工作。

      我的目标:
      使用我的自定义数据包格式(不符合 802.15.4g)建立可靠的数据包发送/接收、支持多达 500 字节、同时保持连续 RX 模式。

      请您指导我:

      • 在该自定义 PHY 设置中配置 CRC 的正确方法

      • 对于高级 TX/RX 命令、我的自定义“长度+有效载荷“格式是否有效、或者需要额外调整。

      • 我想要一个支持发送和接收的单一代码实现、使设备可以作为收发器运行。

      此致、
      ANBU

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

    下面是 RX 和 TX 的示例、其中展示了如何使用 高级命令来传输数据包、并且长度字段为 2 字节长。

    假设您已从 SysConfig 中选择 500kbps PHY(该 PHY 使用高级命令和 IEEE802.15.4g 格式)。

    这些代码还将与其他使用相同格式的 PHY 配合使用。

    启用 CRC 并附加所有状态字节。

    当接收到具有“CRC OK“(CRC 正常)的数据包时、RX 将退出。 我使用非阻塞 RX、因此器件可以在等待接收数据包的同时执行其他任务(使 LED 闪烁)。

    TX:

    /* Standard C Libraries */
    #include <stdlib.h>
    #include <unistd.h>
    
    /* TI Drivers */
    #include <ti/drivers/rf/RF.h>
    #include <ti/drivers/GPIO.h>
    
    /* Driverlib Header files */
    #include DeviceFamily_constructPath(driverlib/rf_prop_mailbox.h)
    
    /* Board Header files */
    #include "ti_drivers_config.h"
    #include <ti_radio_config.h>
    
    #define PAYLOAD_LENGTH      500     // MAX 4093
    #define PACKET_INTERVAL     500000  // Set packet interval to 500000 us or 500 ms
    #define LENGTH_FIELD        2
    
    uint8_t packet[LENGTH_FIELD + PAYLOAD_LENGTH];
    
    static RF_Object rfObject;
    static RF_Handle rfHandle;
    
    static uint16_t seqNumber;
    
    void *mainThread(void *arg0)
    {
        RF_Params rfParams;
        RF_Params_init(&rfParams);
    
        GPIO_setConfig(CONFIG_GPIO_GLED, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    
        GPIO_write(CONFIG_GPIO_GLED, CONFIG_GPIO_LED_OFF);
    
        // Setting in the CMD_PROP_RADIO_DIV_SETUP and CMD_PROP_TX_ADV command that needs to be changed from 
        // what SysConfig generated. It is assume that settings using the 802.15.4g format is selected in SysConfig
        RF_cmdPropRadioDivSetup.formatConf.nSwBits = 0x20;
        RF_cmdPropRadioDivSetup.formatConf.whitenMode = 0x0;
    
        RF_cmdPropTxAdv.startTrigger.triggerType = 0x0;
        RF_cmdPropTxAdv.startTrigger.pastTrig = 0x0;
        RF_cmdPropTxAdv.numHdrBits = 0x0;
        RF_cmdPropTxAdv.pktLen = LENGTH_FIELD + PAYLOAD_LENGTH;
        RF_cmdPropTxAdv.preTrigger.triggerType = 0x0;
        RF_cmdPropTxAdv.preTrigger.pastTrig = 0x0;
        RF_cmdPropTxAdv.syncWord = 0x930B51DE;
        RF_cmdPropTxAdv.pPkt = packet;
    
        // Request access to the radio
        rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioDivSetup, &rfParams);
    
        // Set the frequency
        RF_postCmd(rfHandle, (RF_Op*)&RF_cmdFs, RF_PriorityNormal, NULL, 0);
    
        while(1)
        {
            // |---------------------------------------------------------------------------------------------------------------
            // | PAYLOAD_LENGTH1 | PAYLOAD_LENGTH0 | SEQ1 | SEQ0 | Data0 | Data1 | ............... | Data(PAYLOAD_LENGTH - 3) |
            // |---------------------------------------------------------------------------------------------------------------
    
            packet[0] = (uint8_t)(PAYLOAD_LENGTH >> 8);
            packet[1] = (uint8_t)(PAYLOAD_LENGTH);
            packet[2] = (uint8_t)(seqNumber >> 8);
            packet[3] = (uint8_t)(seqNumber++);
    
            uint16_t i;
            for (i = 4; i < (LENGTH_FIELD + PAYLOAD_LENGTH); i++)
            {
                packet[i] = i - 4;
            }
    
            RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropTxAdv, RF_PriorityNormal, NULL, 0);
    
            GPIO_toggle(CONFIG_GPIO_GLED);
    
            // Power down the radio
            RF_yield(rfHandle);
    
            // Sleep for PACKET_INTERVAL us
            usleep(PACKET_INTERVAL);
        }
    }
    

    接收:

    /* Standard C Libraries */
    #include <stdlib.h>
    
    /* TI Drivers */
    #include <ti/drivers/rf/RF.h>
    #include <ti/drivers/GPIO.h>
    
    /* Driverlib Header files */
    #include DeviceFamily_constructPath(driverlib/rf_prop_mailbox.h)
    
    /* Board Header files */
    #include "ti_drivers_config.h"
    
    /* Application Header files */
    #include "RFQueue.h"
    #include <ti_radio_config.h>
    
    // DATA ENTRIES
    #define DATA_ENTRY_HEADER_SIZE  8       // Constant header size of a Generic Data Entry
    #define NUM_DATA_ENTRIES        2       // NOTE: Only two data entries supported at the moment
    
    // Optional appended bytes at the end of the packet
    //  -------------------------------------------------------
    //  | CRC1 | CRC0 | RSSI | TS0 | TS1 | TS2 | TS3 | Status |
    //  -------------------------------------------------------
    
    #define CRC                     2       // 2 if .rxConf.bIncludeCrc = 0x1, 0 otherwise
    #define RSSI                    1       // 1 if .rxConf.bAppendRssi = 0x1, 0 otherwise
    #define TIMESTAMP               4       // 4 if .rxConf.bAppendTimestamp = 0x1, 0 otherwise
    #define STATUS                  1       // 1 if .rxConf.bAppendStatus = 0x1, 0 otherwise
    
    #define LENGTH_FIELD            2       // RF_cmdPropRx.rxConf.bIncludeHdr = 0x1
    #define MAX_LENGTH              500     // Max length the radio will accept (can max be 4093)
    
    #define NUM_APPENDED_BYTES  LENGTH_FIELD + CRC + RSSI + TIMESTAMP + STATUS
    
    uint8_t packet[MAX_LENGTH + NUM_APPENDED_BYTES - LENGTH_FIELD]; // Length stored in packetLength variable so no need to make room for that
    uint16_t packetLength;
    
    static void callback(RF_Handle h, RF_CmdHandle ch, RF_EventMask e);
    
    static RF_Object rfObject;
    static RF_Handle rfHandle;
    
    static uint8_t rxDataEntryBuffer[RF_QUEUE_DATA_ENTRY_BUFFER_SIZE(NUM_DATA_ENTRIES,
                                                                     MAX_LENGTH,
                                                                     NUM_APPENDED_BYTES)]
                                                                     __attribute__((aligned(4)));
    static dataQueue_t dataQueue;
    static rfc_dataEntryGeneral_t* currentDataEntry;
    
    static uint8_t* packetDataPointer;
    rfc_propRxOutput_t rxStatistics;
    bool packetReceived = false;
    
    uint16_t crc;
    int8_t rssi;
    uint32_t timestamp;
    uint8_t status;
    
    void *mainThread(void *arg0)
    {
        RF_Params rfParams;
        RF_Params_init(&rfParams);
    
        GPIO_setConfig(CONFIG_GPIO_RLED, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
        GPIO_setConfig(CONFIG_GPIO_GLED, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
        GPIO_write(CONFIG_GPIO_RLED, CONFIG_GPIO_LED_OFF);
        GPIO_write(CONFIG_GPIO_GLED, CONFIG_GPIO_LED_OFF);
    
        if( RFQueue_defineQueue(&dataQueue,
                                rxDataEntryBuffer,
                                sizeof(rxDataEntryBuffer),
                                NUM_DATA_ENTRIES,
                                MAX_LENGTH + NUM_APPENDED_BYTES))
        {
            while(1);
        }
    
        // Setting in the CMD_PROP_RADIO_DIV_SETUP and CMD_PROP_RX_ADV command that needs to be changed from 
        // what SysConfig generated. It is assume that settings using the 802.15.4g format is selected in SysConfig
        RF_cmdPropRadioDivSetup.formatConf.nSwBits = 0x20;
        RF_cmdPropRadioDivSetup.formatConf.whitenMode = 0x0;
    
        RF_cmdPropRxAdv.pktConf.bRepeatNok = 0x1;
        RF_cmdPropRxAdv.pktConf.bCrcIncHdr = 0x1;
    
        RF_cmdPropRxAdv.pktConf.filterOp = 0x0;
        RF_cmdPropRxAdv.rxConf.bAutoFlushCrcErr = 0x1;
        RF_cmdPropRxAdv.syncWord0 = 0x930B51DE;
        RF_cmdPropRxAdv.maxPktLen = MAX_LENGTH;
        RF_cmdPropRxAdv.hdrConf.numLenBits = 0x10;
        RF_cmdPropRxAdv.lenOffset = 0x00;
        RF_cmdPropRxAdv.pQueue = &dataQueue;
    
        // Optional bytes to append:
        RF_cmdPropRxAdv.rxConf.bIncludeCrc = 0x1;
        RF_cmdPropRxAdv.rxConf.bAppendRssi = 0x1;
        RF_cmdPropRxAdv.rxConf.bAppendTimestamp = 0x1;
        RF_cmdPropRxAdv.rxConf.bAppendStatus = 0x1;
    
        // Optional (for debugging)
        RF_cmdPropRxAdv.pOutput = (uint8_t*)&rxStatistics;
    
        // Request access to the radio
        rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioDivSetup, &rfParams);
    
        // Set the frequency
        RF_postCmd(rfHandle, (RF_Op*)&RF_cmdFs, RF_PriorityNormal, NULL, 0);
    
        while(1)
        {
            RF_postCmd(rfHandle, (RF_Op*)&RF_cmdPropRxAdv, RF_PriorityNormal, &callback, RF_EventRxEntryDone);
    
            while(!packetReceived)
            {
                // Do something else while waiting for a packet to be received
                GPIO_toggle(CONFIG_GPIO_GLED);
            }
            packetReceived = false;
        }
    }
    
    void callback(RF_Handle h, RF_CmdHandle ch, RF_EventMask e)
    {
        if (e & RF_EventRxEntryDone)
        {
            GPIO_toggle(CONFIG_GPIO_RLED);
    
            currentDataEntry = RFQueue_getDataEntry();
    
            packetLength        = ((uint16_t)(*(uint8_t*)(&currentDataEntry->data + 1) << 8) |
                                   (uint16_t)(*(uint8_t*)(&currentDataEntry->data + 0) << 0));
    
            packetDataPointer   = (uint8_t*)(&currentDataEntry->data + LENGTH_FIELD);
    
            memcpy(packet, packetDataPointer, (packetLength + NUM_APPENDED_BYTES - LENGTH_FIELD));
    
            crc                 = ((uint16_t)(packet[packetLength + 0] << 8) +
                                   (uint16_t)(packet[packetLength + 1] << 0));
    
            rssi                = packet[packetLength + 2];
    
            timestamp           = ((uint32_t)(packet[packetLength + 3] << 0 ) +
                                   (uint32_t)(packet[packetLength + 4] << 8 ) +
                                   (uint32_t)(packet[packetLength + 5] << 16) +
                                   (uint32_t)(packet[packetLength + 6] << 24));
    
            status              = packet[packetLength + 7];
    
            RFQueue_nextEntry();
    
            packetReceived = true;
        }
    }
    

    BR

    Siri

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

    尊敬的 Siri:
    我应用了您建议的解决方案、它成功地发挥了作用。
    感谢您的帮助。

    到目前为止、单独使用时 TX 和 RX 正常工作。 我需要一个组合实施、如 RF-UART 桥接器:来自 UART 的数据应通过射频传输、来自射频的数据应发送到 UART。

    谢谢、
    ANBU。

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

    请参阅 out rfUARTBridge 示例。

    Siri