📄 ss84b0337a.s
字号:
LOCAL_CNT=#3
CALL !KWH_BCDADJ
I2CRdWtCounter=#3
DE=#I2CRT_Buffer ;以上流程会恢复DE、I2CRdWtCounter、WordAddress的内容
CALLT [TAddr_WtDataWithBkUp]
RET
;-----------------------------------------------------------------------------------------------------
;CIRCUITERR_OVERTIME:
; if_bit(B_VOLTAGEBREAKAVAIL)
; CALLT [TAddr_READTIME_JUD1]
; AX=BREAKPOINT
; CALL !WRITEOVER_TIME
; endif
; if_bit(B_CURRENTNOTAVAIL)
; CALLT [TAddr_READTIME_JUD1]
; AX=CURRENTPOINT
; CALL !WRITEOVER_TIME
; endif
; RET
;--------------------------------------------------------------------
;send byte via SPI
;--------------------------------------------------------------------
Sendbyte:
SPIBitInd=#08H
Sendbyte1:
;if_bit(LVIF)
; B_LowVol=1
;endif
SPICLKIM=1
ROLC A,1
if_bit (CY)
SPISDOIM=1
else
SPISDOIM=0
endif
CALLT [TAddr_Delay]
SPICLKIM=0
CALLT [TAddr_Delay]
DBNZ SPIBitInd,$Sendbyte1
RET
;--------------------------------------------------------------------
;Receive byte via SPI
;--------------------------------------------------------------------
Receivebyte:
SPICLKIM=0
SPIBitInd=#08H
Receivebyte1:
SPICLKIM=1
CALLT [TAddr_Delay]
CY=0
if_bit (SPISDIIM)
CY=1
endif
ROLC A,1
SPICLKIM=0
CALLT [TAddr_Delay]
DBNZ SPIBitInd,$Receivebyte1
RET
;--------------------------------------------------------------------
;write SPI subroutine
;--------------------------------------------------------------------
WriteSPI:
;Enable SPI
SPICSIM=1
CALLT [TAddr_Delay]
SPICLKIM=0
CALLT [TAddr_Delay]
SPICSIM=0
;Send 8-bits Command and 24-bits Data to SPI
A=SPICMD
CALLT [TAddr_Sendbyte]
A=SPIDATAH
CALLT [TAddr_Sendbyte]
A=SPIDATAM
CALLT [TAddr_Sendbyte]
A=SPIDATAL
CALLT [TAddr_Sendbyte]
;Disable SPI
SPICSIM=1
RET
;--------------------------------------------------------------------
;read SPI subroutine
;--------------------------------------------------------------------
ReadSPI:
;Enable SPI
SPICSIM=1
CALLT [TAddr_Delay]
SPICLKIM=0
CALLT [TAddr_Delay]
SPICSIM=0
A=SPICMD
CALLT [TAddr_Sendbyte]
;waiting
CALLT [TAddr_Delay]
;read 24-bits data via SPI
CALL !Receivebyte
SPIDATAH=A
CALL !Receivebyte
SPIDATAM=A
CALL !Receivebyte
SPIDATAL=A
;disable SPI
SPICSIM=1
RET
;---------------------------------------------------------------------------------
;存取校表数据子程序
;---------------------------------------------------------------------------------
;WRITE_7022DATA:
RdWt_AdjData:
SPICMD=#0C6H
SPIDATAH=#00H
SPIDATAM=#00H
SPIDATAL=#5AH
CALL !WriteSPI
WORKER_CNT=#5
HL=#TAB7022
RdWtAdjData_Loop:
A=[HL]
SPI_CNT=A
HL++
A=[HL]
REG_7022=A
PUSH HL
CALL !RW_AdjDataSegm
POP HL
HL++
DBNZ WORKER_CNT,$RdWtAdjData_Loop
if_bit(B_AdjDataErr)
B_AdjDataErr=0
Counter_AdjDataErr++
else
Counter_AdjDataErr=#0
endif
SPICMD=#0C6H
SPIDATAH=#00H
SPIDATAM=#00H
SPIDATAL=#00H
CALL !WriteSPI
RET
;---------------------------------------------------------------------------------
;分段读写校表数据子程序
;---------------------------------------------------------------------------------
RW_AdjDataSegm:
if_bit(!LVIF)
WDTE=#0ACH
A=REG_7022 ;校表寄存器地址乘以4,再加上0x0600,得到E2中的相应地址
ROL A,1
ROL A,1
A<->X
A=#06H
WordAddress=AX
DE=#I2CRT_Buffer
I2CRdWtCounter=#3
B_OPERATE04=1
CALLT [TAddr_RdDataWithBkUp]
B_OPERATE04=0
if_bit(!CY)
CALLT [TAddr_RdDataWithBkUp]
endif
if_bit(CY)
if_bit(B_CheckAdjData)
A=REG_7022
SPICMD=A
CALLT [TAddr_ReadSPI]
HL=#SPIDATA+2
DE=#I2CRT_Buffer+2
LOCAL_CNT=#3
CALLT [TAddr_JUDGE_MAX]
if_bit(!Z)
B_AdjDataErr=1
RET
endif
else
A=REG_7022
A|=#80H
SPICMD=A
SPIDATAH=I2CRT_Buffer(A)
SPIDATAM=I2CRT_Buffer+1(A)
SPIDATAL=I2CRT_Buffer+2(A)
CALL !WriteSPI
endif
endif
;else
; B_LowVol=1
endif
REG_7022++
DBNZ SPI_CNT,$RW_AdjDataSegm
;Counter_AdjDataErr=#0
RET
;--------------------------------------------------------------------------
;读E2数据子程序
;1、添加校验和
;2、读完后恢复DE和I2CRdWtCounter的值
;--------------------------------------------------------------------------
READ_24CX:
I2CDeviceInd=#2
AX=DE
I2CPointer=AX
CALLT [TAddr_ReadI2C]
A=I2CRdWtCounterBACK
I2CRdWtCounter=A ;恢复DE和I2CRdWtCounter的值
LOCAL_CNT=A
AX=I2CPointer
DE=AX
HL=AX
CALLT [TAddr_CALC_CHECKSUM] ;该程序应避免修改DE
A+=#5AH
B_CHECKSUMB=0
if(A!=[HL])
B_CHECKSUMB=1
;else
; B_CHECKSUMB=0
endif
RET
;-----------------------------------------------------------------------------------------
;RdDataWithBkUp: 读带备份数据子程序入口
;READ_COPYDAY: 读抄表日子程序入口
;入口参数:
; DE
; WordAddress
; I2CRdWtCounter
; 读完后恢复I2CRdWtCounter、DE的值
;-----------------------------------------------------------------------------------------
READ_COPYDAY:
DE=#I2CRT_SubBuffer1
WordAddress=#COPYDATY(AX)
I2CRdWtCounter=#2
RdDataWithBkUp:
;WDTE=#0ACH
AX=DE
I2CPointer1=AX
CALLT [TAddr_READ_24CX]
if_bit(B_RdWrFail)
CY=0
RET
endif
DE=#Universal_Buffer
WordAddressH++ ;读备份数据
CALLT [TAddr_READ_24CX]
WordAddressH--
B=#0A6H
CALL !AddOffSet ;数据减5AH
AX=I2CPointer1
HL=AX
C=I2CRdWtCounterBACK(A)
Cmp_DataBkUpLoop: ;DE初值为#Universal_Buffer
A=[DE]
if(A!=[HL])
BR $Cmp_DataBkUpEnd
endif
DE++
HL++
DBNZ C,$Cmp_DataBkUpLoop
Cmp_DataBkUpEnd:
AX=I2CPointer1
DE=AX
if_bit(Z)
CY=1
RET
else
CALLT [TAddr_READ_24CX]
if(!B_CHECKSUMB)
if_bit(!B_OPERATE04)
CALL !WriteBkUp
endif
CY=1
RET
endif
WordAddressH++ ;读备份数据
CALLT [TAddr_READ_24CX]
WordAddressH--
B=#0A6H
CALL !AddOffSet ;数据减5AH
if(!B_CHECKSUMB)
if_bit(!B_OPERATE04)
CALLT [TAddr_WRITE_24CX]
endif
CY=1
RET
endif
CALLT [TAddr_READ_24CX]
endif
CY=0
RET
;---------------------------------------------------------------------------
;数据加偏移量子程序
;
;处理完后恢复DE的值
;---------------------------------------------------------------------------
AddOffSet:
LOCAL_CNT=I2CRdWtCounterBACK(A)
AX=DE
HL=AX
AddOffSet_Loop:
A=[DE]
A+=B
[DE]=A
DE++
DBNZ LOCAL_CNT,$AddOffSet_Loop
AX=HL
DE=AX
RET
;------------------------------------------------------------------
;向E2写入数据子程序
;1、添加校验和
;2、写完后恢复DE和I2CRdWtCounter的值
;------------------------------------------------------------------
WRITE_24CX:
I2CDeviceInd=#2
AX=DE
I2CPointer=AX
HL=AX
A=I2CRdWtCounter
LOCAL_CNT=A
CALLT [TAddr_CALC_CHECKSUM]
A+=#5AH
[HL]=A
I2CRdWtCounter++
CALLT [TAddr_WriteI2C]
A=I2CRdWtCounterBACK ;恢复DE、I2CRdWtCounter的值
A--
I2CRdWtCounter=A
I2CRdWtCounterBACK=A
AX=I2CPointer
DE=AX
RET
;------------------------------------------------------------------
;WtDataWithBkUp:写数据及其备份入口
;WriteBkUp:写备份入口
;入口参数:
; DE
; WordAddress
; I2CRdWtCounter
; 写完后恢复I2CRdWtCounter、DE、I2CRdWtCounter的值
;-----------------------------------------------------------------
WtDataWithBkUp:
CALLT [TAddr_WRITE_24CX]
WriteBkUp:
B=#5AH
CALL !AddOffSet ;数据加5AH
WordAddressH++ ;写备份数据
CALLT [TAddr_WRITE_24CX]
WordAddressH--
B=#0A6H
CALL !AddOffSet ;数据减5AH
RET
;---------------------------------------------------------------------------------
;
;WRITE_7022DATA:
; WORKER_CNT=#4
; HL=#TAB7022
;WRITE_7022LOOP:
; A=[HL]
; SPI_CNT=A
; HL++
; A=[HL]
; REG_7022=A
; PUSH HL
; CALL !WRITE_7022REG
; POP HL
; HL++
; DBNZ WORKER_CNT,$WRITE_7022LOOP
; RET
;-------------------------------------------------------------------------------------
;WRITE_7022REG:
; AX=#0
; A=REG_7022
; A<->X
; BC=#4
; CALLT [TAddr_Multiply]
; HL=AX
; AX=#0600H
; A<->X
; ADD A,L
; A<->X
; ADDC A,H
; SET1 B_OPERATE04
; CALL !READ_7022PARA
; if_bit(B_CHECKSUMB)
; AX=WordAddress
; AX+=#100H
; CALL !READ_7022PARA
; if_bit(B_CHECKSUMB)
; CLR1 B_OPERATE04
; AX=WordAddress
; CALL !READ_7022PARA
; if_bit(B_CHECKSUMB)
; AX=WordAddress
; AX-=#100H
; CALL !READ_7022PARA
; if_bit(B_CHECKSUMB)
; BR $WRITE_7022REGEND1
; endif
; endif
; endif
; endif
;
; A=#80H
; OR A,REG_7022
; SPICMD=A
; CALL !WriteSPI
;WRITE_7022REGEND1:
; REG_7022++
; DBNZ SPI_CNT,$WRITE_7022REG
;WRITE_7022REGEND:
; CLR1 B_OPERATE04
; RET
;---------------------------------------------------------------------------------------------
;READ_POWERPARA:
; WordAddress=#EPOWERPARA(AX)
; I2CRdWtCounter=#12
; DE=#I2CRT_Buffer+6 ;I2CRT_SubBuffer0
; CALLT [TAddr_RdDataWithBkUp] ;初始化流程里读有备份数据,读备份时要占用Universal_Buffer以外的空间
; BF B_CHECKSUMB,$READPARA_SUCCEED
; LOCAL_CNT=#12
; HL=#I2CRT_Buffer+6
; CALLT [TAddr_TEMP_BUFCLR]
;READPARA_SUCCEED:
; HL=#I2CRT_Buffer+10
; DE=#KWHPOINT
; LOCAL_CNT=#6
; CALLT [TAddr_TRAN_DATA]
; AX=KWHPOINT
; A=#8
; KWHPOINT=AX
; AX=BREAKPOINT
; A=#9
; BREAKPOINT=AX
; AX=CURRENTPOINT
; A=#10
; CURRENTPOINT=AX
; PULSE_CNT=I2CRT_Buffer+16(A)
; A=I2CRT_Buffer+17
; AND A,#0FH
; if(A==#0)
; CLR1 B_KWHCHAN
; else
; SET1 B_KWHCHAN
; endif
; A=TEMP_BUF0H
; AND A,#0F0H
; if(A==#0)
; CLR1 B_CLRKWHFLAG
; else
; SET1 B_CLRKWHFLAG
; endif
;
;
; RET
;
;----------------------------------------------------------------------------------------------------------------
;AddrAndFlag --
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -