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.

[参考译文] RTOS/CC1310:地址过滤CC1310以进行多对一通信

Guru**** 2394305 points


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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/661970/rtos-cc1310-address-filtering-cc1310-for-many-to-one-communication

部件号:CC1310
主题中讨论的其他部件:SimpliciTI

工具/软件:TI-RTOS

你好

这是以下线程:  

如上一条评论中所述,我尝试了地址过滤器方法,方法是将其添加到地址过滤器数组中。 我是否需要为2个单独的TX模块分别将rf_prop_cmd.h中的address0分配给0xAA和0xbb?

我的代码如下所示

txPacket[0].payload[0]=(uint8_t)(seqNumber >>8);
txPacket[0].payload[1]=(uint8_t)(seqNumber+);

txPacket[1].payload[0]=(uint8_t)(seqNumber >>8);
txPacket[1].payload[1]=(uint8_t)(seqNumber++);

uINT8_t i;
对于(I = 2;I < RFEASYLINKTXPAYLOAD_LENGTH;I++)
{
txPacket[0].payload[i]= 0x01; ////////////////////////////////////////////////////////// Ping
txPacket[1].load[i]= 0x01;
}

txPacket[0].len = RFEASYLINKTXPAYLOAD_length;
txPacket[1].len = RFEASYLINKTXPAYLOAD_length;


txPacket[0].dstAddr[0]= 0xAA;
txPacket[1].dstAddr[0]= 0xbb;


void timerCallback (GPTimerCC26XX_Handle Handle,GPTimerCC26XX_IntMask斩波掩码)
{

EasyLink_eXcisync (&txPacket[0],txDoneCb);//////////////////// 用于TX模块0xAA
// CPUdelay(800*50);
EasyLink_receiveAsync (rxDoneCb,0);
strcpy (TxDeets[0].id,"发射器1");
TxDeets[0].value = rxPacket.Payload[2];

// CPUdelay(800*50);

EasyLink_eXsync(&txPacket[1],txDoneCb);//////////////////////////////////// 用于TX模块0xab
// CPUdelay(800*50);
EasyLink_receiveAsync (rxDoneCb,0);
strcpy (TxDeets[1].id,"发射器2");
TxDeets[1].value = rxPacket.Payload[2];}/////////////////////////////////////////////////////////////////////////////////////////////


计时器配置和回调

我正在使用0x01加载两个单独的txPacket的有效负载,接收器将ping两个单独的Tx模块。 正如我所做的那样,我将值传输并接收到结构TxDeets中

计时器回调功能中的两个发射器模块分别进行一个一个一个一个一个一个一个再一个。此活动应在设置值(以秒为单位)后重复。

我通过以下方式使用了地址过滤器:

UINT8_t addrFilter[EasyLink_MAX_ADDR_SIZE *  
EasyLink _MAX_ADDR_filters]={0xAA,0xbb};
EasyLink_enableRxAddrFilter(AddrFilter, 2,2);  

我的问题是1)这是否是处理事情的正确方式,如果不是,我该怎么做?

2)如何设置发送器模块的地址(0xAA/0xbb)?

巴西

