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.

[参考译文] CC1352R:同步字检测

Guru**** 2606405 points
Other Parts Discussed in Thread: CC1101

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/709127/cc1352r-sync-word-detection

器件型号:CC1352R
主题中讨论的其他器件:CC1101

您好!

我正在进行一个使用低于1GHz 的项目、我需要将接收器与发送器同步、以减少功耗。 我使用了 CC1101、它允许在接收器检测到 SyncWord 时调用回调、这样我就可以执行同步、有没有类似的东西?

由于数据包的长度可变、在 RxDoneCallback 中执行同步不合适。  

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

    我们在射频内核内部有一个集成计时器、用于捕获数据包到达和离开的时间。 此捕获的时间值可以在数据包已离开/到达后手动提取、也可以由射频内核自动将其附加到有效载荷中。

    请参阅 RevA 用户指南第2026页第25.10.4.1节中的"bAppendTimeStamp"。

    此致、
    /TA
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、它应该可以正常工作。 RAT 时间戳是32位值、特定格式还是只是定时器增量值?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请参阅:

    dev.ti.com/.../time-synchronization.html

    您还可以使用此处描述的同步接收信号(RAT_GPO1):

    dev.ti.com/.../signal-routing.html

    请注意、若要使 RAT_GPO1工作、bRepeatOk 和 bRepeatNok 必须为0。

    Siri
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我正在尝试将 RAT_GPO1与 Hwi 回调一起使用。 现在我的问题是、如果我使用以下命令启用该中断运行时:

    HWREG (0x40041000 + 0x08)&=~0x2000; //清除 RFC_DBELL_RFHWIFG 中的标志
    HWREG (0x40041000 + 0x0C)|= 0x2000; //在 RFC_DBELL_RFHWIEN 中写入,启用 RAT 中断

    当然、在应用了用户指南中建议的覆盖之后、它只能在一个射频上电周期内工作、之后 RFHWIEN 被清除并且 RFHWIFG 被重新启动、所以中断不适用。
    我现在希望将这些命令用作 Smart RF Overrider、但它们不起作用。 我在覆盖数组中写入的内容是(您在指南中建议的覆盖除外)

    HW_REG_OVERRIDE (RFC_DBELL_BASE + RFC_DBELL_O_RFHWIFG、RFC_DBELL_RFHWIFG_RATC1)、
    HW_REG_OVERRIDE (RFC_DBELL_BASE + RFC_DBELL_O_RFHWIEN、RFC_DBELL_RFHWIEN 和 RATCCH1)、

    TI 能否提供手动覆盖添加的有效指南?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请有人帮助我吗? 找到 SyncWord 时、我无法找到正确调用 ISR 的方法。

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

     在同步时、应使用引脚驱动程序设置回调。 以下代码显示了如何完成此操作。 我使用了 rfPacketRx 示例作为起点:

    SYNC 信号路由到 IOID_7

    /***** 包括***** //*
    标准 C 库*/
    #include 
    
    /* TI 驱动程序*/
    #include 
    #include 
    #include 
    
    /* Driverlib 头文件*/
    #include DeviceFamily_constructPath (driverlib/rf_prop_mailbox.h)
    
    /*板头文件*/
    #include "Board.h"
    
    /*应用头文件*/
    #include "RFQueue.h"
    #include "smartrf_settings/smartrf_settings.h"
    
    /***** 定义了***** /*
    
    数据包 RX 配置*/
    #define DATA_Entry_header_size 8 //通用数据条目的恒定标头大小*/
    #define MAX_LENGTH 30 //最大长度字节无线电将接受*/
    #define NUM_DATA_ENTRIES 2 /*注意:目前仅支持两个数据条目*/
    #define NUM_SUBSTED_BYTES 2 /*数据条目数据字段将包含:
    * 1标头字节(RF_cmdPropRx.rxConf.bIncludeHdr = 0x1)
    *最多30个有效载荷字节
    * 1个状态字节(RF_cmdPropRx.rxConf.bAppendStatus = 0x1)*/
    
    
    
    /***** 原型***** /
    静态空回调(rf_handle h、rf_CmdHandle ch、rf_EventMask e);
    静态空 syncCallbackFxn (PIN_Handle handle、PIN_ID pinId);
    
    /***** 变量声明***** /
    static rf_Object rfObject;
    static rf_handle rfHandle;
    
    //引脚驱动程序句柄*/
    static PIN_handle ledPinHandle;
    static PIN_handle syncPinHandle;
    static PIN_State ledPinState;
    
    
    //包含用于接收数据的所有数据条目的缓冲区。
    需要* pragma 以确保此缓冲区是4字节对齐的(射频内核要求)*/
    #if defined (__TI_Compiler_version__)
    #pragma DATA_ALIGN (rxDataEntryBuffer,4);
    static uint8_t
    rxDataEntryBuffer[RF_queue_data_entry_buffer_size (NUM_DATA_entries,
    MAX_LENGTH、
    num_apped_Bytes)];
    #elif defined (__IAR_systems_icc_)
    #pragma DATA_alignment = 4
    static uint8_t
    rxDataEntryBuffer[RF_queue_data_entry_buffer_size (NUM_DATA_entries、
    MAX_LENGTH、
    num_apped_Bytes)];
    #elif defined (__Gnu_)
    static uint8_t
    rxDataEntryBuffer[RF_queue_data_entry_buffer_size (NUM_DATA_entries、
    MAX_LENGTH、
    num_apped_bytes)]
    __attribute__((aligned(4)));
    #else
    #error 不支持此编译器。
    #endif
    
    //接收用于射频内核的数据队列以填入数据*/
    静态 dataQueue_t dataQueue;
    静态 RFC_dataEntryGeneral_t* currentDataEntry;
    静态 uint8_t packetLength;
    静态 uint8_t* packetDataPointer;
    
    
    静态 uint8_t packet[MAX_LENGTH + CONFIDGE_LED_ENABLENGTH **在
    
    
    应用表中单独存储*/BINARGE*
    *-所有 LED 板 LED 均熄灭。
    */
    PIN_Config pinTable[]=
    {
    BOARD_PIN_LED2 | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、
    #IF 定义__CC1352R1_LAUNCHXL_Board_H__
    Board_DIO30_RFSW | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX、
    #endif
    PIN_TERMINATE
    };
    
    PIN_Config synctim[]={
    ioID_7 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_NEGEDGE、
    PIN_TERMINATE
    };
    
    /***** 函数定义***** /
    
    void * mainThread (void * arg0)
    {
    rf_params rfParams;
    rf_params_init (&rfParams);
    
    /*打开 LED 引脚*/
    ledPinHandle = PIN_OPEN (&ledPinState、pinTable);
    if (ledPinHandle ==空)
    {
    while (1);
    }
    
    synctiminHandle = PIN_OPEN (&synctimState、synctimTable);
    if (!syncPinHandle){
    /*初始化 SYNC 引脚时出错*/
    while (1);
    }
    
    PINCC26XX_setMux (syncPinHandle、IOID_7、PINCC26XX_MUX_RFC_GPO0);//设置 SYNC 引脚的回调*
    
    if (PIN_registerIntCb (synctimPinHandle、&syncCallbackFxn)!= 0){
    /*注册同步回调函数时出错*/
    while (1);
    }
    
    if (RFQueue_defineQueue (&dataQueue、
    rxDataEntryBuffer、
    sizeof (rxDataEntryBuffer)、
    num_data_entries、
    max_length + NUM_apped_bytes))
    {
    /*未能为所有数据条目分配空间*/
    while (1);
    }
    
    /*根据应用需求修改 CMD_PROP_RX 命令*/
    /*为接收的数据设置数据实体队列*/
    RF_cmdPropRx.pQueue =&dataQueue;
    /*丢弃来自 Rx 队列的已忽略的数据包*/
    rf_cmdProprx.rxConf.bAutoFlushIgnored = 1;
    /*丢弃来自 Rx 队列的 CRC 错误数据包*/
    rf_cmdPropRx.rxConf.bAutoFlushCrcErr = 1;
    /*实施数据包长度过滤以避免 PROP_ERROR_RXBUF */
    RF_cmdPropRx.maxPktLen = MAX_LENGTH;
    
    
    /*请求对讲机的访问*/
    rfHandle = rf_open (&rfObject、&rf_prop、
    (RF_RadioSetup*)&RF_cmdPropRadioDivSetup、&rfParams);
    
    /*设置频率*/
    rf_postCmd (rfHandle、(rf_Op*)&rf_cmdf、rf_PriorityNormal、NULL、0);
    
    while (1)
    {
    
    /*进入 RX 模式并一直保持在 RX 中*/
    RF_EventMask terminationReason= RF_runCmd (rfHandle、(RF_OP*)&RF_cmdPropRx、
    RF_PriorityNormal、回调(&R)、
    RF_EventRxEntryDone);
    
    switch (terminationReason)
    {
    案例 RF_EventCmdDone:
    //链中的无线电操作命令已完成
    中断;
    案例 RF_EventLastCmdDone:
    //独立无线电操作命令或最后一个无线电
    //链中的操作命令已完成。
    中断;
    案例 RF_EventCmd 取消:
    //命令在启动前被取消;这可能是导致的
    //按 RF_cancelCmd ()或 RF_flushCmd ()。
    中断;
    案例 RF_EventCmdAborted:
    //由 RF_cancelCmd ()或导致命令终止突然
    // rf_flushCmd ()。
    中断;
    案例 RF_EventCmdStopped:
    // RF_cancelCmd ()或导致正常命令终止
    // rf_flushCmd ()。
    中断;
    默认值:
    //未捕捉错误事件
    while (1);
    }
    
    uint32_t cmdStatus =(volatile rf_Op*)&rf_cmdPropRx)-> status;
    switch (cmdStatus)
    {
    案例 PROP_DONE_OK:
    //接收到的数据包,CRC 正常
    中断;
    PROP_DONE_RXERR 案例:
    //接收到的数据包带有 CRC 错误
    中断;
    案例 PROP_DONE_RXTIMEOUT:
    //同步搜索时观察到的结束触发
    中断;
    案例 PROP_DONE_break:
    //在命令为时接收数据包时观察到结束触发
    //配置的 endType 设置为1
    中断;
    案例 PROP_DONE_ENDended:
    //观察完结束触发后收到的数据包;如果
    //命令配置为 endType 设置为0,即结束触发器
    //不会终止正在进行的接收
    中断;
    案例 PROP_DONE_STOPPED:
    //命令启动后接收到 CMD_STOP,如果发现 SYNC,
    //数据包被接收
    中断;
    案例 PROP_DONE_ABORT:
    //命令启动后收到 CMD_ABORT
    中断;
    PROP_ERROR_RXBUF 案例:
    //没有足够大的 RX 缓冲区来存放处可用的接收数据
    //数据包开始
    中断;
    PROP_ERROR_RXFULL 案例:
    //在接收部分读取期间超出 RX 缓冲区空间
    中断;
    案例 PROP_ERROR_PAR:
    //观察到非法参数
    中断;
    PROP_ERROR_NO_SETUP 案例:
    //在受支持的中未设置无线电的情况下发送命令
    //模式使用 CMD_PROP_RADIO_SETUP 或 CMD_RADIO_SETUP
    中断;
    案例 PROP_ERROR_NO_FS:
    //发送命令而不对合成器进行编程
    中断;
    案例 PROP_ERROR_RXOVF:
    操作期间观察到// RX 溢出
    中断;
    默认值:
    //未捕获的错误事件-这些可能来自
    // rf_mailbox.h 中定义的状态池
    while (1);
    }
    }
    
    while (1);
    }
    
    void syncCallbackFxn (PIN_Handle handle、PIN_ID pinId){
    
    //执行某些
    
    操作}
    
    void 回调(RF_Handle h、RF_CmdHandle ch、RF_EventMask e)
    {
    IF (e 和 RF_EventRxEntryDone)
    {
    /*切换引脚以指示 RX */
    PIN_setOutputValue (ledPinHandle、Board_PIN_LED2、
    !PIN_getOutputValue (Board_PIN_LED2);
    
    /*获取当前未处理的数据输入*/
    currentDataEntry = RFQueue_getDataEntry();
    
    /*处理位于&currentDataEntry->data 的数据包数据:
    *-长度是当前配置的第一个字节
    *-数据从第二个字节开始*/
    电池组长度 =*(uint8_t*)(&currentDataEntry->data);
    packetDataPointer =(uint8_t*)(&currentDataEntry->data+1);
    
    /*将有效载荷+状态字节复制到数据包变量*/
    memcpy (packet、packetDataPointer、(packetLength + 1));
    
    RFQueue_nextEntry();
    }
    } 

    在 smartrf_settings.c 中:

    //覆盖 CMD_PROP_RADIO_DIV_SETUP
    静态 uint32_t pOverrides[]=
    {
    。
    。
    。
    (uint32_t) 0x008F88B3、
    HW_REG_OVERRIDE (0x1110、RFC_DBELL_SYSGPOCTL_GPOCTL0_RATGPO1)、
    (uint32_t) 0xFFFFFFFF、
    }; 

    Siri

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

    我发现、在启用同步字中断(使用(uint32_t) 0x008F88B3)之后、只有在 RFHWIEN 寄存器中相应的 MDSMSOFT 位为高电平时、RFHWIFG 中的 MDSMSOFT 位也会被置位。 使能位在每个上电周期变为低电平、但可以在 EasyLink Rx API 时直接在 API 代码中进行设置。

    我希望这对任何尝试设置同步字检测并且不想将其重定向到 PIN 的人都很有用。 当然、必须创建一个合适的 Hwi 对象。