Other Parts Discussed in Thread: HALCOGEN
主题中讨论的其他器件: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.
Other Parts Discussed in Thread: HALCOGEN
下面简要介绍一下使用 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