ESSON 发表于 2025-7-30 10:41:47

请教大神,Ai8H2K32U-45I-LQFP32芯片CRC效验不计算,是什么问题 | EAXFR

请教大神:我使用的是Ai8H2K32U-45I-LQFP32芯片,使用其CRC硬件效验时,CRC16_DOH、CRC16_DOL输入是什么值,输出就是什么值,感觉没有给我计算,不知道我哪里漏了啥?

下面是相关的程序内容,望指教:

定义:
CRC16_CR    EQU0FB30H;;CRC控制寄存器
CRC16_DIN   EQU0FB31H;;CRC输入寄存器
CRC16_DOH   EQU0FB32H;;CRC结果寄存器高位
CRC16_DOL   EQU0FB33H;;CRC结果寄存器低位

rt2SendCountCycequ      4ah   ;;RT2发送的字节数计数器

运行以下测试程序:

SendNumbToRt2_operate:                     ;;;20250209
    push acc
    push psw   
   
   ;mov a,#05h             ;;;起始字节
    ;   lcall SENDs2BUF_hex
      
         mov dptr,#0200h    ;设备识别码IDH+IDL 11-55
         MOV A,#11H
         movx @dptr,A   
         Inc DPTR   
         MOV A,#55H
         movx @dptr,A
         
             ;;;TEST ONLY START
                         Inc DPTR   ;;;020211 55 4C 00 40 02 A4 5B 3B 4D
                  MOV A,#57H                ;11 55 57 01 E3 01 00 D7 14
                  movx @dptr,A
                         Inc DPTR   ;;;0203
                  MOV A,#01H
                  movx @dptr,A
                         Inc DPTR   ;;;0204
                  MOV A,#0E3H
                  movx @dptr,A
                         Inc DPTR   ;;;0205
                  MOV A,#01H
                  movx @dptr,A
                         Inc DPTR   ;;;0206
                  MOV A,#00H
                  movx @dptr,A
                ; LJMP TESTB_END   
                         Inc DPTR   ;;;0207
                  MOV A,#0D7H
                  movx @dptr,A
               ;LJMP TESTB_END   
                         Inc DPTR   ;;;0208
                  MOV A,#35H
                  movx @dptr,A
                         Inc DPTR   ;;;0209
                  MOV A,#5aH
                  movx @dptr,A
                         Inc DPTR   ;;;020A
                  MOV A,#5dH
                  movx @dptr,A
            TESTB_END:      
       mov dptr,#0205h   
       movx a,@dptr
         MOV rt2SendCountCyc,A   
         
             ;;;TEST ONLY END
         
      
   Lcall CRC16_Oprs      
   ;;;   
   MOV A,rt2SendCountCyc;;RT2发送的字节数计数器LENGTH+5
   add a,#08h;;加上数据头+CRC效验
                   ;设备识别码IDH+IDL 11-55
                   ;指令,命令 CMD
                   ;操作页+地址 PAGE +ADDRESS
                   ;数据长度 Length
                   ;CRC效验 CRCH +CRCL
      
       lcall SEND1BUF         
                     
   mov dptr,#0200h    ;发送给rt2数据起始地址
rt2send_cyc0100:   
   PUSH Acc
       movx a,@dptr   
      ; lcall SENDs2BUF_hex
       lcall SEND1BUF
         
       inc DPTR
    POP Acc   
    DEC Acc
cjne a,#00h,rt2send_cyc0100   ;;;这里直接控制是发到哪个单元   
            ;;已发送最后这个单元数据完成
         
            
   ;    mov a,#06h             ;;;结束字节
   ;    lcall SENDs2BUF_hex
      
POPPSW
popacc
RET

CRC16_Oprs:                  
   PUSH PSW
   push acc
   
      MOV A,#0FFH            
         MOV CRC16_DOH,A            
         mov CRC16_DOL,A      
      MOV A,#00H            
         mov CRC16_DIN,A
         nop
         nop
      MOV CRC16_CR,#83H;;复位CRC16模块 ,输入输出数据均反转
      
      
   MOV A,rt2SendCountCyc;;RT2发送的字节数计数器LENGTH+5
   add a,#06h;;加上数据头不含CRC效验字节
                   ;设备识别码IDH+IDL 11-55
                   ;指令,命令 CMD
                   ;操作页+地址 PAGE +ADDRESS
                   ;数据长度 Length
                   ;CRC效验 CRCH +CRCL
         mov dptr,#0200h    ;计算数据起始地址
CRC16_cyS:   
   PUSH Acc
       movx a,@dptr      
         mov CRC16_DIN,A
      ;   LCALL CRC16_COMP8Left
       inc DPTR
    POP Acc   
    DEC Acc
cjne a,#00h,CRC16_cyS   ;;;这里直接控制是计算到哪个单元   
            ;;已计算完成

            ;;;再定位存储单元处 S
             mov dptr,#0200h
         MOV A,rt2SendCountCyc;;RT2发送的字节数计数器LENGTH+5
   add a,#06h      
               MOV DPL,A
            ;;;再定位存储单元处 S
   ;    inc DPTR
       MOV A,CRC16_DOH
      ; XRL A,#3BH
       movx @dptr,A         
          inc DPTR
          MOV A,CRC16_DOL
      ; XRL A,#4DH
          movx @dptr,A
         
   pop acc               
   POP PSW      
ret

国芯人工智能 发表于 2025-7-30 10:43:00

