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.

[参考译文] MSP430FR2355:CRC MSP 硬件问题

Guru**** 2538960 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/903935/msp430fr2355-crc-msp-hardware-issue

器件型号:MSP430FR2355

如何清空 CRC 引擎?  似乎每27ms 通过它6个字节的不同数据会产生第一个 CRC、之后的每个相应 CRC 都是一样的...

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

    我看不到您的症状、如所述。 我对 CRC 示例进行了分层操作、通过 CRC 单元运行6个三胞胎数据。 结果是完全不同的(除了引入的一个重复的 I)、并且都与软件计算的 CRC 相匹配。  

    您可能需要展示您为遇到这种情况所做的工作。

    //开始使用 msp430fr235x_crc. 编辑了简洁性。
    #include 
    unsigned int crc_Init = 0xFFFF;
    unsigned int i、j;
    unsigned Success;
    #define CRC_M 6. // 6行
    #define CRC_N 3. // 3 cols
    //这些来自示例,但分成5组,每组3个。
    unsigned int crc_input[crc_m][crc_N]={
    0x0fc0、0x1096、0x5042、
    0x0010、0x7ff7、0xf86a、
    0x7651、0x8b88、
    0x0010、0x7ff7、0xf86a、//重复
    0x0679、0x0123、0x9599、
    0xc58c、0xd1e2、0xe144
    };
    unsigned int crc_results;
    unsigned int sw_results;
    unsigned int crc_new;
    unsigned sw_res[crc_M]、hw_res[crc_M];
    
    //软件算法函数定义(底部)
    unsigned int CCITT_Update (unsigned int、unsigned int);
    
    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
    无符号掩码= 0x0001;
    P1OUT &=~BIT0; //清除 P1.0输出状态
    P1DIR |= BIT0; //将 P1.0设置为输出方向
    PM5CTL0 &=~LOCKLPM5; //启用 GPIO
    for (i=0;i < CRC_M;i++) // 6个测试用例
    {
    CRCINIRES = CRC_Init; //用0xFFFF 初始化 CRC
    对于(j = 0;j < crc_N;+j)
    {
    CRCDIRB = CRC_INP[i][j]; //在 CRC 中输入数据
    __no_operation();
    }
    CRC_Results = CRCINIRES; //保存结果(按照 CRC-CCITT 标准)
    
    CRC_New = CRC_Init; //将 CRC Init 值放入 CRC_New 中
    对于(j = 0;j < crc_N;+j)
    {
    //软件算法中的输入值(需要8位输入)
    //清除高8位以获得低字节
    unsigned int LowByte =(CRC_INP[I][j]和0x00FF);
    //向右移动8位以获得高位字节
    unsigned int UpByte =(crc_input[i][j]>> 8);
    //第一个输入低字节
    CRC_New = CCITT_Update (CRC_New、LowByte);
    //然后输入高字节
    CRC_New = CCITT_Update (CRC_New、UpByte);
    }
    SW_Results = CRC_New;
    
    //比较数据输出结果
    if (crc_results=sw_results) //如果数据相等
    {
    P1OUT |= BIT0; //设置 LED
    success |=掩码; //正确}
    
    其他
    {
    P1OUT &=~BIT0; //如果没有,清除 LED
    while (1)/* empty*/; //失败时停止
    }
    掩码<= 1;
    sw_res[i]= sw_results;
    HW_res[i]= CRC_Results;
    }
    while (1); //在此处永久停止
    }
    
    //软件算法- CCITT CRC16代码
    unsigned int CCITT_Update (unsigned int init、unsigned int 输入)
    {
    unsigned int CCITT;
    CCITT =(unsigned char)(init >> 8)|(init << 8);
    CCITT ^=输入;
    CCITT ^=(unsigned char)(CCITT & 0xFF)>> 4;
    CCITT ^=(CCITT << 8)<< 4;
    CCITT ^=((CCITT & 0xFF)<< 4)<< 1;
    返回 CCITT;
    }
    

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

    我会尽最大努力来展示...很多代码,所以我会把它往下看,希望你能看到一些东西。  在短 mssg[8]中……代码发出四个8字节的块……每~27ms 发送一个……我在逻辑分析仪上看到这四个不同的组……我还看到 P5OUT 位1在输入每个 case 语句后大约2us 切换、并在返回高电平之前持续大约7.5us (5.1是 CRC 的入口和出口)...我在逻辑分析仪上看到的第一个 CRC 是唯一的,但是接下来3个独特模式上的接下来三个 CRC 是相同的...第二个 CRC 不同于第一个8的块。  从本质上讲、似乎通过2-4组 CRC 的数据是相同的、但我的逻辑分析仪和调试器(当我适当断开时)显示所有数据包都是唯一的。  现在、我只注意到并且未将手指放在上面的一个警告是、我看到 CRC 模块的入口和出口为5倍

    部分定义:

    PTX = mssg;
    PRx =传入;
    pSysID = systemID;
    mssg[0]=(permany_Info[0]);
    mssg[1]=(永久性信息[1]);
    mssg[2]=(永久性_Info[2]);
    mssg[3]=(永久性_Info[3]);
    

    代码如下:

    
    
    if (!swInfo.err &&(swInfo.twoSec & 0x0080)){
    如果(!flag){
    P_SEQ = systemIdentification (systemID);
    Flag = T;
    }
    开关(I){
    情况0:
    P5OUT ^= BIT0;
    mssg[4]=(0xC0);
    mssg[5]=* p_seq;
    中断;
    案例1:
    P5OUT ^= BIT0;
    mssg[4]=(0xA0);
    mssg[5]=*(p_seq + 1);
    中断;
    案例2:
    P5OUT ^= BIT0;
    mssg[4]=(0x90);
    mssg[5]=*(p_seq + 2);
    中断;
    案例3:
    P5OUT ^= BIT0;
    mssg[4]=(0x88);
    mssg[5]=*(p_seq + 3);
    中断;
    默认值:break;
    }
    i++;
    CRC_RESULT = CRC (PTX);
    mssg[6]=(char)((crc_result >> 8)& 0xFF);
    mssg[7]=(char)(crc_result & 0xFF);
    volumeButtonReleased = 3;
    }
    }
    
    如果(!radioBusy){
    if ((volumeButtonReleased == 3)){
    如果(I <= 4){
    PTX = mssg;
    UCA1IE |= UCTXIE;//发送消息
    _bis_SR_register (LPM3_bits);
    }
    否则{
    UCA1IE &=~UCTXIE;
    I = 0;
    PTX = mssg;
    currentSwState = 0;
    swInfo.anySw = F;
    swInfo.err = F;
    swInfo.twoSec = 0;
    memset (swInfo.hits、0、sizeof (swInfo.hits));
    msgPopulated = F;
    volumeButtonReleased = 0;
    P2IFG &=~0x06;
    P1IFG &=~0xFE;
    }
    }
    
    

    以下是 CRC 函数:

    unsigned int crc (char *有效载荷){
    unsigned int crc_result;
    unsigned int i、k;
    const unsigned int CRC_Init = 0xFFFF;
    P5OUT &=~BIT1;
    CRCINIRES = CRC_Init;
    for (i=0;<PAYLOAD_SIZE ;i+=2)
    {
    K =(*(有效载荷+ I)<<8)|*(有效载荷+(I+1));
    CRCDIRB = k;//将数据输入 CRC
    __no_operation();
    }
    CRC_RESULT = CRCINIRES;
    P5OUT |= BIT1;
    返回 CRC_RESULT
    ;}
    

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

    >        CRC_Result = CRC(pTx); 

    我记得、PTX 是一个步行指针。 在浏览每个数据包后,它可能指向数据包的末尾--随机但可能是静态数据。 尝试:

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

    PTX 不是一个步行指针... VolumeButtonReleased 的断点显示指针与 mssg 对齐,除 CRC 以外的所有数据看起来都很好...不确定它的含义,但它非常清楚地告诉我们,数据包1总是返回一个独特的模式,而数据包2-4总是返回0x0E10 ...这一点都很明显 对于正在使用的静态数据(虽然我倾向于不认为 msg 和指针看起来很好),或者我为函数使用的代码有点糟糕...您能看到任何此函数突出的东西:

    有效载荷大小为6 --在 CRC 产生2个字节后,mssg 变为8个字节...类型转换或连接是否有任何问题?

    unsigned int crc (char *有效载荷){
    unsigned int crc_result;
    unsigned int i、k;
    const unsigned int CRC_Init = 0xFFFF;
    P5OUT &=~BIT1;
    CRCINIRES = CRC_Init;
    for (i=0;<PAYLOAD_SIZE ;i+=2)
    {
    K =(*(有效载荷+ I)<<8)|*(有效载荷+(I+1));
    CRCDIRB = k;//将数据输入 CRC
    __no_operation();
    }
    CRC_RESULT = CRCINIRES;
    P5OUT |= BIT1;
    返回 CRC_RESULT
    ;}
    

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

    第二次调用 crc()时,PTX 看起来是什么样子? 我猜它指向&mssg[6]。 (否则、您在发送数据包之前无需刷新它。)

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

    布鲁斯...

    仔细看了你所说的话后…简短的回答…你是对的!!!  谢谢!  我的 TX ISR 会在 mssg 命中 ptx + 7后递增 ptx,然后中断...直到我进入上面的(I <= 4)语句发送消息,我才会重置它。

    您的帮助非常好

    再次感谢

    Steve