主题中讨论的其他器件:C2000WARE
我在 VCU 库中遇到了麻烦,很遗憾
我的端数据大小为27,CRC 大小为5
我应该如何设计例程?
我将程序称为流动图
流畅的设计,如何解决此问题以获得正确的程序
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.
我在 VCU 库中遇到了麻烦,很遗憾
我的端数据大小为27,CRC 大小为5
我应该如何设计例程?
我将程序称为流动图
流畅的设计,如何解决此问题以获得正确的程序
我的 crc5 poly 是0x0B
这是我的 main.c
我应该如何解决它
//########################################################################################################################
//! \file /2838x_vcrc_config_poly/vcrc_configpoly.c
//!
//! 针对 可配置多项式和数据大小(VCRC 和 C)的简要演示代码
//!
//! 日期 :2020年4月9日
//!
//! 此示例展示了如何操作
//! -#使用 VCRC 支持的可配置多项式和数据大小
//
// 组: c2000
// 目标系列: F2838x
//
//########################################################################################################################
//$TI 发行版:C28x VCU 库 V2.20.00.00美元
//$Release Date:2020年5月26日$
//版权所有:版权所有(C) 2019德州仪器(TI)公司-
// http://www.ti.com/ 保留所有权利$
//########################################################################################################################
//
//包括
//
#include
#include "vcu2_types.h"
#include "vcu2_crc.h"
#include "vcrc_configpoly.h"
#include "vcrc_configpoly_example.h"
#include "dsp_examples_setup.h"
#include "crctable0x7.h"
#include "crctable0x7efined.h"
#include "crctable0x8005.h"
#include "crctable0x1021.h"
#include "crctable0x8005efined.h"
#include "crctable0x1021rebed.h"
#include "crctable0x04c11db7.h"
#include "crctable0x1edc6f41.h"
#include "crctable0x04c11db7ex反射.h"
#include "crctable0x1edc6f41ref反射.h"
#include "dsp_examples_setup.h"
//
//定义
//
#define CRC_INIT_4 0x0
#define CRC_INIT_5 0x1f
#define CRC_INIT_8 0x0
#define CRC_INIT_16 0x0
#define CRC_INIT_CRC16MODBUS 0xFFFF
#define CRC_INIT_CRC32 0xFFFFFFFF
#define polynomial _4 0x0003
#define polynomial _5 0x0B
#define polynomial _8 0x0007
#define polynomial _17 0x1685B
#define polynomial _16_P2 0x1021
#define polynomial _16_P1 0x8005
#define polynomial _32_P1 0x04C11DB7
#define polynomial _32_P2 0x1EDC6F41
#define NO_NO_TO_TESTS 22.
#define NBYTES1 128
#define NWORDS1 NBYTES1/2
//
//全局变量
//
uint32_t TestOutput[no_of _tests];
uint32_t goldenOutput[no_for_tests];
uint16_t pass、失败;
CRC_Obj CRC;
crc_handlecrc;
//位置数据从F开始01 01_1100_0000_0110_0110_0000_000 (27个)、crc=3/0x5c06、0x6000、
位置数据从H开始000 μ 27个0000_0110_0110_0000_0011_10_10 (μ A)
#pragma DATA_SECTION (testInput、"testInput")
uint16_t testInput[NWORDS1]={
0x5c06、0x6000、
};
#pragma DATA_SECTION (TestOutput、"TestOutput")
MAIN ()
{
//本地
int16_t 索引= 0;
//
//设置系统计时
//
dsp_example_setupSysCtrl();
//
//注-
//多项式大小- 1位的大小-通过编程值0x0来指示
//多项式大小- 32位的大小-通过编程0x1F 的值来指示
// Datasize 是指计算 CRC 的积分单位
//数据大小- 1位的大小-通过编程值0x0来指示
//数据大小-通过编程0x7值来指示8位的大小
//在 VCRCSIZE 寄存器- PSIZE 和 DSIZE 字段中设置它们
//在 asm 文件中实现的函数_crc_runConfigPolyBytes 和_crc_runConfigPolyBits 中设置
// vcrc_configpoly_asm.asm
//要计算 CRC 的报文总大小由2个元素 MsgBytes 和 MsgBits 指定
//如果消息的大小以字节为单位,则将 crc.nMsgBytes 的值设置为消息的大小
//并调用函数- crc_runConfigPolyBytes
//如果消息的大小不能以字节为单位指定,则将 crc.nMsgBits 的值设置为大小
//以位为单位的消息,并调用函数-_crc_runConfigPolyBits
//
//示例1和2 -针对不同 Msg 大小的按字节4位 CRC 计算->分别为128和7字节
//步骤1:初始化 CRC 对象
CRC.seedValue = CRC_INIT_5; //输入用于 CRC 计算的种子值
crc.nMsgBytes = 4; //输入要计算 CRC 的字节数
crc.nMsgBits = 0; //输入用于 CRC 计算的位数
crc.parity = crc_parit_odd; //根据奇偶校验值选择先计算低字节(8位)的 CRC、或先计算高字节的 CRC
crc.crcResult = 0; //CRC 结果将存储在该位置
crc.pMsgBuffer = 0; //指向消息缓冲区的指针
crc.polynomial = polynomial _5; //用户多项式
crc.PolySize = size_5_bits; //polynomial size
crc.dataSize = size_8_bits; //data size
crc.反射 = 0; //计算是从 LSB 还是 MSB 完成,如果 crc.反射= 1,则数据字节将在 CRC 计算之前翻转
CRC.init =(void (*)(void *)) crc_init16Bit; //通过上下文保存和上下文恢复调用初始化 CRC 例程
取函数的地址,并将其传入的参数由实体改为地址 μ s
CRC.run =(void (*)(void *)) crc_run4BitENDATTableLookupC; //函数地址赋值,并没有运行
//步骤2:初始化句柄
handleCRC =&CRC;
crc.nMsgBits = 27; //添加数据位数以计算 CRC
crc.nMsgBytes = 0; //对于位模式测试、我们可以保持 MsgBytes = 0、因为它不是必需的
crc.pMsgBuffer = testInput; //指向 test 输入
//步骤1:使用 C 例程计算黄金值
CRC.run =(void (*)(void *)) crc_run4BitENDATBitTableLookupC_Generic;//函数地址赋值,并没有运行
CRC.run(handleCRC);//这里运行的run函数时,run函数已经变为CRC_run4BitENDATBitTableLookupC_Generic
goldenOutput[index]=(uint16_t) crc.crcResult;
//步骤2:使用 VCRC 汇编代码运行 CRC 模块
CRC.run =(void (*)(void *)) crc_runConfigPolyBytes;
CRC.run(handleCRC);
TestOutput[index++]=(uint16_t) crc.crcResult;
// //自检
// pass = 0;
// 失败= 0;
//
// for (index = 0;index < no_of _tests;index ++){
// if (TestOutput[index]=goldenOutput[index]){
// pass ++;
// }else{
// 失败++;
// }
// }
//
// ////如果任一示例失败-代码将在错误函数中永久循环
// if (pass!= no_of _tests){
// error();
// }
}
传入CRC结构体地址 μ s
void crc_run4BitENDATTableLookupC (crc_handle hndCRC)
{
int16_t i、j;
uint16_t 数据;
uint16_t 奇偶 校验=(uint16_t) hndcrc->奇偶校验;
uint16_t 累加 器= hndcrc->pedValue;
uint16_t *pInputVector =(uint16_t *) hndcrc->pMsgBuffer;
uint16_t poly = 0x000b;
uint16_t PolySize = 5;
//假设消息字节被打包成16位字
//计算从高字节或低字节开始
//内存排列如下:
//地址|_lb_|_hb__|
// 0x0000 |_D0L_|_D0H_|
// 0x0001 |_D1L_|_D1H_|
// 0x0002 |_D2L_|_D2H_|
// 0x0003 |_D3L_|_D3H_|
// 0x0004 |_D4L_|_D4H_|
//...
Poly <<=(8 - PolySize);
for (i = 0;i < ndcrc->nMsgBytes;i++、奇偶校验++){
//__byte 选择字中的低字节(0)或高字节(1)
//枚举奇偶校验提供的初始选择
//表索引是根据累加器的高字节计算得出的
//与输入矢量中每个字的低字节和高字节异或
数据=(uint16_t)__byte (((int *) pInputVector、奇偶校验);
累加器^=数据;
对于(j = 0;j < 8;j++){
累加器<<= 1;
if (累加器& 0x0100){
累加器^= poly;
}
}
累加器&= 0x00FF;
}
//保存 CRC 结果
ndcrc->crcResult =(uint32_t)累加器>>(8 -多尺寸);
}
void crc_run4BitENDATBitTableLookupC_Generic (crc_handle hndCRC)
{
int16_t i;
uint16_t 数据;
uint16_t 奇偶 校验=(uint16_t) hndcrc->奇偶校验;
uint16_t 累加 器= hndcrc->pedValue;
uint16_t *pInputVector =(uint16_t *) hndcrc->pMsgBuffer;
uint16_t poly = 0x0003;
uint32_t NumOfBits = ndCRC->nMsgBits;
uint16_t bitPlace = 7;
uint16_t newWordNext = 1;
//假设消息字节被打包成16位字
//计算从高字节或低字节开始
//内存排列如下:
//地址|_lb_|_hb__|
// 0x0000 |_D0L_|_D0H_|
// 0x0001 |_D1L_|_D1H_|
// 0x0002 |_D2L_|_D2H_|
// 0x0003 |_D3L_|_D3H_|
// 0x0004 |_D4L_|_D4H_|
//...
for (i = 0;i < NumOfBits;i++){
//__byte 选择字中的低字节(0)或高字节(1)
//枚举奇偶校验提供的初始选择
//表索引是根据累加器的高字节计算得出的
//与输入矢量中每个字的低字节和高字节异或
if (newWordNext){
数据=(uint16_t)__byte (((int *) pInputVector、奇偶校验);
奇偶校验++;
newWordNext = 0;
if ((NumberOfBits - I)<= 8){
bitPlace = NumOfBits - I - 1;
}
}
累加器<<= 1;
if (((累加器& 0x0010)>>4)!=(((数据&(1< >bitPlace
累加器^= poly;
}
累加器&= 0x00F;
如果(!bitPlace){
newWordNext = 1;
bitPlace = 7;
}否则{
BitPlace ----;
}
}
//保存 CRC 结果
ndcrc->crcResult =(uint32_t)累加器;
}
空错误(空)
{
ESTOP0; //测试失败!! 停下来!
适用于(;);
}
是的、我认为我需要进一步的帮助
这是我的 mian.c
,上述内容、我说过 μ s 如何修复它以纠正端点 CRC
//########################################################################################################################
//! \file /2838x_vcrc_config_poly/vcrc_configpoly.c
//!
//! 针对 可配置多项式和数据大小(VCRC 和 C)的简要演示代码
//!
//! 日期 :2020年4月9日
//!
//! 此示例展示了如何操作
//! -#使用 VCRC 支持的可配置多项式和数据大小
//
// 组: c2000
// 目标系列: F2838x
//
//########################################################################################################################
//$TI 发行版:C28x VCU 库 V2.20.00.00美元
//$Release Date:2020年5月26日$
//版权所有:版权所有(C) 2019德州仪器(TI)公司-
// http://www.ti.com/ 保留所有权利$
//########################################################################################################################
//
//包括
//
#include
#include "vcu2_types.h"
#include "vcu2_crc.h"
#include "vcrc_configpoly.h"
#include "vcrc_configpoly_example.h"
#include "dsp_examples_setup.h"
#include "crctable0x7.h"
#include "crctable0x7efined.h"
#include "crctable0x8005.h"
#include "crctable0x1021.h"
#include "crctable0x8005efined.h"
#include "crctable0x1021rebed.h"
#include "crctable0x04c11db7.h"
#include "crctable0x1edc6f41.h"
#include "crctable0x04c11db7ex反射.h"
#include "crctable0x1edc6f41ref反射.h"
#include "dsp_examples_setup.h"
//
//定义
//
#define CRC_INIT_4 0x0
#define CRC_INIT_5 0x1f
#define CRC_INIT_8 0x0
#define CRC_INIT_16 0x0
#define CRC_INIT_CRC16MODBUS 0xFFFF
#define CRC_INIT_CRC32 0xFFFFFFFF
#define polynomial _4 0x0003
#define polynomial _5 0x0B
#define polynomial _8 0x0007
#define polynomial _17 0x1685B
#define polynomial _16_P2 0x1021
#define polynomial _16_P1 0x8005
#define polynomial _32_P1 0x04C11DB7
#define polynomial _32_P2 0x1EDC6F41
#define NO_NO_TO_TESTS 22.
#define NBYTES1 128
#define NWORDS1 NBYTES1/2
//
//全局变量
//
uint32_t TestOutput[no_of _tests];
uint32_t goldenOutput[no_for_tests];
uint16_t pass、失败;
CRC_Obj CRC;
crc_handlecrc;
//位置数据从F开始01 01_1100_0000_0110_0110_0000_000 (27个)、crc=3/0x5c06、0x6000、
位置数据从H开始000 μ 27个0000_0110_0110_0000_0011_10_10 (μ A)
#pragma DATA_SECTION (testInput、"testInput")
uint16_t testInput[NWORDS1]={
0x5c06、0x6000、
};
#pragma DATA_SECTION (TestOutput、"TestOutput")
MAIN ()
{
//本地
int16_t 索引= 0;
//
//设置系统计时
//
dsp_example_setupSysCtrl();
//
//注-
//多项式大小- 1位的大小-通过编程值0x0来指示
//多项式大小- 32位的大小-通过编程0x1F 的值来指示
// Datasize 是指计算 CRC 的积分单位
//数据大小- 1位的大小-通过编程值0x0来指示
//数据大小-通过编程0x7值来指示8位的大小
//在 VCRCSIZE 寄存器- PSIZE 和 DSIZE 字段中设置它们
//在 asm 文件中实现的函数_crc_runConfigPolyBytes 和_crc_runConfigPolyBits 中设置
// vcrc_configpoly_asm.asm
//要计算 CRC 的报文总大小由2个元素 MsgBytes 和 MsgBits 指定
//如果消息的大小以字节为单位,则将 crc.nMsgBytes 的值设置为消息的大小
//并调用函数- crc_runConfigPolyBytes
//如果消息的大小不能以字节为单位指定,则将 crc.nMsgBits 的值设置为大小
//以位为单位的消息,并调用函数-_crc_runConfigPolyBits
//
//示例1和2 -针对不同 Msg 大小的按字节4位 CRC 计算->分别为128和7字节
//步骤1:初始化 CRC 对象
CRC.seedValue = CRC_INIT_5; //输入用于 CRC 计算的种子值
crc.nMsgBytes = 4; //输入要计算 CRC 的字节数
crc.nMsgBits = 0; //输入用于 CRC 计算的位数
crc.parity = crc_parit_odd; //根据奇偶校验值选择先计算低字节(8位)的 CRC、或先计算高字节的 CRC
crc.crcResult = 0; //CRC 结果将存储在该位置
crc.pMsgBuffer = 0; //指向消息缓冲区的指针
crc.polynomial = polynomial _5; //用户多项式
crc.PolySize = size_5_bits; //polynomial size
crc.dataSize = size_8_bits; //data size
crc.反射 = 0; //计算是从 LSB 还是 MSB 完成,如果 crc.反射= 1,则数据字节将在 CRC 计算之前翻转
CRC.init =(void (*)(void *)) crc_init16Bit; //通过上下文保存和上下文恢复调用初始化 CRC 例程
取函数的地址,并将其传入的参数由实体改为地址 μ s
CRC.run =(void (*)(void *)) crc_run4BitENDATTableLookupC; //函数地址赋值,并没有运行
//步骤2:初始化句柄
handleCRC =&CRC;
crc.nMsgBits = 27; //添加数据位数以计算 CRC
crc.nMsgBytes = 0; //对于位模式测试、我们可以保持 MsgBytes = 0、因为它不是必需的
crc.pMsgBuffer = testInput; //指向 test 输入
//步骤1:使用 C 例程计算黄金值
CRC.run =(void (*)(void *)) crc_run4BitENDATBitTableLookupC_Generic;//函数地址赋值,并没有运行
CRC.run(handleCRC);//这里运行的run函数时,run函数已经变为CRC_run4BitENDATBitTableLookupC_Generic
goldenOutput[index]=(uint16_t) crc.crcResult;
//步骤2:使用 VCRC 汇编代码运行 CRC 模块
CRC.run =(void (*)(void *)) crc_runConfigPolyBytes;
CRC.run(handleCRC);
TestOutput[index++]=(uint16_t) crc.crcResult;
// //自检
// pass = 0;
// 失败= 0;
//
// for (index = 0;index < no_of _tests;index ++){
// if (TestOutput[index]=goldenOutput[index]){
// pass ++;
// }else{
// 失败++;
// }
// }
//
// ////如果任一示例失败-代码将在错误函数中永久循环
// if (pass!= no_of _tests){
// error();
// }
}
传入CRC结构体地址 μ s
void crc_run4BitENDATTableLookupC (crc_handle hndCRC)
{
int16_t i、j;
uint16_t 数据;
uint16_t 奇偶 校验=(uint16_t) hndcrc->奇偶校验;
uint16_t 累加 器= hndcrc->pedValue;
uint16_t *pInputVector =(uint16_t *) hndcrc->pMsgBuffer;
uint16_t poly = 0x000b;
uint16_t PolySize = 5;
//假设消息字节被打包成16位字
//计算从高字节或低字节开始
//内存排列如下:
//地址|_lb_|_hb__|
// 0x0000 |_D0L_|_D0H_|
// 0x0001 |_D1L_|_D1H_|
// 0x0002 |_D2L_|_D2H_|
// 0x0003 |_D3L_|_D3H_|
// 0x0004 |_D4L_|_D4H_|
//...
Poly <<=(8 - PolySize);
for (i = 0;i < ndcrc->nMsgBytes;i++、奇偶校验++){
//__byte 选择字中的低字节(0)或高字节(1)
//枚举奇偶校验提供的初始选择
//表索引是根据累加器的高字节计算得出的
//与输入矢量中每个字的低字节和高字节异或
数据=(uint16_t)__byte (((int *) pInputVector、奇偶校验);
累加器^=数据;
对于(j = 0;j < 8;j++){
累加器<<= 1;
if (累加器& 0x0100){
累加器^= poly;
}
}
累加器&= 0x00FF;
}
//保存 CRC 结果
ndcrc->crcResult =(uint32_t)累加器>>(8 -多尺寸);
}
void crc_run4BitENDATBitTableLookupC_Generic (crc_handle hndCRC)
{
int16_t i;
uint16_t 数据;
uint16_t 奇偶 校验=(uint16_t) hndcrc->奇偶校验;
uint16_t 累加 器= hndcrc->pedValue;
uint16_t *pInputVector =(uint16_t *) hndcrc->pMsgBuffer;
uint16_t poly = 0x0003;
uint32_t NumOfBits = ndCRC->nMsgBits;
uint16_t bitPlace = 7;
uint16_t newWordNext = 1;
//假设消息字节被打包成16位字
//计算从高字节或低字节开始
//内存排列如下:
//地址|_lb_|_hb__|
// 0x0000 |_D0L_|_D0H_|
// 0x0001 |_D1L_|_D1H_|
// 0x0002 |_D2L_|_D2H_|
// 0x0003 |_D3L_|_D3H_|
// 0x0004 |_D4L_|_D4H_|
//...
for (i = 0;i < NumOfBits;i++){
//__byte 选择字中的低字节(0)或高字节(1)
//枚举奇偶校验提供的初始选择
//表索引是根据累加器的高字节计算得出的
//与输入矢量中每个字的低字节和高字节异或
if (newWordNext){
数据=(uint16_t)__byte (((int *) pInputVector、奇偶校验);
奇偶校验++;
newWordNext = 0;
if ((NumberOfBits - I)<= 8){
bitPlace = NumOfBits - I - 1;
}
}
累加器<<= 1;
if (((累加器& 0x0010)>>4)!=(((数据&(1< >bitPlace
累加器^= poly;
}
累加器&= 0x00F;
如果(!bitPlace){
newWordNext = 1;
bitPlace = 7;
}否则{
BitPlace ----;
}
}
//保存 CRC 结果
ndcrc->crcResult =(uint32_t)累加器;
}
空错误(空)
{
ESTOP0; //测试失败!! 停下来!
适用于(;);
}