请教大神:Ai8H2K32U-45I-LQFP32芯片CRC校验不计算,是什么问题?

您好,关于您提到的Ai8H2K32U-45I-LQFP32芯片在使用CRC16DOH和CRC16DOL寄存器时未进行有效计算的问题,以下为专业分析与建议:

首先,CRC(Cyclic Redundancy Check)是一种用于检测数据传输或存储过程中错误的校验算法。在该芯片中,CRC功能通过硬件实现,用户需正确配置相关寄存器以触发计算过程。

根据您提供的寄存器定义:
CRC16CR:控制寄存器
CRC16DIN:输入寄存器
CRC16DOH:结果高位寄存器
CRC16DOL:结果低位寄存器

您描述的现象是“输入是什么值,输出就是什么值”,这表明CRC计算可能未被正确启动或配置。

可能原因及解决建议如下:

1. CRC使能未正确设置
   在CRC16CR寄存器中,需要设置相应的位以启用CRC计算。例如,可能需要设置BIT0(EN)为1来开启CRC功能。若未设置此位,则CRC不会执行计算,直接将输入值复制到输出寄存器。

   建议检查CRC16CR寄存器的配置是否正确,确保使能位已置1。

2. 数据写入顺序或方式错误
   CRC计算通常需要按顺序写入数据字节,并且每个字节应通过CRC16DIN寄存器逐个写入。若仅一次性写入整个数据块,或未按照正确的顺序进行操作,可能导致计算失效。

   请确认您是否逐字节写入数据,并确保每字节写入后CRC计算流程正常推进。

3. 初始化配置缺失
   某些芯片在使用CRC前需要进行初始化配置,例如设置多项式、初始值等。若您未对这些参数进行配置,CRC可能无法正确计算。

   建议查阅芯片数据手册,确认CRC模块的初始化流程,并确保相关寄存器(如POLY、INIT等)已正确配置。

4. 读取时机不当
   CRC计算完成后,结果才会被写入CRC16DOH和CRC16DOL寄存器。若在数据写入后立即读取结果,可能因计算未完成导致读取到无效值。

   建议在数据写入后等待一段时间(如若干指令周期),再读取CRC结果。

5. 程序逻辑未触发计算
   您的测试程序中未显示对CRC16CR寄存器的写入操作,这可能是关键问题所在。请确认是否在写入数据后,通过设置CRC16CR寄存器的相应位(如START)来触发计算过程。

   示例代码参考:
   MOV A, #0x01       ; 设置CRC使能
   MOV DPTR, #CRC16CR
   MOVX @DPTR, A      ; 写入控制寄存器

6. 数据长度与计算模式不匹配
   若CRC计算模式(如多项式选择、输入方向等)与实际数据长度或格式不符,也可能导致计算结果异常。

   请确认CRC配置是否与您的数据格式一致,包括数据位数、字节顺序等。

综上所述,建议您从以下几个方面进行排查:
确认CRC16CR寄存器的使能位是否正确设置;
确保数据逐字节写入CRC16DIN寄存器;
检查CRC初始化配置是否完整;
确保在数据写入后等待计算完成再读取结果;
验证CRC计算模式与数据格式是否匹配。

如仍无法解决问题,建议提供完整的代码片段及具体测试场景,以便进一步分析。

祝调试顺利!

[本文内容由国芯人工智能辅助生成,仅供参考]

DebugLab 发表于 2025-7-30 11:32:17

先打开EAXFR


乘风飞扬 发表于 2025-7-30 11:44:15

CRC寄存器是扩展寄存器,需要用间接寻址方式访问,这次人工智能生成的代码访问扩展寄存器的方法居然写对了(功能不对),可以参考。
此外在配置前,扩展寄存器访问使能要先开启。

ercircle 发表于 2025-7-30 15:27:46

离谱啊,这个给功能只有两个型号支持,找了个2K12U还是A系列。。。。。。
楼主对比手册例程试下





//测试工作频率为11.0592MHz
#include "stc8h.h"
#include "intrins.h"

#define FOSC      11059200UL
#define BAUD      (65536 - FOSC/4/115200)

void main()
{
    P_SW2 = 0x80;

    P0M0 = 0x00;
    P0M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;

    SCON = 0x52;
    AUXR = 0x40;
    TMOD = 0x00;
    TL1 = BAUD;
    TH1 = BAUD >> 8;
    TR1 = 1;

    printf("STC8H CRC16 Test \n");

    CRC16_CR = 0x83;                //复位 CRC 模块,并使能输入输出数据反转
    CRC16_DIN = 0x11;               //输入待计算的 CRC 数据
    CRC16_DIN = 0x22;
    CRC16_DIN = 0x33;
    CRC16_DIN = 0x44;
    CRC16_DIN = 0x55;
    CRC16_DIN = 0x66;
    CRC16_DIN = 0x77;
    CRC16_DIN = 0x88;
    CRC16_DIN = 0x99;

    printf("CRC16 = %02bx%02bx\n", CRC16_DOH, CRC16_DOL);//从 CRC 输出寄存器中读取 CRC 校验结果

    while (1);
}



神农鼎 发表于 2025-7-30 16:47:16










ESSON 发表于 2025-8-2 08:33:29

DebugLab 发表于 2025-7-30 11:32
先打开EAXFR

{:qiang:}
页: [1]
查看完整版本: 请教大神,Ai8H2K32U-45I-LQFP32芯片CRC效验不计算,是什么问题 | EAXFR