📄 e2p.s43
字号:
RSEG CODE ; Program code
; 连续写4*8字节数据到 E2p.
WRALL_PART
; PUSH R6
MOV #4,R6
CALL #WRALL
; POP R6
RET
; 连续写12*8字节数据到 E2p.
WRALL_ALL
; PUSH R6
MOV #12,R6
CALL #WRALL
; POP R6
RET
; 连续写X*8字节数据到 E2p.
WRALL
;PUSH R4
;PUSH R5
CLR R4
BIC #E_EEP,&F_ERROR ;清错误标志
BIC.B #VCC_EEP,P6OUT ; 开VCC_EEP
WRALL0
MOV #HEAT_SUM,I2CDATA ; I2CDATA: 要写数据的起始地址
MOV #E2P_ADDR,ADDRESS ; ADDRESS: E2PROM地址
ADD R4,I2CDATA
ADD R4,ADDRESS
call #WRITE_BLOCK ;连续写8字节数据到 E2p
jn wfault
jc wfault
mov #3333,R5 ;延时10ms
delay2 DEC R5
JNZ delay2
ADD #08H,R4
DEC R6
JNZ WRALL0
CLRC
wfault
BIS.B #VCC_EEP,P6OUT ; 关VCC_EEP
MOV #1500,R6 ; 延时
CALL #WWAIT
CALL #READ_WORD ; 读效验字
CMP #0A5F0H,RD_ADDR
JZ wriend
BIS #E_EEP,&F_ERROR
wriend
; POP R5
; POP R4
RET
;-------------------------------------------------------------------
; 连续写8字节数据到 E2p.
;entry: I2CDATA--要写的数据起始地址. ADDRESS --EEPROM 的起始地址.
;-------------------------------------------------------------------
WRITE_BLOCK
push DATA
push MASK
push R9
DINT ; 关中断
BIC.B #SCL+SDA,&SDADAT ; SCL and SDA output buffer low
MOV I2CDATA,R9 ; 要写数据的起始地址
clr DATA ; 清计数
call #start
CALL #ControlByte ; I2CDATA = Control byte
call #shout ; send device address
jc wbl2 ; abort if no acknowledge
mov.b ADDRESS,I2CDATA
call #shout ; send word address
jc wbl2 ; abort if no acknowledge
wbl0 MOV.B @R9+,I2CDATA
CALL #shout ; send data
jc wbl2 ; abort if no acknowledge
CMP #PSIZE,DATA
JEQ wbl1
INC DATA
JMP wbl0
wbl1 CLRN ;clear error flag
CLRC
wbl2 call #stop
EINT ;开中断
WB13
POP R9
pop MASK
pop DATA
ret
;-------------------------------------------------------------------
; 连续从E2p读 N 字节数据到RAM .
; Read from one byte to one page of data from E2PROM.
;entry: I2CDATA--放读出数据的起始地址, RD_LEN--读的字节长度
; ADDRESS --EEPROM 的起始地址.
;-------------------------------------------------------------------
RDALL
Push COUNT
push DATA
push MASK
push R9
MOV #HEAT_SUM,I2CDATA ; I2CDATA: 存放读出数据的起始地址
MOV #E2P_ADDR,ADDRESS ; EEPROM data address
BIC #E_EEP,&F_ERROR ;清错误标志
DINT
BIC.B #SCL+SDA,&SDADAT ; SCL and SDA output buffer lo
BIC.B #VCC_EEP,P6OUT ; 开VCC_EEP
mov I2CDATA,R9 ;R9:放所读数据的起始地址
clr DATA
call #start
CALL #ControlByte ; I2CDATA = Control byte
push I2CDATA ;protect ControlByte
; Send dummy write command
call #shout ; send device address
jc rb1 ; abort if no acknowledge
MOV.B ADDRESS,I2CDATA ; send word address
call #shout
jc rb1
; Send read command and receive data.
call #start ; second start for read
pop I2CDATA ; ControlByte
bis.b #01h,I2CDATA ; specify read operation
call #shout ; send device address
jc rb1
MOV #RD_LEN, MASK
DEC MASK ;读字节长度-1
x31 call #shin ; receive data byte
MOV.B I2CDATA, 0(R9) ; save data
CMP MASK,DATA ;DATA
JEQ ST
INC R9
INC DATA
CALL #ACK
JMP x31
ST CALL #NAK
CLRN ; clear error flag
CLRC
call #stop
rb1
JC rb2
JN rb2
CMP #0A5F0H,RD_ADDR
JZ rb3
rb2
BIS #E_EEP,F_ERROR
rb3
EINT
BIS.B #VCC_EEP,P6OUT ; 关VCC_EEP
pop R9
pop MASK
pop DATA
pop COUNT
RET
; 读一个字
READ_WORD
PUSH R9
mov #E2P_ADDR_RD,ADDRESS ; ADDRESS: E2PROM地址
PUSH ADDRESS
CALL #read_byte ;exit: I2CDATA (BYTE)
MOV.B I2CDATA,R9 ;保存读出的低字节
POP ADDRESS
INC ADDRESS ;ADDRESS+1要读的高字节
CALL #read_byte ;exit: I2CDATA (BYTE)
SWPB I2CDATA ;交换高低字节
CLR.B I2CDATA ;低字节=0
MOV.B R9,I2CDATA ;送低字节
MOV I2CDATA,RD_ADDR
POP R9
RET
; Current ADDRESS Read function. Returns data in I2CDATA.
read_current Push COUNT
push MASK
BIC.B #SCL+SDA,&SDADAT ; SCL and SDA output buffer lo
BIC.B #VCC_EEP,P6OUT ; 开VCC_EEP
call #start
CALL #ControlByte ; I2CDATA = Control byte
BIS.B #01H,I2CDATA ; specify read operation
call #shout ; send device address
jc rc1
call #shin ; receive data byte
call #NAK ; do not acknowledge byte
CLRN ; clear error flag
CLRC
rc1 call #stop
BIS.B #VCC_EEP,P6OUT ; 关VCC_EEP
EINT ;开中断
pop MASK
pop COUNT
ret
; Random Read function. Returns data in I2CDATA.
; entry: ADDRESS --EEPROM 的起始地址.
read_byte
push COUNT
push MASK
DINT ;关中断
BIC.B #SCL+SDA,&SDADAT ; SCL and SDA output buffer lo
BIC.B #VCC_EEP,P6OUT ; 开VCC_EEP
CALL #ControlByte ; I2CDATA = Control byte
; Send dummy write command
call #start
call #shout ; send device address
jc rr1
MOV.B ADDRESS,I2CDATA ; send word address
call #shout
jc rr1
call #read_current ; Call Current ADDRESS Read function.
jmp rr2 ; exit
rr1 call #stop
rr2
BIS.B #VCC_EEP,P6OUT ; 关VCC_EEP
pop MASK
pop COUNT
ret
; Send START, defined as high-to-low SDA with SCL high.
; Return with SCL, SDA low.
start
BIC.B #SDA+SCL,&SCLEN ;SCL, SDA=high
BIS.B #SDA,&SDAEN
BIS.B #SCL,&SCLEN
ret
; Send STOP, defined as low-to-high SDA with SCL high.
; SCL expected low on entry. Return with SCL, SDA high.
stop
BIS.B #SDA,&SDAEN
BIC.B #SCL,&SCLEN
BIC.B #SDA,&SDAEN
ret
; Shift out a byte to the EEPROM, most significant bit first.
; SCL, SDA expected low on entry. Return with SCL low.
; Called with data to send in I2CDATA.
shout
MOV.B #80h,MASK ; Bit mask: MSB first
I2C_Send1 BIT.B MASK,I2CDATA ; Info bit –> Carry
JC I2C_Send2
BIS.B #SDA,&SDAEN ; SDA = ’L’
BIC.B #SCL,&SCLEN ; SCL = ’H’
JMP I2C_Send3
I2C_Send2
BIC.B #SDA,&SDAEN ; SDA = ’H’
BIC.B #SCL,&SCLEN ; SCL = ’H’
BIT.B #SDA,&SDAIN
JNC Error_Arbit
I2C_Send3
CLRC
RRC.B MASK ; Next address bit
BIS.B #SCL,&SCLEN ; SCL =L
JNC I2C_Send1 ; No Carry: continue
BIC.B #SDA,&SDAEN ; Acknoledge bit
BIC.B #SCL,&SCLEN ; raise clock
BIT.B #SDA,&SDAIN ; Read Ack bit to carry
BIS.B #SCL,&SCLEN ; drop clock
ret
Error_Arbit SETN ; Set arbitration error
ret
; Shift in a byte from the EEPROM, most significant bit first.
; SCL expected low on entry. Return with SCL low.
; Returns received data byte in I2CDATA.
shin
BIC.B #SDA,&SDAEN ; make SDA an input
CLR I2CDATA
MOV #8,COUNT ; Read 8 bits
si1
BIC.B #SCL,&SCLEN ; SCL = H
BIT.B #SDA,&SDAIN ; Read data to carry
RLC.B I2CDATA ; Store received Bit
BIS.B #SCL,&SCLEN ; SCL = L
DEC COUNT
JNZ si1 ;8位依次读入I2CDATA中
ret
; Clock out an acknowledge bit (low).
; SCL expected low on entry. Return with SCL, SDA low.
ACK
BIS.B #SDA,&SDAEN ; ACK bit
BIC.B #SCL,&SCLEN ; raise clock
BIS.B #SCL,&SCLEN ; drop clock
ret
; Clock out a negative acknowledge bit (high).
; SCL expected low on entry. Return with SCL low, SDA high.
NAK
BIC.B #SDA,&SDAEN ; NAK bit
BIC.B #SCL,&SCLEN ; raise clock
BIS.B #SCL,&SCLEN ; drop clock
ret
; Build control byte控制字
;Entry: ADDRESS exit: I2CDATA
ControlByte
CLR I2CDATA
CLRC ;
MOV.B ADDRESS_1,I2CDATA ; Hi byte of EEPROM address
RLC.B I2CDATA
AND.B #0Eh,I2CDATA ; A2, A1 and A0
ADD.B #Code,I2CDATA ; Add device code (24C65)
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -