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.

[参考译文] CC2500:配置

Guru**** 2386600 points
Other Parts Discussed in Thread: CC2500, CC1101
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/1505439/cc2500-configuration

部件号:CC2500
主题: CC1101中讨论的其他器件

工具/软件:

您好;

     我们需要使用最大长度大于255字节的数据包来通信 CC2500模块。

     当数据包大小大于64时、我们尝试多种方法。所有结果都与 CC2500的接收端仅重复的前64字节数据类似。

例如  

        数据包大小:90字节

       发送数据包:90 (数据包长度)、1 (地址)、ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678999abcdefghijklmnopqrstuvwxyz (支付加载_ 90字节)

       接收的数据包: 90 (数据包长度)、1 (地址)、ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345678999、1 (地址)、ABCDEFGHIJKLMNOPQRSTUVWXYZ

      我们需要帮助来解决这个问题。

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

    请参阅以下内容:

    (+) CC1101:CC1101:在可变长度模式下 TX 超过64字节的数据包-低于1GHz 论坛-低于1GHz - TI E2E 支持论坛

    Siri

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

    在接收器方面如何接收那90字节!!

    1.通过单次读取突发过程直接获取90字节数据。

    2.首先得到64字节、然后得到26字节

    3、首先获取64字节,得到20字节,得到6字节

    上述3种方法哪一种是正确的或有任何其他方法可用?

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

    当 FIFO 只有64个空间时、无法直接获得90个字节

    在开始读取之前、您不能等待 FIFO 有(64)个已满、因为它会随后溢出。

    正如我链接到的帖子中所述、您需要将  FIFO_THR 编程为一个值(您选择的值)。

    例如、如果您将其编程为14、则当您对 FIFO 信号产生中断(GDOx_CFG = 0)时、您知道 RXFIFO 中有60个字节。

    然后、您可以读取这些字节中的59个(由于此处介绍的 RX FIFO 问题 、请勿将 FIFO 清空:www.ti.com/.../swrz002)、并等待接收到的数据包信号生效(GDOx_CFG = 0x06)、然后您才能读取数据包中的提醒字节(如果您附加了这些字节、则可能为31 + 2个状态字节)。

    如果您知道您不会接收超过90字节的数据包、则应为该长度启用数据包长度过滤。

    Siri

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

    谢谢;

         现在我尝试了 https://www.ti.com/lit/swrz002中给出的相同步骤、 但同样我没有得到传输的正确数据。

        数据包大小:90字节

       TXD 数据 : 89(数据包长度)、ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789:;<=>?@ABCDEFGHIJ

       RXD Data:xZabcdefghijklmnopqrstuvwxyz01234567890123456789:;<=>?@ABCDEFGHIJabcdefghijklmnopqrstuvw

    uint16_t CC2500_Receive Packet_Polling (char * buffer、uint16_t maxLength)

          uint16_t bytesReceived = 0;
          uint8_t rxBytes;
          Bool Receive_Done = 0;

           //进入 RX 状态
           TI_CC_SPISTRONG (TI_CCxxx0_SRX);

          while (Receive_Done = 0)
          {
                rxBytes = TI_CC_SPIReadReg (TI_CCxxx0_RXBYTES)& 0x7F;

               if (rxBytes > 0)
               {
                   uint8_t bytesToRead =(rxBytes >(maxLength - bytesReceived))? (maxLength - bytesReceived): rxBytes;
                    bytesToRead -= 1;

                    IF (bytesToRead > 0)
                    {
                       TI_CC_SPIReadBurstReg (TI_CCxxx0_RXFIFO、&Buffer[bytesReceived]、bytesToRead);
                       bytesReceived += bytesToRead;
                    }
                    if (bytesToRead = 0)
                    {
                       Receive_Done = 1;
                    }
              }
          }

          *Buffer++= TI_CC_SPIReadReg (TI_CCxxx0_RXFIFO);

           返回字节已收到;
    }

    void CC2500_Transmit Packet_Polling (字符*数据、uint16_t 长度)

           uint16_t bytesLft =长度;
           uint16_t currentIndex = 0;
           uint8_t bytesToWrite;

           //进入空闲模式
           TI_CC_SPISTRONG (TI_CCxxx0_sidle);

           //清空 TX FIFO
           TI_CC_SPISTRONG (TI_CCxxx0_SFTX);

           //启动变速箱
           TI_CC_SPISTRONG (TI_CCxxx0_STX);

           //将第一个块写入 FIFO
           bytesToWrite =(bytesLeft > 64)? 第64章:我是
           TI_CC_SPIWriteBurstReg (TI_CCxxx0_TXFIFO、&DATA[currentIndex]、bytesToWrite);
           currentIndex += bytesToWrite;
           bytesLeft -= bytesToWrite,

           //在空间可用时继续填充 FIFO
          while (bytesLeft > 0)
          {
              uint8_t txBytes = TI_CC_SPIReadReg (TI_CCxxx0_TXBYTES);
              uint8_t spaceAvailable = 64 - txBytes;

              IF (可用空间> 0)
              {
                  bytesToWrite =(bytesLeft >可用空间)? 可用空间: bytesLeft;
                   TI_CC_SPIWriteBurstReg (TI_CCxxx0_TXFIFO、&DATA[currentIndex]、bytesToWrite);
                   currentIndex += bytesToWrite;
                  bytesLeft -= bytesToWrite,
              }
             //小延迟以防止 SPI 超限
             __ delay_cycles (100);
         }
    }

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

    甚至不确定我如何能收到任何与上面的代码.

    如果 rxBytes = TI_CC_SPIReadReg (TI_CCxxx0_RXBYTES)且0x7F;为1、则 bytesToRead 将为0 (即使您尚未开始读取任何内容、Receive_Done 将被设置为1)。

    我强烈建议您采用基于中断的实现而不是轮询、但如果您进行下面的更改、代码至少会起作用。

    我在 CC1101 + TrxEB 上进行了测试:

    #define PKTLEN      89  // Max packet length the radio is to receive
    #define MAX_LEN     PKTLEN + 3      
    
    static void initMCU(void);
    static void registerConfig(void);
    
    uint8 rxBuffer[1 + PKTLEN + 2];
    uint16_t bytesReceived;
    uint8_t rxBytes;
    bool Receive_Done;
    uint8_t bytesToRead;
    uint8_t length;
    uint8 writeByte;
    
    void main(void)
    {
        // initialize MCU and peripherals
        initMCU();
    
        // Write radio registers
        registerConfig();
        
        writeByte = PKTLEN;
        cc1101SpiWriteReg(CC1101_PKTLEN, &writeByte, 1); // Use length filtering
    
        while(1)
        {
            bytesReceived = 0;
            Receive_Done = 0;
            
            trxSpiCmdStrobe(CC1101_SRX);
            
            while (Receive_Done == 0)
            {
                cc1101SpiReadReg(CC1101_RXBYTES, &rxBytes, 1);
              
                rxBytes = rxBytes & 0x7F;
    
                if (rxBytes > 1)
                {
                    bytesToRead = (rxBytes > (MAX_LEN - bytesReceived)) ? (MAX_LEN - bytesReceived) : rxBytes;
                    bytesToRead -= 1;
    
                    if (bytesToRead > 0)
                    {
                        cc1101SpiReadRxFifo(&rxBuffer[bytesReceived], bytesToRead);
                        bytesReceived += bytesToRead;
                        length = rxBuffer[0] + 3; // Total bytes you are supposed to read from the FIFO (Length + payload + status)
                    }
                    if(bytesReceived == length - 1)
                    {
                        Receive_Done = 1;
                    }
                }
            }
            cc1101SpiReadRxFifo(&rxBuffer[bytesReceived], 1);
        }
    }
    

    Siri