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.

[参考译文] CC2640R2F:与 CC2400 CRC 兼容?

Guru**** 2398695 points
Other Parts Discussed in Thread: CC2400, CC2640R2F, CC2500, CC2640

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1126372/cc2640r2f-crc-compatible-with-cc2400

器件型号:CC2640R2F
主题中讨论的其他器件:CC2400CC2500CC2640

尊敬的 TI:

我们正在设计一款采用 CC2640R2F 的专有模式的新产品、我们需要从 CC2400接收数据包。但这 两个芯片之间的 CRC 似乎不同。是否有任何方法可以使这两个 CRC 兼容? 或者可以为我们提供 计算 CC2400 CRC 的代码?

此致、

LN

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

    您好!

    下面介绍了如何更改 CRC 设置:

    https://dev.ti.com/tirex/explore/content/simplelink_cc2640r2_sdk_5_30_00_03/docs/proprietary-rf/proprietary-rf-users-guide/proprietary-rf/packet-format.html#crc-calculation

    您还可以尝试使用 Smart RF Studio 对无线电设置进行实验、以分析数据包结构。

    此致、

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

    您好!

    感谢您的帮助。此 CRC 计算是"正常模式 CRC"、但 CC2400是特殊的、您能否向我展示如何更改与 CC2400兼容的 CC2640R2的 CRC 设置?  

    此致、

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

    查看文档、似乎两个芯片具有相同的 CRC 多项式。

    根据您发送的图、我们可以尝试设置 CMD_PROP_RADIO_SETUP 命令的 bMsbFirst formatConf 字段的值。

    可以尝试一下吗?

    此致、

    Arthur

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

    尊敬的 Arthur:

     根据您的建议,我们尝试设置"bMsbFirst = 0/1"、 当  bMsbFirst =1时、CC2640R2可以从 CC2400接收数据包、但 CRC 错误;

     当 bMsbFirst =0时、CC2640R2无法获取任何数据包。

    此致、

    LN

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

    我将尝试查看它。 您还能告诉我们您的对讲机设置吗?

    您在 CC2400上使用的比特率、偏差等。

    此致、

    Arthur

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Arthur:
    更多信息:我在 CC2500上进行了测试、如果设置 了 PKTCTRL0.CC2400_EN = 1、CC2500可以像 它应该的那样从 CC2400接收数据包。但是当该位清零时、CC2500不接收任何数据包。
     当   PKTCTRL0.CC2400_EN=0  时、CC2640R2F 也可以正确地从 CC2500获取数据包;但当 PKTCTRL0.CC2400_EN =1时不接收任何数据包;
    此致、
    LN
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Nan、您好!

    您能否尝试向我们展示实际的 CRC 数据? 为此、您可以在 SmartRFStudio 中将 CC2640的固定数据包长度扩展到13到15 (数据包 RX 测试中)。 这将极大地帮助我们确定参数是什么。

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

    尊敬的 Arthur:

    以下是两组不同的数据:

    75 f2 5F 72 40 02 5e af 99 F7 af 88 42 |-25 CRC 错误//固定长度13字节
    75 f2 5F 72 40 02 5e af 99 F7 af 88 42 AD b0 |-19 CRC 错误///固定长度 15字节


    75 f2 5F 79 40 07 5e 38 1a aa 2f 86 4b |-25 CRC 错误///固定长度 13字节
    75 f2 5F 72 40 07 5e 38 1a ac  2f 86 4b AD 3c |-24 CRC 错误///固定长度 15字节

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

    您好、Nan、

    CC2400使用什么数据编码(GRMDM.DATA_FORMAT[1:0])? 您可能需要考虑在 两者上尝试曼彻斯特(尽管不建议对 CC2640R2F 使用传统解决方案)。  TA12012讨论了用于此 相关 E2E 主题中8/10编码的 SimpleLink 软件解决方案。

    此致、
    Ryan

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

    您好、Ryan、

    我在两者都尝试曼彻斯特、但仍然不起作用。

    我认为唯一的问题是不同的 CRC 规则。CC2640R2可以正确接收来自 CC2400的数据、但 CRC 排除了错误。

    TI 的代码是否显示 CC2400 (或 CC2500   PKTCTRL0.CC2400_EN = 1) CRC 算法?

    我在这两个芯片之间发布了不同的内容:

    https://www.ti.com/lit/an/swra111e/swra111e.pdf?ts=1660712307240&ref_url=https%253A%252F%252Fwww.google.com%252F

    此致、

    LN

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

    Nan、您好!

    以下是模仿 CC2400中使用的算法的 C++代码:

    #include <bitset>
    #include <vector>
    #include <iostream>
    
    std::vector<uint16_t> packet1 = {0x08,0x00,0x00,0x48,0x65,0x6c,0x6c,0x6f};
    std::vector<uint16_t> packet2 = {0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0,0xF1,0xE2,0xD3,0xC4,0xB5,0xA6,0x07};
    
    uint16_t new_crc_value(uint16_t poly, uint16_t crc_register, uint16_t byte_in)
    {
        std::bitset<16> temp1;
        std::bitset<16> temp2;
        std::bitset<16> byte_in_bs;
        std::bitset<16> poly_bs;
    
        byte_in_bs = byte_in;
        poly_bs = poly;
        temp1 = crc_register;
        for (int j = 0; j <= 7; j++)
        {
            temp2[0] = temp1[15] ^ byte_in_bs[7 - j];
            for (int i = 1; i <= 15; i++)
            {
                if (poly_bs[i] == true)
                {
                    temp2[i] = temp1[15] ^ temp1[i - 1];
                }
                else
                {
                    temp2[i] = temp1[i - 1];
                }
            }
            temp1 = temp2;
        }
        return (uint16_t)temp1.to_ullong();
    }
    
    uint16_t crc_cc2400(std::vector<uint16_t> data)
    {
        std::bitset<16> CRC_POL_16{0x8005};
        std::bitset<16> CRC_New{0x0000};
        std::bitset<16> CRC_Data_int{0x0000};
    
        for (uint16_t data_byte: data)
            {
                    CRC_New = new_crc_value(CRC_POL_16.to_ullong(), CRC_Data_int.to_ullong(), data_byte);
                    CRC_Data_int = CRC_New;
            }
    
        return CRC_Data_int.to_ullong();
    }
    
    int main()
    {
        std::cout << std::hex << crc_cc2400(packet1) << std::endl;
        std::cout << std::hex << crc_cc2400(packet2) << std::endl;
        return 0;
    } 

    请告诉我们这是否对您有用。 但是、正如您可能已经知道的、您必须禁用 CC2640侧的 CRC 校验、并自行计算 CRC。

    此致、

    Arthur

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

    尊敬的 Arthur:

    它可以正常工作、但 使用 CC2640R2需要太多时间(>2ms)、 我们只有200us 的 时间来计算 CRC、 您能给我们一个 CRC 表吗?

    此致、

    LN

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

    你好、LN、

    TI 不提供此功能、您需要根据 给定的代码/数据生成 CRC 表。

    此致、
    Ryan