还好有了网络,经过三天三夜的搜寻与学习,终于也明白了个大概,也收集了不少例程,但CRC7的文章比较少,CRC7应该是SD卡专用的格式,其种子(多项式)的二进值是10001001,这个种子是用来除别的数来获得该数的CRC,这个过程很繁杂,要一位一位地比较运算,听说要90多个时钟才算完一个字,如果是一个长字串,那就是个天文数字的时钟数,最后只得了个7位的数字,很浪费时间,因此有聪明人就发明了查表法,就是把0-255的CRC都先算出来,制成一个表,放在程序内某个区,需要知道一个BYTE的CRC,就到相应位置去查就可,51单片机就用MOVC A, @A+DPTR,至于字串的CRC怎么算呢?网上文章的说法是:
AUXR EQU 8EH
AUXR1 EQU 0A2H ;7,6=PCA-P4,5=SPI-P4,4=S2-P4,3=GF2,2=ADRJ,1,0=DPS
AUXR2 EQU 08FH
WAKE_CLKO EQU 08FH ;WAKEUP AND CLOCK OUTPUT CONTROL REGISTER 8GNEWNAME:INTCLKO x,EX4,EX3,EX2,xT2CLKO, T1CLKO, T0CLKO
AUXINTIF EQU 0EFH ;EXTRA INT
ORG 0000H
LJMP MAIN
ORG 0023H
LJMP UART1 ;UART1 RECEIVED INTERRUPT
MAIN:
LCALL DELAY3
;MOV 97H, #00000001; SLOW DOWN
MOV R0, #HEADBUFFER1 ;INIT THE BTYE TO SENT IN BUFFER POINTER
MOV R1, #HEADBUFFER1 ;INIT THE POINTER FOR BYTE CAN STORE IN BUFFER
MOV WAKE_CLKO,#00000001B ;ENABLE T2(=4),T1(=2) T0(=1) HAVE CLOCK OUTPUT T2@P1.0T1@P3.5T0@P3.4
MOV AUXR,#11111100B ;T0X12,T1X12,UART_M0X6,T2RUN,S2SMOD,T2X12,EXTRAM,S1BRS
MOV AUXR2, #00000000B ;#00010000B=SHIFT UART2
MOV TMOD, #00100010B ;TIMER0, TIMER1 AS MOD2(8 BYTE AUTO RELOAD TIMER)
;GATE, C/T,M1,M0(T1) GATE, C/T,M1,MO(T0)
MOV PCON, #00000000B ;THIS DOUBLE THE T2 AND T0 T1 RATE; SMOD IS AT PCON.7 249(3.64=32US) 219 AT P3.5)
LCALL IOSET8G ;8G初始时IO脚全为高阻,必须设定LED才会亮
LCALL INITIAL_UART1 ;USE T1 AS SERIAL BAUD GENERATE FOR UART1
CLR TI
CLR RI
SETB EA ;ENABLE ALL INTERRUPT
;================这里开始========================
MOV A, #55H ;这个测定串口正常
LCALL SENTONEBYTE1
MOV DPTR, #2000H ;这个取码表第03H位显示1BH, 证实取码位置正确
MOV A, #03H
MOVC A, @A+DPTR
LCALL SENTONEBYTE1
MOV A, #40H ;第一字节查表正确,显示64H
MOVC A, @A+DPTR
LCALL SENTONEBYTE1
MOV B, #00H ;第二字节
XRL A, B ;根据网上指导,要先与原来前面获得的CRC值(64H)异或
LCALL SENTONEBYTE1 ;但与00H异或后还是原来的值
MOVC A, @A+DPTR
LCALL SENTONEBYTE1
MOV B, #00H
XRL A, B
LCALL SENTONEBYTE1
MOVC A, @A+DPTR
LCALL SENTONEBYTE1
MOV B, #00H
XRL A, B
LCALL SENTONEBYTE1
MOVC A, @A+DPTR
LCALL SENTONEBYTE1
MOV B, #00H
XRL A, B
LCALL SENTONEBYTE1
MOVC A, @A+DPTR
LCALL SENTONEBYTE1
LED: ;停机
CLR P1.0
LED1:
MOV A, R0
XRL A, R1
JZ LEDEXIT
LEDEXIT:
JMP LED1
INITIAL_UART1: ;
MOV SCON, #01010000B ;SET AS BAUD VERIABLE, NO ODD/EVEN CHECK
MOV TH1, #247 ;247(11.0592, 38400BPS) FOR TIMER_1 251=115200(18.4320M 115200BPS) 253(11.0592M 115200BPS) IF PCON.7=0
MOV TL1, #247 ;247(33.1771, 115200 255-253=2 2x2=4=22M, 4X2=33.1771) PCON.7=0
SETB PS ;SERIAL PORT PRORITY HIGH
SETB TR1 ;RUN TIMER_1
SETB ES ;ENABLE UART1 INTERRUPT
RET
SENTONEBYTE1: ;SENT OUT A
CHECKBUSY1:
JB 40H, CHECKBUSY1
SETB 40H
MOV SBUF, A
RET
UART1:
PUSH ACC
PUSH PSW
JNB RI, UART1CHECKTI
MOV A, SBUF ;READ THE CHARACTER FROM THE SERIAL PORT
CLR RI ;CLEAR RECEICED FLAG
MOV @R1, A ;SAVE TO BUFFER
CJNE R1, #LASTBUFFER1, NEXTREADBUFFER
MOV R1, #HEADBUFFER1
JMP UART1EXIT
NEXTREADBUFFER:
INC R1 ;POINT TO NEXT BUFFER
JMP UART1EXIT
UART1CHECKTI:
CLR TI
CLR 40H
UART1EXIT:
POP PSW
POP ACC
RETI