EDN首页   博客首页

日志档案

发表于 2008-4-17 22:18:37

2

标签: CC2510  

无论发送方是采用定长还是变长分组方式都能接收的代码(未完成)

目标:

无论发送方是采用定长还是变长分组方式,分组格式如何,是否有CRC等,接收节点都能够正确接收。

当然,还有不少前提条件:
* 频率一致;
* 数据速率一致;
* 前导码及帧分隔标志一致;


该程序可以用来测试CC2510的行为。

比如:发送节点发送固定长度(比如100字节)的分组,第1个字节的内容为30。而接收节点设置为变长接收,则是否接收节点的上层应用仅能收到30字节的数据?

因此,用作sniffer的话,接收节点是否应该使用固定长度(最大长度)的接收方式,而且禁止CRC检验。这样才可以同时接收有CRC校验和没有CRC校验、变长和固定长度的数据分组。

主要代码:
  //直接轮询接收,不使用中断
  while (1) {

    //reset pointer
    length =0;

    RFIF &= ~IRQ_DONE;

    //enter receive mode
    SRX();

    while (!(RFIF & IRQ_DONE)) {
      //check whether receive finished
      if (RFTXRXIF) { //a byte received
        pBuffer[length] = RFD;
        length ++;

        RFTXRXIF = 0;
      }
    }
    //RX DONE
    if (length >0) {
      modUartSendPkt(0, length, pBuffer);
      P1_0 = !P1_0; //toggle led
    }
    SIDLE();

  }


运行结果:
PC收到的数据,分组内容的长度不是16,而是255:

0D 0A FF 0D 02 01 00 79 31 32 33 34 35 36 37 38 39 7F 0A 36 DF EC CF D7 FE BF EB DD FF E7 F7 DF FF F8 9A CF 7F FC B1 77 7B ED F3 4E AF FF ED 5F FE DF EC 64 1B 9F DF B9 B9 CC 1F F4 F6 FB C0 CB FE DB DF 7E FF FB 1F FE 3E DE 44 5F F1 B8 AF 36 A5 0A FE 9F F4 DD CF 8F 7F BF F7 B1 41 DF E3 EE F0 B0 AA DC 77 2F FD FE 9F F2 0D C8 4E CD 86 7E 23 6E B3 67 FD 51 CF 52 E2 FC 6B CF CA 5C 6D 0A D7 E7 F2 6F E6 9E B9 74 FF 7D 5C FC 3E F0 BC 7C 76 9B C4 D9 45 7F 9F EB 2B 49 96 FB F3 7A EF F9 77 DB D5 F1 01 9A 79 FE BD F7 51 BE F2 FB 1F 6F BB B4 67 F7 39 F7 AB BA B9 E6 FF CE 53 61 0E BE F4 DB BA C5 6E 7F 8E 17 FE 7B 53 F7 9E BF E2 73 2F FF BC 33 FE 32 2C FE BE F9 09 8B C7 36 BB 6F DD BE 98 1B 2F FB ED AB F3 CC 8E 9D 7F 57 EB F7 6C BF 63 B9 E7 EE 92 BD E3 BC B8 4C 36 99 8C ED 6C 19

 

系统分类: 单片机   |   用户分类: CC2430/2510软件设计   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(180)    回复(3)  

投一票您将和博主都有获奖机会!

最新评论

  • lanzhoo

    2008-4-17 22:21:39

    改用CCA判断作为接收的结束,结果仍然一样。 修改MCSM1的值,原来是0x2F。改为0x0F试试。 结果一直没有收到数据。程序停在if (RFTXRXIF) {语句上。IRQ_CCA标志一直为0。PKTSTATUS一直是0xB0。 改为0x1F试试。 也不行。 设置MCSM2,将bit4设为1。 结果也是什么都收不到。

  • emot

    2008-4-18 0:37:53

    关注!

  • lanzhoo

    2008-4-19 0:35:09

    使用carrier sense标志(PKTSTATUS.CS)来判断分组的结束,有一定可行性。 所谓一定,是测试时发现分组的末尾多收到1到2个字节,一定会多收到。但至少比之前的非收足PKTLEN个字节要好。 主要代码为: while (1) { //reset pointer length =0; //enter receive mode SRX(); //wait for SFD while (!SFD); //receive bytes while (1) { //check whether receive finished if (!CS) { //carrier sense break; } // if (RFTXRXIF) { //a byte received pBuffer[length] = RFD; length ++; RFTXRXIF = 0; // } } SIDLE(); //RX DONE if (length >0) { modUartSendPkt(0, length, pBuffer); P1_0 = !P1_0; //toggle led } } //RF寄存器的初始化 void initRf(){ halRfConfig(frequency); //在halRfConfig()中对各RF寄存器作了设置。 // MCSM1 = 0x2F; //keep in RX mode //设置固定长度方式,长度为最大值 //disable data whitening //disable crc check PKTCTRL0=0x00; PKTLEN=0xFF; //maximum //disable interrupts INT_GLOBAL_ENABLE(INT_OFF); }