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.
工具/软件: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
Harshana、
正确。 有关详细信息、请参阅 spracr3。
谢谢、
Sira
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