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.

[参考译文] MSP430FR5739:将 MSP432E401Y 上生成的硬件 CRC16 CCITT 与 MSP430FR5739上的16位硬件 CRC-CCITT-BR 相匹配

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1162826/msp430fr5739-matching-hardware-crc16-ccitt-generated-on-msp432e401y-to-16-bit-hardware-crc-ccitt-br-on-msp430fr5739

器件型号:MSP430FR5739
主题中讨论的其他器件: MSP432E401Y

尊敬的 TI 专家:  

我正在 MSP432E401Y 和 MSP430FR5739之间建立通信协议、这需要生成16位硬件 CRC。 我正在使用 MSP432和 MSP430上的驱动程序库与每个 CRC 驱动程序进行连接、以生成16位 CRC。 驱动器的数据输入一次为1字节(unsigned char 或 uint8_t 类型)。

MSP432有多种 CRC 标准可供选择、但最接近 MSP430的是 CCITT 选项。 MSP430具有16位 CRC-CCITT-BR (BR=字节反转?) 标准(无法更改)、因此与 MSP432不完全相同。

下面是我正在关注的 MSP432E401Y 示例、经过修改后显示了我的 CRC 配置和输入的参数。 我为其创建校验和的数据也是相同的。 CRC16 结果 =无符号短整型11111101110100b (二进制)

/*
 *  ======== crc.c ========
 */
#include <stdint.h>
#include <stddef.h>
#include <stdlib.h>

/* Driver Header files */
#include <ti/drivers/CRC.h>

/* Driver configuration */
#include "ti_drivers_config.h"

/* Expected CRC for CRC_32_IEEE with full endianness reversal */
static const uint32_t expectedCrc = 0x4C4B4461;

/* Example test vector */
static const size_t srcSize = 3;
static const uint8_t src [] = {
    0x02,0x08,0x01
};


/* ======== mainThread ======== */
void *mainThread(void *arg0)
{
    int_fast16_t status;
    uint16_t result;

    CRC_Handle handle;
    CRC_Params params;

    /* Initialize the drivers */
    CRC_init();

    /* Set data processing options, including endianness control */
    CRC_Params_init(&params);
    params.byteSwapInput = CRC_BYTESWAP_UNCHANGED;
    params.returnBehavior = CRC_RETURN_BEHAVIOR_BLOCKING;
    params.polynomial = CRC_POLYNOMIAL_CRC_16_CCITT;
    params.dataSize = CRC_DATA_SIZE_8BIT;
    params.seed = 0xFFFF;

    /* Open the driver using the settings above */
    handle = CRC_open(CONFIG_CRC_0, &params);
    if (handle == NULL)
    {
        /* If the handle is already open, execution will stop here */
        while(1);
    }

    /* Calculate the CRC of all 32 bytes in the source array */
    status = CRC_calculateFull(handle, src, srcSize, &result);
    if (status != CRC_STATUS_SUCCESS)
    {
        /* If the CRC engine is busy or if an error occurs execution will stop here */
        while(1);
    }

    /* Close the driver to allow other users to access this driver instance */
    CRC_close(handle);


    return NULL;
}

下面是我正在关注的 MSP430FR5739的示例代码、经过修改后显示了我的配置、参数和输入的数据。 生成的 CRC16  crcResult = unsigned int 1011011111011001b (二进制)  

#include "driverlib.h"

uint16_t crcResult;

void main (void)
{
    uint16_t crcSeed = 0xFFFF;
    uint8_t data[] = {0x02,
                           0x08,
                           0x01};

    uint8_t i;

    //Stop WDT
    WDT_A_hold(WDT_A_BASE);

    //Set P1.0 as an output
    GPIO_setAsOutputPin(
        GPIO_PORT_P1,
        GPIO_PIN0);

    //Set the CRC seed
    CRC_setSeed(CRC_BASE,
        crcSeed);

    for (i = 0; i < 5; i++)
    {
        //Add all of the values into the CRC signature
        CRC_set8BitDataReversed(CRC_BASE,
            data[i]);
    }

    //Save the current CRC signature checksum to be compared for later
    crcResult = CRC_getResult(CRC_BASE);

    //Enter LPM4, interrupts enabled
    __bis_SR_register(LPM4_bits);
    __no_operation();
}

我已经尝试在 MSP430上输入反转字节、希望在没有反转字节的情况下返回 CCITT 标准、因此我可以将其与 MSP432上的 CCITT CRC16标准匹配。 但是、我可能会实施这种错误。 可以有人告诉我如何修改 MSP430或 MSP432上的此示例代码、以便与两个器件上计算出的 CRC 相匹配。

希望这可以通过使用这两个器件上的硬件 CRC 生成器来实现。 希望找到解决方案。

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

    最初使用 MSP432E401Y 器件型号发布。 我被要求 打开一个新的 TT、为器件型号指定 MSP430。

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

    您好、Parryh、

    作为 FYI、CRC-CITT-BR 模块中的 BR 看起来表示位反转、而不是字节反转。 更多信息、请参阅《MSP430FR57xx 系列用户指南》的第9节。 MSP432E401Y 在 CRCCTRL 寄存器中似乎还具有位反转选项。

    此外、在 for 循环中、您访问的阵列数据的索引4是多少、但该阵列只有3个元素、因此 您馈入 CRC 模块的数据可能是超过该点的任何数据。

        for (i = 0; i < 5; i++)
        {
            //Add all of the values into the CRC signature
            CRC_set8BitDataReversed(CRC_BASE,
                data[i]);
        }
    

    uint8_t data[] = {0x02,
                        0x08,
                        0x01};

    此致、
    Brandon Fisher

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

    感谢您让我了解 Brandon。 我对此进行了进一步的调查、发现 MSP430 I 计算出的 CRC 是正确的。 MSP432的运行方式不是这样。 我在 MSP432器件型号 (2) MSP432E401Y 下打开了一个新 TT:16位 CCITT 标准的硬件 CRC 始终具有0xFF 的高字节-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛。  也许您可能已经了解了这种情况的发生原因?

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

    您好、Parryh、

    感谢您的确认。 我将让 MSP432专家对该主题发表意见。  理论上、CRC 模块唯一可能出错的问题是设置或输入的数据。 在 驱动程序级别、您的 MSP432设置似乎可以、我知道您尝试以不同的顺序输入数据。  

    是否可以尝试将 CRC 种子值设置为0xFFFF FFFF? 该种子寄存器是一个32位寄存器、正在初始化为0xFFFF、因此从技术上讲、它将是0x0000 FFFF。 我不确定 MSP432中的 CRC-16算法是如何处理的、但这应该是一个简单的检查。

    之后、id 建议在调试模式下运行此代码、并查看 CCS 中 CRC 模块的寄存器视图。  我会将 CRCCTRL 寄存器值与您的预期设置进行比较。  

    此致、
    Brandon Fisher

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

    实际上、MSP430确实有选项。 有一个用于数据输入的 CRCDI 和 CRCDIRB 寄存器。 RB 寄存器反转位顺序。 结果寄存器也有两个版本。 也许您使用的驱动程序库并不提供所有这些选项、而是硬件提供的选项。

    计算如何获得预期结果可能会有点繁琐。 当我想编写一些代码来提供软件 CRC 或在可用时使用硬件时、我就这样做了。