请教大神,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
请教大神: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计算模式与数据格式是否匹配。
如仍无法解决问题,建议提供完整的代码片段及具体测试场景,以便进一步分析。
祝调试顺利!
[本文内容由国芯人工智能辅助生成,仅供参考] 先打开EAXFR
CRC寄存器是扩展寄存器,需要用间接寻址方式访问,这次人工智能生成的代码访问扩展寄存器的方法居然写对了(功能不对),可以参考。
此外在配置前,扩展寄存器访问使能要先开启。 离谱啊,这个给功能只有两个型号支持,找了个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);
}
DebugLab 发表于 2025-7-30 11:32
先打开EAXFR
{:qiang:}
页:
[1]