找回密码
 立即注册
查看: 52|回复: 5

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-07-30 10:41:47

1

主题

0

回帖

29

积分

新手上路

积分
29
发表于 昨天 10:41 | 显示全部楼层 |阅读模式
请教大神:我使用的是Ai8H2K32U-45I-LQFP32芯片,使用其CRC硬件效验时,CRC16_DOH、CRC16_DOL输入是什么值,输出就是什么值,感觉没有给我计算,不知道我哪里漏了啥?

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

定义:
CRC16_CR    EQU  0FB30H  ;;CRC控制寄存器
CRC16_DIN   EQU  0FB31H  ;;CRC输入寄存器
CRC16_DOH   EQU  0FB32H  ;;CRC结果寄存器高位
CRC16_DOL   EQU  0FB33H  ;;CRC结果寄存器低位

rt2SendCountCyc  equ      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     ;;;0202  11 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
        
  POP  PSW
  pop  acc
  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

回复

使用道具 举报 送花

3

主题

247

回帖

-795

积分

等待验证会员

积分
-795
发表于 昨天 10:43 | 显示全部楼层
请教大神: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)来触发计算过程。

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

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

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

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

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

祝调试顺利!

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-07-31 08:58:47
已绑定手机

87

主题

5532

回帖

1万

积分

超级版主

DebugLab

积分
10123
发表于 昨天 11:32 | 显示全部楼层
先打开EAXFR
截图202507301132507781.jpg

DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:479
  • 最近打卡:2025-07-31 08:56:35
已绑定手机

44

主题

2129

回帖

7413

积分

论坛元老

积分
7413
发表于 昨天 11:44 | 显示全部楼层
CRC寄存器是扩展寄存器,需要用间接寻址方式访问,这次人工智能生成的代码访问扩展寄存器的方法居然写对了(功能不对),可以参考。
此外在配置前,扩展寄存器访问使能要先开启。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:253
  • 最近打卡:2025-07-31 08:55:10
已绑定手机

78

主题

2294

回帖

5226

积分

荣誉版主

无情的代码机器

积分
5226
发表于 昨天 15:27 | 显示全部楼层
离谱啊,这个给功能只有两个型号支持,找了个2K12U还是A系列。。。。。。
楼主对比手册例程试下


截图202507301526212841.jpg


  1. //测试工作频率为11.0592MHz
  2. #include "stc8h.h"
  3. #include "intrins.h"
  4. #define FOSC        11059200UL
  5. #define BAUD        (65536 - FOSC/4/115200)
  6. void main()
  7. {
  8.     P_SW2 = 0x80;
  9.     P0M0 = 0x00;
  10.     P0M1 = 0x00;
  11.     P3M0 = 0x00;
  12.     P3M1 = 0x00;
  13.     SCON = 0x52;
  14.     AUXR = 0x40;
  15.     TMOD = 0x00;
  16.     TL1 = BAUD;
  17.     TH1 = BAUD >> 8;
  18.     TR1 = 1;
  19.     printf("STC8H CRC16 Test \n");
  20.     CRC16_CR = 0x83;                //复位 CRC 模块,并使能输入输出数据反转
  21.     CRC16_DIN = 0x11;               //输入待计算的 CRC 数据
  22.     CRC16_DIN = 0x22;
  23.     CRC16_DIN = 0x33;
  24.     CRC16_DIN = 0x44;
  25.     CRC16_DIN = 0x55;
  26.     CRC16_DIN = 0x66;
  27.     CRC16_DIN = 0x77;
  28.     CRC16_DIN = 0x88;
  29.     CRC16_DIN = 0x99;
  30.     printf("CRC16 = %02bx%02bx\n", CRC16_DOH, CRC16_DOL);  //从 CRC 输出寄存器中读取 CRC 校验结果
  31.     while (1);
  32. }
复制代码




三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:144
  • 最近打卡:2025-07-31 10:37:58

760

主题

1万

回帖

1万

积分

管理员

积分
18137
发表于 昨天 16:47 | 显示全部楼层
截图202507301646051757.jpg


截图202507301646274568.jpg

截图202507301647131533.jpg


截图202507301649594171.jpg
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-7-31 22:10 , Processed in 0.126830 second(s), 88 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表