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.

[参考译文] UCC5870-Q1:SPI TX CRC 校验

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1097165/ucc5870-q1-spi-tx-crc-check

器件型号:UCC5870-Q1

你好。

我不熟悉 UCC5870、现在我尝试实施 SPI 通信。  现在、我卡在 CRC 校验处。
无法从 CRCx 寄存器读取 TX CRC 数据。 值每次都会更改。 我的实施中有什么问题。
我写入 TX CRC 寄存器、然后读取它、但每次读取的值都会改变。

2.我已经执行了数据表的示例

 tx_data.all = 0xFC00;
    crc_calc_data.all = SWAP_UI16(tx_data.all);
    crc = crc8_update( crc, &crc_calc_data.all, 2 );
    msg.ptr_tx_data = tx_data.byte;
    msg.tx_data_size = 2;
    hal_spi_master_transfer_blocking( &mgl_spi_handle[select], &msg, 100 );

    tx_data.all = 0xFA58;
    crc_calc_data.all = SWAP_UI16(tx_data.all);
    crc = crc8_update( crc, &crc_calc_data.all, 2 );
    msg.ptr_tx_data = tx_data.byte;
    msg.tx_data_size = 2;
    hal_spi_master_transfer_blocking( &mgl_spi_handle[select], &msg, 100 );

    tx_data.all = 0xFB2A;
    crc_calc_data.all = SWAP_UI16(tx_data.all);
    crc = crc8_update( crc, &crc_calc_data.all, 2 );
    msg.ptr_tx_data = tx_data.byte;
    msg.tx_data_size = 2;
    hal_spi_master_transfer_blocking( &mgl_spi_handle[select], &msg, 100 );

    tx_data.all = 0xFC13;
    crc_calc_data.all = SWAP_UI16(tx_data.all);
    crc = crc8_update( crc, &crc_calc_data.all, 2 );
    msg.ptr_tx_data = tx_data.byte;
    msg.tx_data_size = 2;
    hal_spi_master_transfer_blocking( &mgl_spi_handle[select], &msg, 100 );

    // check CRC
    tx_data.all = 0xFA00;
    crc_calc_data.all = SWAP_UI16(tx_data.all);
    crc = crc8_update( crc, &crc_calc_data.all, 1 );
    tx_data.byte[0] = crc;
    msg.ptr_tx_data = tx_data.byte;
    msg.tx_data_size = 2;
    hal_spi_master_transfer_blocking( &mgl_spi_handle[select], &msg, 100 );

但是、如果我向 CRC2032写入错误的 CRC 值、我将不会获得故障状态

3.如果我写入 SPITEST、我不会获得故障状态。

您是否有任何有关 CRC 用法的代码示例?
感谢你的帮助。
托比亚斯

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

    您好 Tobias、

    我们目前没有 CRC 使用的示例代码。 让我回顾一下您的实施情况、下周我将提供更新。

    此致、

    Andy Robles

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

    您好 Andy。
    您有一个 CRC 使用示例吗?
    此时我不使用 CRC 函数。
    谢谢 Tobias

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

    Tobias、您好!

    感谢您的回答!  Andy 现在就出去了、但应该在本周结束前回来。

    亚伦

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

    您好 Tobias、

    感谢您的耐心等待。

    [~引号 userid="161143" url="支持/power-management-group/power-management/f/power-management-forum/1097165/ucc5870-Q1-SPI-TX-CRC-check"]1. 我无法从 CRCx 寄存器读取 TX CRC 数据。 值每次都会更改。 我的实施中有什么问题。
    我写入 TX CRC 寄存器、然后读取它、但每次读取的值都会改变。 [/报价]

    当您写入 CRC_TX 位时、栅极驱动器将比较存储的 CRC_TX 数据和您写入该寄存器的值。 比较后、栅极驱动器会将 CRC_TX 数据位重置为默认值0xFF。

    • 仅为了阐明、每次写入 CRC_TX 数据位(将 CRC_TX 位重置为默认值0xFF)时、您都会发送读取命令来读取该寄存器、每次都会获得不同的值? (即 只有读和写命令才会发送到 CRCATA 寄存器、不会发送其他命令)
    [引用 userid="161143" url="~/support/power-management-group/power-management/f/power-management-forum/1097165/ucc5870-Q1-SPI-TX-CRC-check"]但如果我向 CRCn 写入错误的 CRC 值、我不会获得故障状态

    我在您的示例中看到您发送了错误的 CRC 数据来触发故障(与数据表示例类似、计算值应为0x30、但发送值为0x00)。

    • 您能否确认、当您说您没有获得故障状态时、您意味着您读取 STATUS2寄存器位9 (SPI_FAULT)并且没有看到故障(位9 = 0x1;FAULT)?
    [~引号 userid="161143" url="支持/power-management-group/power-management/f/power-management-forum/1097165/ucc5870-Q1-SPI-TX-CRC-check"]3. 如果我写入 SPITEST、我不会获得故障状态。
    • 这是不寻常的。 向该寄存器写入非零值将触发 STATUS2寄存器位4 (CFG_CRC_PRI_FAULT)。
      • 写入该寄存器时、您能否确认天气、您是否在任何 STATUSx 寄存器触发器中看到任何故障?

    此致、

    Andy Robles

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

    你好

    我认为我有一些基本 的理解问题。
    HO 我是否得到 SPI 故障:
    使用代码:

        // reset CRC
        ctrl1.all = 0;
        ctrl1.bit.CLR_SPI_CRC = 1;
        ucc5870_write_register( select, OFFSET_CONTROL1, ctrl1.all );
        // test SPI CRC fault
        ucc5870_write_register( select, OFFSET_SPITEST, 0x1818 );
        ucc5870_read(select, OFFSET_STATUS2, &read);

    我在状态2寄存器处始终读取0x4004。

    感谢你的帮助。

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

    您好 Tobias、

    在激活模式下写入 SPITEST 寄存器将触发 STATUS2寄存器位4 (CFG_CRC_PRI_FAULT)。 这是由于配置了 CRC 特性(在第7.3.5.16节中进行了说明)。 为了使该故障触发配置、必须启用 CRC。 通过在 CFG8寄存器的位6 (CRC_DIS)中写入0可以启用此功能。

    • 您能否在测试中确认此位的状态?

    此致、

    Andy Robles

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

    很抱歉、按下"已解决"按钮时出错

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

    你好。
    是的、CRC_DIS 位为0。

        // enable CRC check
        cfg8 = ext_df_default_config.CFG8;
        cfg8.bit.CRC_DIS = 0;
        ucc5870_write_register( select, OFFSET_CFG8, cfg8.all );
        ucc5870_read(select, OFFSET_CFG8, &read);
        // => read = 0x0028
        // reset CRC
        ctrl1.all = 0;
        ctrl1.bit.CLR_SPI_CRC = 1;
        ucc5870_write_register( select, OFFSET_CONTROL1, ctrl1.all );
        // test SPI CRC fault
        ucc5870_write_register( select, OFFSET_SPITEST, 0x1818 );
        ucc5870_read(select, OFFSET_STATUS2, &read);
        // => read = 0x4000 

    是否缺少任何其他设置?

    感谢你的帮助。
    托比亚斯

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

    您好 Tobias、

    感谢您提供的信息!  Andy 很快会回来的!

    谢谢、

    Aaron

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

    您好 Tobias、

    除了在 CFG8寄存器的位6 (CRC_DIS)中写入0以启用配置 CRC 之外、除了处于活动状态外、还无需其他设置来触发 SPI_FAULT。

    • 在您的示例代码中、我看到您写入了 CONFIG 寄存器、然后写入了 SPITEST 寄存器、而没有进入工作模式。 在写入 SPITEST 寄存器之前、您能否添加进入活动状态的步骤?

    此致、

    Andy Robles

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

    你好。
    我添加了一个用于启用 UCC5870的函数。
    我已经在我的示例中添加了状态检查、我认为 UCC5870处于活动状态。

    // set active
    ucc5870_enable(select);
    // read status
    read = 0;
    ucc5870_read(select, OFFSET_STATUS1, &read);
    // => read = 0x00C0 => active mode ???
    
    // enable CRC check
    cfg8 = ext_df_default_config.CFG8;
    cfg8.bit.CRC_DIS = 0;
    ucc5870_write_register( select, OFFSET_CFG8, cfg8.all );
    read = 0;
    ucc5870_read(select, OFFSET_CFG8, &read);
    // => read = 0x0030
    
    // reset CRC
    ctrl1.all = 0;
    ctrl1.bit.CLR_SPI_CRC = 1;
    ucc5870_write_register( select, OFFSET_CONTROL1, ctrl1.all );
    // test SPI CRC fault
    ucc5870_write_register( select, OFFSET_SPITEST, 0x1818 );
    read = 0;
    ucc5870_read(select, OFFSET_STATUS2, &read);
    // => read = 0x4004

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

    您好 Tobias、  

    感谢您的提问。  我们的办公室今天因美国假日关闭。 我们的同事  明天会回来。

    此致、

    Leslie

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

    你好
    抱歉、我 在我的函数 ucc5870_write_register 中发现了一个错误、因此所有到控制寄存器的写入操作都失败。
    现在、具有 SPITEST 的示例在活动模式下工作、但不在配置2模式下工作。 但我认为它也应该在 配置2模式下工作?

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

    您好 Tobias、

    该故障仅在激活模式下工作。 这是因为寄存器受到配置 CRC 功能的保护(在第7.3.5.16节中进行了说明)。 当栅极驱动器进入激活模式时、栅极驱动器使用受此功能保护的寄存器中的数据运行 CRC 计算、该功能包括 SPITEST 寄存器。 然后、栅极驱动器存储此值并将其用作基准。 然后、栅极驱动器对受保护的寄存器执行周期性计算、并将新计算值与驱动器首次转换到活动模式时计算的基线值进行比较。 如果这些值不匹配、则 STATUS2寄存器位4 (CFG_CRC_PRI_FAULT)。

    在活动状态下写入 SPITEST 将改变 CRC 计算、这将产生一个不匹配、然后触发 STATUS2寄存器位4 (CFG_CRC_PRI_FAULT)。 在配置模式下不能触发此操作。

    此致、

    Andy Robles

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

    你好。

    好的、我不理解 CRC SPI 功能。

    是否可以在配置2模式下使用 CRC 功能来保护 SPI 通信?  
    您是否有一个示例、告诉我如何对所有 CFG 寄存器使用 CRC 函数?

    此致
    托比亚斯

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

    大家好、Tobias、

    让我们检查一下这是否可行。

    此致、

    Don

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

    您好 Tobias、

    CRC 功能可用于保护配置2模式中的通信、以及其他方式。

    1. 使用 CRC:
      • 您可以按照自己的意愿配置栅极驱动器、同时让 MCU 对 SPI 命令运行 CRC 计算。 为了确保正确的通信、您只需写入 CRC_TX 寄存器、以确保您发送到栅极驱动器的命令为收到的命令(类似于数据表中的示例)。
        • 在您之前的一篇文章中、您提到了 UCC5870_WRITE_REGTER 函数中存在一个错误。 您是否尝试像在初始帖子中那样重新运行 CRC 测试?
          • 我们没有可用的 CRC 示例代码、但我能够在实验中验证写入一个随机值 CRC_TX 位实际上会触发 SPI_FAULT。 写入命令中的错误将解释在您一侧写入不正确的值时为什么不出现 SPI_FAULT。  
    2. 读取寄存器并与默认值进行比较:
      • 确保建立良好 SPI 通信的另一种方法是在启动时读取一些寄存器并确保读取默认值。 所有寄存器的默认值可在 UCC5870-Q1数据表的寄存器映射部分找到。 例如、对于 CFG2、默认值为0x0000001000000000或0x0200 (位名称下面每个位的默认值)

    现在写入函数已修复、那么现在写入 CRC_TX 寄存器是否起作用、请告诉我。

    此致、

    Andy Robles

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

    你好。

    我修复了 SPI 写入函数中的错误。
    我已尝试重新运行数据表的示例、但在状态2位11处没有任何 SPI 故障。

        // reset CRC
        ctrl1.all = 0;
        ctrl1.bit.CLR_SPI_CRC = 1;
        ucc5870_write_register( select, OFFSET_CONTROL1, ctrl1.all );
    
        tx_data.all = 0xFC00;
        crc_calc_data.all = SWAP_UI16(tx_data.all);
        crc = crc8_update( crc, &crc_calc_data.all, 2 );
        msg.ptr_tx_data = tx_data.byte;
        msg.tx_data_size = 2;
        hal_spi_master_transfer_blocking( &mgl_spi_handle[select], &msg, 100 );
    
        tx_data.all = 0xFA58;
        crc_calc_data.all = SWAP_UI16(tx_data.all);
        crc = crc8_update( crc, &crc_calc_data.all, 2 );
        msg.ptr_tx_data = tx_data.byte;
        msg.tx_data_size = 2;
        hal_spi_master_transfer_blocking( &mgl_spi_handle[select], &msg, 100 );
    
        tx_data.all = 0xFB2A;
        crc_calc_data.all = SWAP_UI16(tx_data.all);
        crc = crc8_update( crc, &crc_calc_data.all, 2 );
        msg.ptr_tx_data = tx_data.byte;
        msg.tx_data_size = 2;
        hal_spi_master_transfer_blocking( &mgl_spi_handle[select], &msg, 100 );
    
        tx_data.all = 0xFC13;
        crc_calc_data.all = SWAP_UI16(tx_data.all);
        crc = crc8_update( crc, &crc_calc_data.all, 2 );
        msg.ptr_tx_data = tx_data.byte;
        msg.tx_data_size = 2;
        hal_spi_master_transfer_blocking( &mgl_spi_handle[select], &msg, 100 );
    
        // check CRC
        tx_data.all = 0xFA30;
        crc_calc_data.all = SWAP_UI16(tx_data.all);
        crc = crc8_update( crc, &crc_calc_data.all, 1 );
        //crc has to be 0x30
        crc = 0xff; // write wrong CRC to get a fault
        tx_data.byte[0] = crc;
        msg.ptr_tx_data = tx_data.byte;
        msg.tx_data_size = 2;
        hal_spi_master_transfer_blocking( &mgl_spi_handle[select], &msg, 100 );
    
        read = 0;
        ucc5870_read(select, OFFSET_STATUS2, &read);
        //read = 0x4012;
     

    如果 SPI 检查不起作用、我将尝试读取并检查寄存器。
    感谢你的帮助。