⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 e2p.s43

📁 msp430f133对24c01的读写
💻 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 + -