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.

[参考译文] CCS/TMS320F28069:VCU 单元(CRC 指令)

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/905219/ccs-tms320f28069-vcu-unit-crc-instruction

器件型号:TMS320F28069
Thread 中讨论的其他器件:C2000WAREcontrolSUITE

工具/软件:Code Composer Studio

大家好、

我正在尝试使用 F28069的 VCU 来实现 CRC 计算。 我参考 以下文档中提到的指令集。

www.ti.com/.../spruii0a.pdf  ----第4.5节

www.ti.com/.../spruhs1c.pdf ----第3.6.4节

然后我创建了一个带有指令集的汇编文件,并附加了名为 crc_code.asm 的文件。

我还在主文件中创建了一个结构、如

"

typedef 结构

uint32 *CRCResult; // 地址,其中的 eresultshouldbe 存储

uint16 * CRCData;// 开始数据

uint16 CRCLen;// Lengthof datain 字节

}CRC_CALC;

CRC_CALC mycrc;

UINT16 CRC16P1 (CRC_CALC * CRC_reg);

"

但存在一些编译错误。

请提供帮助吗? 谢谢!

此致、

请提供帮助吗? 谢谢!

此致、

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

    spruii0a 适用于包含 VCRC 的 F2838x、F2806x 包含 VCU-I、因此您需要参阅 spruhs1c 第3章。

    您是要附加 crc_code.asm 吗? 您似乎没有这样做。

    此外、您为什么创建.asm 文件。 您是否没有尝试利用现有库 C 可调用汇编函数。 您看过它们吗? (库和示例)。 这些示例是为 F2837x 构建的、但应可轻松移植到 F2806x。

    C:\ti\c2000Ware_3_01_00_00\libraries\dsp\vcu\c28

    此外,您还可以参阅 controlSUITE - controlSUITE\libs\DSP\VCU\v110\examples_ccsv4。 这些器件较旧、但与您的器件匹配。

    最后、您没有让我知道编译错误。

    谢谢、

    Sira

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

    谢谢 Sira、

    我忘记提到错误、这里是错误、

    说明   资源   路径   位置   类型
    [E0003]非法间接 memaddr 规范   crc_code.asm   /C2000_SPI_test2   第21行   C/C++问题
    说明   资源   路径   位置   类型
    [E0003] Syntax error - Operand 2   CRC_CODE.asm   /C2000_SPI_test2   line 22   C/C++ problem
    说明   资源   路径   位置   类型
    [E0004]非法操作数组合   crc_code.asm   /C2000_SPI_test2   第21行   C/C++问题
    说明   资源   路径   位置   类型
    [E0004]非法操作数组合   crc_code.asm   /C2000_spi_test2   行22   C/C++问题
    说明   资源   路径   位置   类型
    gmake:***[crc_code.obj]错误1   c2000_spi_test2          C/C++问题
    说明   资源   路径   位置   类型
    gmake:目标"全部"不会由于错误而重新生成。    C2000_SPI_test2          C/C++问题
    e2e.ti.com/.../c2000_5F00_spi_5F00_test2.rar

    我将在这里附加代码、

    谢谢!

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

    Harshana、

    这两行会发生错误

    MOVL XAR7、*_+XAR4[0];XAR7=&CRCResult
    MOV32 *+ XAR7[0]、VCRC;Storetheresult

    下面显示了我在没有错误的情况下对该编译所做的更改:

    MOVL XAR7、*+ XAR4[0];XAR7=&CRCResult
    VMOV32 *+ XAR7[0]、VCRC;Storetheresult

    谢谢、

    Sira

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

    谢谢你,Sira。

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

    您好,Sira,

    使用16位多项式作为0x1021时、TMS320F28069的 CRC 单元是否根据 CRC16-CCITT 计算?

    谢谢、

    此致、

    Harshana

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

    Harshana、

    正确。 有关详细信息、请参阅 spracr3。

    谢谢、

    Sira

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

    Sira、

    我是否应该将16位或8位值馈送到上面提到的"CRCData"数组?

    我将值0xA 传递给 CRCData,并将数据长度设置为1。 然后我读取结果。 应为0x40BA。 但我得到不同的值0xCD5F。

    这里是代码 attached.e2e.ti.com/.../5187.c2000_5F00_spi_5F00_test2.rar

    感谢你的帮助。

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

     VCRC16P1H_1和 VCRC16P1L_1指令以字节为单位运行、但 C28x CPU 没有字节寻址、因此您将处理16位字。 底层汇编代码需要适当处理此问题。

    我们的示例非常广泛地说明了这一点。 请查看它们。 遗憾的是、我无法为您调试代码。

    谢谢、

    Sira

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

    谢谢你,Sira,

    但我没有弄清楚它、

    使用 mycrc 结构和数据长度时,您能说我是对还是错?

    此外、我还尝试使用"VMOV32 VCRC、mem32"将0xFFFF 移动到 VCRC 寄存器。 但存在错误、

    "说明   资源   路径   位置   类型
    [E0004]非法操作数组合   crc_code.asm   /C2000_SPI_test2   第8行   C/C++问题
    [E0004]不需要立即值-操作数2   crc_code.asm   /C2000_SPI_test2   第8行   C/C++问题
    gmake:***[crc_code.obj]错误1   c2000_spi_test2          C/C++问题
    gmake:目标"全部"不会由于错误而重新生成。    C2000_SPI_test2          C/C++问题"

    谢谢!

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

    Harshana、

    mem32必须是存储器位置、不能是立即值。

    这是我们的库使用的 CRC 结构。

    typedef struct _crc_Obj_{
    uint32_t pedValue;//!< CRC 计算的初始值
    uint16_t nMsgBytes;//!<消息缓冲器中的字节数
    crc_parity;//!<从第一个字(16位)的低字节(crc_parity 偶数)或高字节(crc_parity 奇偶校验)启动 CRC
    uint32_t crcResult;//!<计算出的 CRC
    void *pMsgBuffer;//!<指向消息缓冲区的指针
    void *pCrcTable;//!<指向 CRC 查找表的指针
    void (* init)(void *);//!<指向 CRC 初始化例程的函数指针
    void (* run)(void *);//!<指向 CRC 计算例程的函数指针
    }CRC_Obj;

    这就是它的初始化方式。

    //步骤2:初始化 CRC 对象
    CRC.seedValue = init_CRC16;
    crc.nMsgBytes = nbytes;
    crc.parity = crc_parity;
    crc.crcResult = 0;
    crc.pMsgBuffer =(uint16_t *)&testInput[0];
    crc.pCrcTable =(uint16_t *)&crc16P1Table[0];
    CRC.init =(void (*)(void *)) crc_init16Bit;
    CRC.run =(void (*)(void *)) crc_run16BitTableLookupC;

    这是测试输入、其中 NWORDS = nbytes/2

    静态常量 uint16_t testInput[NWORDS]={
    0x4001、0x8002、0xC003、0x0004、0x4005、 0x8006、0xC007、0x0008、
    0x4009、0x800A、0xC00B、0x000C、0x400D、 0x800E、0xC00F、0x0010、
    0x4011、0x8012、0xC013、0x0014、0x4015、 0x8016、0xC017、0x0018、
    0x4019、0x801A、0xC01B、0x001C、0x401D、 0x801E、0xC01F、0x0020、
    0x4021、0x8022、0xC023、0x0024、0x4025、 0x8026、0xC027、0x0028、
    0x4029、0x802A、0xC02B、0x002C、0x402D、 0x802E、0xC02F、0x0030、
    0x4031、0x8032、0xC033、0x0034、0x4035、 0x8036、0xC037、0x0038、
    0x4039、0x803A、0xC03B、0x003C、0x403D、 0x803E、0xC03F、0x0040、
    };

    请注意、CRC_奇 偶校验意味着 CRC 计算从字的低位字节开始、即在上表中、传递到 CRC 计算例程的数据顺序将是0x01、0x40、0x02、0x80、0x03、 0xC0、0x04、0x00、0x05、0x40、 ...等等

    如果奇偶校验为 CRC_奇 偶校验、则 CRC 计算将从字的高字节开始、即上表、传递到 CRC 计算例程的数据顺序将是0x40、0x01、0x80、0x02、0xC0、 0x03、0x00、0x04、0x40、0x05、 ...等等

    谢谢、

    Sira