Shubhankar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    既然您问这是否是正确的方法,我认为这不起作用。 如果是这种情况,哪些方法无效?

    如果简化了此操作,一个使用rfEasyLinkRx的节点和一个或多个使用rfEasyLinkTx的节点,那么它是否工作?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Torstein

    你说的对,它不起作用。 我在上面尝试的方法是使用一个Rx和两个Tx。 我最大的疑问是第2点。 如何为Tx模块分配正确的地址(0xAA,0xab)。 因为Rx必须ping第一个Tx,收集数据,然后继续ping第二个Tx。

    那么,如何将地址分配给Tx模块?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    首先尝试使其与一个RX和一个TX配合使用。 哪些确实不起作用?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,之三

    它显然适用于一个Tx和Rx。 我想知道如何指定Tx模块的地址,以便RX一次只能ping特定TX模块。仅此而已。

    巴西

    Shubhankar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果地址过滤适用于1 RX和1 TX,则您已成功在TX节点中正确设置地址。

    请显示您计划如何在2 TX和1 RX的案例中进行通信的图表,以及在此流程中不起作用的确切内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    这是一个很长的帖子。 我在此处附加一张图片以显示我的应用程序。 在一个Tx和一个Rx模块中,这是代码中的配置

    在rfEasyLinkTx.c
    
    txPacket.dstAddr[0]= 0xAA中;
    
    
    
    在rfEasyLinkRx.c
    
    #ifdef RFEASYLINKRX_ADDR_filter中
    UINT8_t addrFilter = 0xAA;
    EasyLink_enableRxAddrFilter(&addrFilter, 1,1);
    

    上面的代码片段用于显示发送器如何识别接收器。 显然,dstAddr和addrFilter匹配和通信是成功的。

    根据我的申请,下面是我所做的事情;

    rfEasyLinkTx.c
    
    uint8_t addrFilter[EasyLink_MAX_ADDR_Size *//////////////////////////////////////////////////////////////// Shubhankar评论
    EasyLink _MAX_ADDR_filters]={0xAA};
    EasyLink _enableRxAddrFilter (addrFilter,1,1);///////////////////////////////////////////////////////////////// 从1
    
    更改为2 txPacket[0].dstAddr[0]= 0x64;//100
    txPacket[1].dstAddr[0]= 0x65;//101
    
    
    rfEasyLinkRx.c
    
    uint8_t addrFilter[EasyLink_MAX_ADDR_Size * EasyLink_MAX_ADDR_filters]={0xxx64};EasyLink_Addr1;
    Addr1
    
    
    
    

    rfEasyLinkRx将进入地址为0x64和0x65的两个发射器中的每个发射器。它们与地址为0xAA的主接收器通信。

    rfEasyLinkTx将进入主接收器,该接收器必须使用单独的数据包ping (0x01) ping 0x64和0x65,收集数据并存储在结构中。

    在rfEasyLinkTx.c
    
    EasyLink_eXtasync (&txPacket[0],txDoneCb)中;////////////////////// 对于TX模块0xAA
    EasyLink_receiveAsync (rxDoneCb,0);
    TxDeets[0].value = rxPacket.PAYLOAD [2];
    
    
    CPUdelay (800*50);
    
    EasyLink–传输Async (&txPacket[1],txDoneCb);////////////////////////// 对于TX模块0xab
    EasyLink_receiveAsync (rxDoneCb,0);
    
    TxDeets[1].value = rxPacket.PAYLOAD [2];
    

    以上代码是两个发射器的发射和接收。 使用断点时,它可以按顺序完美地工作。传输和接收函数对两个模块都是命中的。但rxPacket.payload
    值仍显示0。 现在,我分别将发送器1和发送器2的txPacket有效载荷设置为0x05和0x06。 这意味着接收器没有收到任何值,因为rxPacket为0。

    对我可能做错了什么有任何见解? 我怀疑存在地址问题,因为正如我所说,断点按预期顺序命中。请帮我解决。下面是我的体系结构

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

    您好,

    我是否有任何关于我应该做什么的见解?

    巴西

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为以下情况会导致问题:

    EasyLink_eXcisync (&txPacket[0],txDoneCb);//////////////////// 用于TX模块0xAA
    EasyLink_receiveAsync (rxDoneCb,0);
    TxDeets[0].value = rxPacket.Payload[2];

    如果您查看EasyLink示例,它们将使用信号来控制数据包的实际传输/接收。 在RX中设置对讲机后,您尝试直接读取有效负载。 查看示例并重写代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    我在Rx和TX的两个回调函数中都发布了信号。 仍然没有运气。 解决是否是一个问题?

    巴西

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您现在能否展示如何重写此代码:

    EasyLink_eXcisync (&txPacket[0],txDoneCb);//////////////////// 用于TX模块0xAA
    EasyLink_receiveAsync (rxDoneCb,0);
    TxDeets[0].value = rxPacket.Payload[2];
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    这部分仍然是一样的。 下面是回调函数

    #ifdef RFEASYLINKTX_Async
    static semaphore_handle txToneSem;
    static semaphore_handle rxToneSem;
    
    #endif //RFEASYLINKTX_Async
    
    #ifdef RFEASYLINKTX_Async
    void txDoneCb (EASYLink_Status status){
    
    如果(状态== EasyLink状态成功)
    {
    /*切换LED1以指示TX */
    PIN_setOutputValue (pinHandle,Board_PIN_LED1,!PIN_getOutputValue (Board_PIN_LED1));
    }
    否则,如果(status == EasyLink_Status_Aborted)
    {
    /*切换LED2以指示命令已中止*/
    PIN_setOutputValue (pinHandle,Board_PIN_LED2,!PIN_getOutputValue (Board_PIN_LED2));
    }
    否则
    {
    /*切换LED1和LED2以指示错误*/
    PIN_setOutputValue (pinHandle,Board_PIN_LED1,!PIN_getOutputValue (Board_PIN_LED1));
    PIN_setOutputValue (pinHandle,Board_PIN_LED2,!PIN_getOutputValue (Board_PIN_LED2));
    }
    
    semaphore_post(txDoneSem);
    }
    
    void rxToneCb (EasyLink_RxPacket * rxPacket, EasyLink_Status status)
    {
    如果(状态== EasyLink状态成功)
    
    {
    /*切换LED1,清除LED2以指示回波RX */
    PIN_setOutputValue (pinHandle,Board_PIN_LED2,!PIN_getOutputValue (Board_PIN_LED2));
    //PIN_setOutputValue (pinHandle,Board_PIN_LED2,0);
    }
    否则,如果(状态== EasyLink状态_已中止)
    {
    /*设置LED2并清除LED1以指示中止*/
    PIN_setOutputValue (pinHandle,Board_PIN_LED2,1);
    Pin_setOutputValue (pinHandle,Board_PIN_LED1,0);
    }
    否则
    {
    /*同时设置LED1和LED2以指示错误*/
    PIN_setOutputValue (pinHandle,Board_PIN_LED1,1);
    Pin_setOutputValue (pinHandle,Board_PIN_LED2,1);
    }
    
    Semaphore_post(rxDoneSem);//////////////////////////////////////////////////////////////////////////////////////// 由于上次的问题(Shubhankar)
    }
    #endif //RFEASYLINKTX_Async,应将其删除 

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

    EasyLink_eXcisync (&txPacket[0],txDoneCb);//////////////////// 用于TX模块0xAA
    EasyLink_receiveAsync (rxDoneCb,0);
    TxDeets[0].value = rxPacket.Payload[2];

    我的理解是,代码将在收到任何内容之前转到最后一行。 因此,您设置了一个等于未知值的变量,因为在此阶段尚未调用回调。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,之三

    正如我前面提到的那样,断点依次对所有3条语句进行了攻击。 这应该意味着收到了有效负载,不是吗? 如果不能,您能否建议另一种方式?

    巴西

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

    您是否都是通过逐行逐行浏览代码来进行调试? 这应确保在下一行之前收到发送/接收的数据包,但您是否还会在您正在调试的另一台设备上执行步骤?

    如果您看一下示例,它们在信号量上处于待定状态:

    EasyLink_receiveAsync (rxDoneCb,0);
    
    /*等待300毫秒接收Rx */
    IF (semaphore_pend (rxToneSem,(30万 / Clock_tickPeriod))= FALSE)
    {
    /* RX超时中止*/
    IF(EasyLink_abort()== EasyLink_Status_Success )
    {
    /*等待中止*/
    semaphore_pend(rxDoneSem, bios_wait_forever);
    }
    } 

    阅读rfEasyLinkRx/Tx示例,了解它们如何使用异步版本的命令。   

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

    您好,

    我在EasyLink示例中介绍了这一点,并添加了您为Tx和Rx发布的循环,如示例所示,单独的信号。 尽管如此,rxPacket有效负载中仍没有值

    此外,发送和接收被置于计时器回调中,该回调必须在计时器时间过后运行,以形成连续回放。 在rxDoneCb f'n中添加信号后,此操作已停止

    巴西  

    Shubhankar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否有我可以使用最新代码测试的最低CCS项目?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,我现在正在处理一个包含所有更新的更改的问题。

    我有没有办法在这里上传? 我还在以433M的转接并使用EasyLink API。 SmartRF设置文件已相应更改。

    告诉我如何上传

    谢谢,此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您按"回复此帖子",您将在您撰写的框下看到一些蓝色文本,显示"插入代码,附加文件等..."。 按下此按钮并选择插入文件图标。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,之三

    因此,在过去2天内,我尝试寻找一种不同的解决方案方法,并取得了一些进展。 我分别使用rfEasyLinkEchoTx和rfEasyLinkEchoRx以及的地址过滤技术

    多对一通信。 结果是,接收器接收的测试数据包确实传输了值,但没有更新到我打算存储有效负载值的结构

    来自所有5个发射器。rxPacket.payload显然会被覆盖。

    我将在此处为您的reference.e2e.ti.com/.../echoRx.txte2e.ti.com/.../echoTx.txt附加rfEasyLinkEchoTx.c和rfEasyLinkEchoRx.c的C文件

    只需将这些文件分别复制粘贴到我提到的项目(SDK 1.6)中。rfEasyLinkEchoTx.c中的rxPacket.payload显示测试值0x05,证明它已收到数据包,但其结构为TxDetails

    流值仍显示0。 帮助我解决这一问题:

    TxDetails[txCounter].flowValue = rxPacket.Payload[4];

    我尝试了对rxPacket进行拼写,但仍然不起作用。 我打算为我的5个发射器循环这些信号,它们将运行rfEasyLinkEchoRx项目。

    巴西  

    Shubhankar

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

    你好,之三

    您是否对此有任何更新?

    巴西

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

    您好,TER

    我的问题现已解决。 结果是我必须使用回调函数本身中的指针访问rxPacket结构,以便将我的值存储在结构中。 我最后也分别使用rfEasyLinkEchoTx和Rx来运行应用程序。 感谢您的参与,TER!