主题中讨论的其他器件:HALCOGEN
下面简要介绍一下使用 CRC 控制器的方法
1、上电 CRC 计算。(自动模式下的闪存和 RAM 区域 CRC 计算)
使用 CAN 进行数据传输和接收的 CRC 计算。
我使用以下工具、
Code Composer Studio 版本:8.1.0.00011和 Halcogen 版本4.06.00
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.
下面简要介绍一下使用 CRC 控制器的方法
1、上电 CRC 计算。(自动模式下的闪存和 RAM 区域 CRC 计算)
使用 CAN 进行数据传输和接收的 CRC 计算。
我使用以下工具、
Code Composer Studio 版本:8.1.0.00011和 Halcogen 版本4.06.00
您好、QJ Wang、
感谢您的回答。
我已经检查了"18.3.2不使用基于时间的触发的自动模式示例"部分中给出的示例。
如果我需要计算闪存的 CRC、如何在自动模式下确定4MB 闪存大小的"预先确定 CRC"。
我是否需要使用以下代码来计算“预先确定的 CRC”?
输入电压范围
NEW_CRC_VAL (0):= CRC_VAL (63) XOR 数据(I);
对于 j in 1到63 loop
情况 j 为
当1|3|4=>时
NEW_CRC_VAL (j):=
CRC_VAL (j - 1) XOR CRC_VAL (63) XOR 数据(I);
当他人=>时
NEW_CRC_VAL (j):= CRC_VAL (j - 1);
结束病例;
结束循环;
CRC_VAL:= NEW_CRC_VAL;
结束环路
只有一个 CRC 值足以进行计算或需要计算每个扇区的 CRC 值?
请确认。
感谢您的更新。
我已将该线程称为"e2e.ti.com/.../2805284 、并使用 halcogen 更新了自动化代码、并附加了完整代码。
更新后的代码类似于 TRM 的"18.3.1示例:使用基于时间的事件触发的自动模式"、不同之处在于我使用了 SW 触发器、而不是较大的内存区域、而是使用了"CRC_TEST_VALUE = 0x8DF8A32C74B91F3E"的 CRC 计算。
在代码中 、CH0和 CH1用于设置 DMA。
以下是代码、
/*包含文件*/
#include "hL_sys_common.h"
/*用户代码开始(1)*/
#include "HL_CRC.h"
#include "HL_SYS_DMA.h"
/*用户代码结束*/
/**@fn void main (void)
*@应用程序主函数简介
*@请注意、默认情况下、此函数为空。
*
*此函数在启动后调用。
*用户可以使用此函数来实现应用程序。
*
/*用户代码开始(2)*/
#define FRAME_COUNT 0x1
#define Element_count 0x2
G_dmaCTRL g_dmaCTRLPKT0、g_dmaCTRLPKT1;// DMA 控制数据包配置堆栈
int main (空)
{
/*用户代码开始(3)*/
uint64 Result_CRC = 0U;
_enable_IRQ ();
uint64 CRC_TEST_VALUE = 0x8DF8A32C74B91F3E;
crcInit();
Result _CRC = CRC_UPDATE_WORD (0U、CRC_TEST_VALUE);
crcREG1->PCOUNT_REG1= frame_count * element_count;
crcREG1->SCOUNT_REG1 = 1;
crcEnableNotification (crcREG1,1);
G_dmaCTRLPKT0.Sadd =(uint32_t)(&(Result_CRC));
g_dmaCTRLPKT0.DADD =(uint32_t)(&(crcREG1->REGL1));
G_dmaCTRLPKT0.CHCTRL = 0;
G_dmaCTRLPKT0.FRCNT = FRAME_COUNT;
G_dmaCTRLPKT0.ELCNT = Element_count;
G_dmaCTRLPKT0.ELDOFFSET = 0;
G_dmaCTRLPKT0.ELSOFFSET = 0;
G_dmaCTRLPKT0.FRDOFFSET = 0;
G_dmaCTRLPKT0.FRSOFFSET = 0;
G_dmaCTRLPKT0.PORTASGN = PORTA_READ_PORTB_WRITE;
G_dmaCTRLPKT0.RDSIZE = ACCESS_64_BIT;
G_dmaCTRLPKT0.WRSIZE = ACCESS_64_BIT;
G_dmaCTRLPKT0.tType = BLOCK_TRANSFSION;
G_dmaCTRLPKT0.ADDMODERD = ADDR_INC1;
G_dmaCTRLPKT0.ADDMODEWR = ADDR_FIXED;
G_dmaCTRLPKT0.AUTOINIT = AUTOINIT_ON;
//为接收设置 DMA 控制数据包
dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT0);
dmaSetChEnable (DMA_CH0、DMA_SW);
G_dmaCTRLPKT1.Sadd =(uint32_t)(&(CRC_TEST_VALUE));
G_dmaCTRLPKT1.DADD =(uint32_t)(&(crcREG1->PSA_SIGREGL1));
G_dmaCTRLPKT1.CHCTTRL = 0;
G_dmaCTRLPKT1.FRCNT = FRAME_COUNT;
G_dmaCTRLPKT1.ELCNT = Element_count;
G_dmaCTRLPKT1.ELDOFFSET = 0;
G_dmaCTRLPKT1.ELSOFFSET = 0;
G_dmaCTRLPKT1.FRDOFFSET = 0;
G_dmaCTRLPKT1.FRSOFFSET = 0;
G_dmaCTRLPKT1.PORTASGN = PORTA_READ_PORTB_WRITE;
G_dmaCTRLPKT1.RDSIZE = ACCESS_64_BIT;
G_dmaCTRLPKT1.WRSIZE = ACCESS_64_BIT;
G_dmaCTRLPKT1.tType = BLOCK_TRANSFSION;
G_dmaCTRLPKT1.ADDMODERD = ADDR_FIXED;
G_dmaCTRLPKT1.ADDMODEWR = ADDR_FIXED;
G_dmaCTRLPKT1.AUTOINIT = AUTOINIT_ON;
//为接收设置 DMA 控制数据包
dmaSetCtrlPacket (dma_ch1、g_dmaCTRLPKT1);
dmaSetChEnable (DMA_CH1、DMA_SW);
dmaEnable();
while (1);
/*用户代码结束*/
返回0;
}
/*用户代码开始(4)*/
/*用户代码结束*/
------------------------------------------------------
我使用了以下代码来计算预先确定的 CRC 值、
uint64 crc_update_word (uint64 CRC、uint64数据)
{
int i、j;
uint64 nextCrc = 0;
//对于63到0环路中的 I
for (i = 63;i >=0;i---)
{
// next _CRC_VAL (0):= CRC_VAL (63) XOR data (I);
nextCrc =(nextCrc &(uint64) 0xfffffffffffffffffffffffffe)|((CRC >> 63)^(data >> I));
//对于 j in 1到63循环
对于(j = 1;j < 64;j++)
{
//case j 为
//当1|3|4 =>时
if (j = 1 || j = 3 || j = 4)
{
// NEW_CRC_VAL (j):= CRC_VAL (j - 1) XOR CRC_VAL (63) XOR DATA (i);
nextCrc =(nextCrc &~((uint64) 1 << j))|((((CRC >>(j-1)))^(CRC >> 63)^(data >> I))& 1)<< j);
}
其他
{//当其他人=>时
// next _CRC_VAL (j):= CRC_VAL (j - 1);
nextCrc =(nextCrc &~((uint64) 1 << j))|((((CRC >>(j-1))& 1)<< j);
}
//结束大小写;
}//结束循环;
CRC = nextCrc;
}//结束循环
返回 CRC;
}
在项目执行后、出现在 CRC 值寄存器和 PSA 扇区签名寄存器中的值如下所示、
| Crc1_CRC_ValL1 | 000000FB |
| Crc1_CRC_ValH1 | 0000008C |
| Crc1_PsaSecSigL1 | 0000CFB2 |
| Crc1_PsaSecSigH1 | 0000A088 |
问题:预先确定的 CRC 值未正确地从源地址传输到目标地址(CRC 值寄存器)。
PSA 签名寄存器的类似情况。 DMA 设置可能有问题。
请您检查代码并提供响应。
我使用的是 Code Composer Studio 版本:8.1.0.00011和 Halcogen 版本4.06.00
您好、QJ Wang、
感谢您的回答。 我根据建议修改了代码。
我还修改 了 MPU 默认设置。 在 HalCoGen 区域3中、默认设置为"MPU_PRIV_RW_USER_RW_NOexec"。 我将该区域设置为 MPU_PRIV_RW_USER_RW_EXEC。 然后、我可以看到 CRC 值寄存器中的值。
我观察到 CRC 值寄存器和 PSA 扇区寄存器的值。
Crc1_CrcValL1的内容= Crc1_PsaSecSig_H1的内容
Crc1_CrcValH1的内容= Crc1_PsaSecSig_L1的内容。
在比较之前、我是否需要交换 CRC 值寄存器的内容?
您好、QJ Wang、
我已经针对各种"CRC_TEST_VALUT"值在自动模式下计算了 CRC 值。
下表详细说明了"CRC_TEST_Value"及其各自从"CRC_UPDATE_WORD ()"和"HW CRC"获取的 CRC 值(针对4个"CRC_TEST_VALUE ")。
从"CRC_UPDATE_WORD"中为第一个"CRC_TEST_VALUE =0x1234567812345678"获取的 CRC 值 为
CRC_Value_L1 = 84BB2EC9和 CRC_Value_H1 = 84BB2ED3。
从"HWCRC 模块"获取的第一个"CRC_TEST_VALUE =0x1234567812345678"的 CRC 值 为、
PsaSecSig_L1 =84BB2ED3和 PsaSecSig_H1 = 84BB2EC9。
据观察、 CRC_value_L1和 CRC_value_H1的内容 分别与 PsaSecSig_H1和 PsaSecSig_L1的内容匹配。
对于下表中剩余的"CRC_TEST_Value"、 CRC_value_L1和 CRC_value_H1 与 PsaSecSig_H1和 PsaSecSig_L1的内容匹 配、"除了最后8位"。
|
CRC_TEST_VALUE |
使用"crc_update_word_()"的 CRC 值 |
使用硬件 CRC 模块 CRC 控制器获得的 CRC 值 |
||
|
|
CRC_Value_L1 |
CRC_Value_H1 |
PsaSecSig_L1 |
PsaSecSig_H1 |
|
0x1234567812345678 |
84BB2EC9. |
84BB2ED3. |
84BB2ED3. |
84BB2EC9. |
|
|
|
|
|
|
|
0xAB234538EF2487DE |
164BB500 |
BA01CBF0 |
BA01CB7C |
164BB5D0 |
|
|
|
|
|
|
|
0x5600321C36891642 |
2A02E706 |
8742EC7D |
8742ECF1 |
2A02E732 |
|
|
|
|
|
|
|
0xEA0012B6EAFFFFE |
CE018902 |
C700000CA |
C7000001A |
CE0189D2 |
是否需要对"crc_update_worth()"进行任何更新、要获得最后8位的正确 CRC 值、请检查并确认。
谢谢、
Sudhakar
您好、QJ Wang、
参考链接e2e.ti.com/.../2805284后、我在为函数提供输入之前交换了高32位和低32位、然后可以获得 CRC 值寄存器和 PSA 扇区寄存器的正确值。 我还使用了"crc_update_word ()"函数"crc_t crc_update (crc_t crc、const void * data、size_t data_len)"、而不是"crc_update_word ()"函数。
非常感谢您的参与和帮助。
谢谢、
Sudhakar