📄 i2c.txt
字号:
;------- read EEPROM-------------------------------------------------------------------------------------
MOVLW 0AEH
MOVWF SLAVE
MOVLW .1
MOVWF ADDR
CALL RDBYTE
MOVF DATAI,W
MOVWF ADDRESS_L
MOVLW 0AEH
MOVWF SLAVE
MOVLW .2
MOVWF ADDR
CALL RDBYTE
MOVF DATAI,W
MOVWF ADDRESS_H
MOVLW .2
SUBWF ADDRESS_H,W
BTFSS STATUS,C
GOTO MAIN_LOOP
MOVLW .1
MOVWF ADDRESS_L
CLRF ADDRESS_H
;-------------------------------E2PROM write e2prom-----------------------------------------------
CLRWDT
MOVLW 0AEH ; WRITE BIT IS 0
MOVWF SLAVE
MOVLW .1
MOVWF ADDR
MOVF ADDRESS_L,W; write low bit DATA
MOVWF DATAO
CALL WRBYTE
CALL DELAY_5
;CLRWDT
MOVLW 0AEH
MOVWF SLAVE
MOVLW .2
MOVWF ADDR
MOVF ADDRESS_H,W
MOVWF DATAO
CALL WRBYTE
CALL DELAY_5
BCF FLAG,ADDR_CHANGE
NOP
GOTO MAIN_LOOP
;---------------------- I2C BUS ------------------------------------------------------------------------------
BSTART
; MOVLW 00H
; MOVWF TRISC
BCF TRISC,3
NOP
BCF TRISC,4
BSF I2C_SDA
BSF I2C_SCL
MOVLW .1
BTFSS I2C_SCL
CALL ERR
BCF I2C_SDA
NOP
NOP
NOP
BCF I2C_SCL
RETLW 0
BSTOP
; MOVLW 00H
; MOVWF TRISC
BCF TRISC,3
NOP
BCF TRISC,4
BCF I2C_SDA
BSF I2C_SCL
NOP
NOP
NOP
MOVLW .1
BTFSS I2C_SCL
CALL ERR
BSF I2C_SDA
MOVLW .4
BTFSS I2C_SDA
CALL ERR
RETLW 0
ERR
BTFSS FLAG,ERRORS ; Remain as first error encountered
MOVWF ERCODE ; Save error code
BSF FLAG,ERRORS ; Set error flag
RETLW 0
;
;-----------------------------------------------------------------------------
; Serial data send from PIC to serial EEPROM, bit-by-bit subroutine
;-----------------------------------------------------------------------------
; Input : None
; Output : To (DI) of serial EEPROM device
;-----------------------------------------------------------------------------
;
BITIN
; MOVLW B'00010000' ; Force SDA line as input
; MOVWF TRISC
BCF TRISC,3
NOP
BSF TRISC,4
BSF I2C_SDA ; Set SDA for input
BCF EEPROM,DI
BSF I2C_SCL ; Clock high
MOVLW 1
BTFSC I2C_SCL ; Skip if SCL is high
GOTO BIT1
BTFSS FLAG,ERRORS ; Remain as first error encountered
MOVWF ERCODE ; Save error code
BSF FLAG,ERRORS ; Set error flag
BIT1
BTFSC I2C_SDA ; Read SDA pin
BSF EEPROM,DI ; DI = 1
NOP ; Delay
BCF I2C_SCL ; Return SCL to low
RETLW 0
;
;END SUB
PAGE
;
;-----------------------------------------------------------------------------
; Serial data receive from serial EEPROM to PIC, bit-by-bit subroutine
;-----------------------------------------------------------------------------
; Input : EEPROM file
; Output : From (DO) of serial EEPROM device to PIC
;-----------------------------------------------------------------------------
;
BITOUT
; MOVLW 00H ; Set SDA, SCL as outputs
; MOVWF TRISC
BCF TRISC,3
NOP
BCF TRISC,4
BTFSS EEPROM,DO
GOTO BIT0
BSF I2C_SDA ; Output bit 0
MOVLW 2
BTFSC I2C_SDA ; Check for error code 2
GOTO CLK1
BTFSS FLAG,ERRORS ; Remain as first error encountered
MOVWF ERCODE ; Save error code
BSF FLAG,ERRORS ; Set error flag
GOTO CLK1 ; SDA locked low by device
;
BIT0
BCF I2C_SDA ; Output bit 0
NOP ; Delay
NOP
NOP
CLK1
BSF I2C_SCL
MOVLW 1 ; Error code 1
BTFSC I2C_SCL ; SCL locked low?
GOTO BIT2 ; No.
BTFSS FLAG,ERRORS ; Yes.
MOVWF ERCODE ; Save error code
BSF FLAG,ERRORS ; Set error flag
BIT2
NOP
NOP
BCF I2C_SCL ; Return SCL to low
RETLW 0
;
;END SUB
PAGE
;
;
;-----------------------------------------------------------------------------
; RECEIVE DATA subroutine
;-----------------------------------------------------------------------------
; Input : None
; Output : RXBUF = Receive 8-bit data
;-----------------------------------------------------------------------------
;
RX
MOVLW .8 ; 8 bits of data
MOVWF COUNT
CLRF RXBUF
;
RXLP
RLF RXBUF,F ; Shift data to buffer
SKPC
BCF RXBUF,0 ; carry ---> f(0)
SKPNC
BSF RXBUF,0
CALL BITIN
BTFSC EEPROM,DI
BSF RXBUF,0 ; Input bit =1
DECFSZ COUNT,F ; 8 bits?
GOTO RXLP
BSF EEPROM,DO ; Set acknowledge bit = 1
CALL BITOUT ; to STOP further input
RETLW 0
;
;END SUB
;
;-----------------------------------------------------------------------------
; TRANSMIT DATA subroutine
;-----------------------------------------------------------------------------
; Input : TXBUF
; Output : Data X'mitted to EEPROM device
;-----------------------------------------------------------------------------
;
TX
MOVLW .8
MOVWF COUNT
;
TXLP
BCF EEPROM,DO ; Shift data bit out.
BTFSC TXBUF,7 ; If shifted bit = 0, data bit = 0
BSF EEPROM,DO ; Otherwise data bit = 1
CALL BITOUT ; Serial data out
RLF TXBUF,F ; Rotate TXBUF left
SKPC ; f(6) ---> f(7)
BCF TXBUF,0 ; f(7) ---> carry
SKPNC ; carry ---> f(0)
BSF TXBUF,0
DECFSZ COUNT,F ; 8 bits done?
GOTO TXLP ; No.
CALL BITIN ; Read acknowledge bit
MOVLW 3
BTFSC EEPROM,DI ; Check for acknowledgement
CALL ERR ; No acknowledge from device
RETLW 0
;
;END SUB
PAGE
;
;-----------------------------------------------------------------------------
; BYTE-WRITE, write one byte to EEPROM device
;-----------------------------------------------------------------------------
; Input : DATAO= data to be written
; ADDR = destination address
; SLAVE = device address (1010xxx0)
; Output : Data written to EEPROM device
;-----------------------------------------------------------------------------
;
; ORG 080 ; The location for BYTE-WRITE routine can be
; ; assigned anywhere between (377-777) octal.
WRBYTE
MOVF SLAVE,W ; Get SLAVE address
MOVWF TXBUF ; to TX buffer
CALL BSTART ; Generate START bit
CALL TX ; Output SLAVE address
MOVF ADDR,W ; Get WORD address
MOVWF TXBUF ; into buffer
CALL TX ; Output WORD address
MOVF DATAO,W ; Move DATA
MOVWF TXBUF ; into buffer
CALL TX ; Output DATA and detect acknowledgement
CALL BSTOP ; Generate STOP bit
RETURN
;
;
;
;-----------------------------------------------------------------------------
; BYTE-READ, read one byte from serial EEPROM device
;-----------------------------------------------------------------------------
; Input : ADDR = source address
; SLAVE = device address (1010xxx0)
; Output : DATAI = data read from serial EEPROM
;-----------------------------------------------------------------------------
;
; ORG 0C0 ; The location for BYTE-READ routine can be
; ; assigned anywhere between (377-777) octal.
RDBYTE
MOVF SLAVE,W ; Move SLAVE address
MOVWF TXBUF ; into buffer (R/W = 0)
CALL BSTART ; Generate START bit
CALL TX ; Output SLAVE address. Check ACK.
MOVF ADDR,W ; Get WORD address
MOVWF TXBUF
CALL TX ; Output WORD address. Check ACK.
CALL BSTART ; START READ (if only one device is
MOVF SLAVE,W ; connected to the I2C bus)
MOVWF TXBUF
BSF TXBUF,0 ; Specify READ mode (R/W = 1)
CALL TX ; Output SLAVE address
CALL RX ; READ in data and acknowledge
CALL BSTOP ; Generate STOP bit
MOVF RXBUF,W ; Save data from buffer
MOVWF DATAI ; to DATAI file.
RETURN
;----------------------------------I2C END------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -