TITLE " TWO WIRE/I2C BUS INTERFACE WITH PIC16C5x "
;
LIST P=16C54
;
;*****************************************************************************
;** Two wire/I2C Bus READ/WRITE Sample Routines of Microchip's
;** 24Cxx / 85Cxx serial CMOS EEPROM interfacing to a
;** PIC16C54 8-bit CMOS single chip microcomputer
;** Revsied Version 2.0 (4/2/92).
;**
;** Part use = PIC16C54-XT/JW
;** Note: 1) All timings are based on a reference crystal frequency of 2MHz
;** which is equivalent to an instruction cycle time of 2 usec.
;** 2) Address and literal values are read in octal unless otherwise
;** specified.
;
;
; Program: I2CBUS.ASM
; Revision Date:
; 12-12-95 Compatibility with MPASMWIN 1.30
;
;**********************************************************************
;
;*****************************************************************************
;
;-----------------------------------------------------------------------------
; Files Assignment
;-----------------------------------------------------------------------------
;
PC EQU 2 ; Program counter
STAT EQU 3 ; PIC status byte
FSR EQU 4 ; File Select Register
RA EQU 5 ; Port A use to select device address
RB EQU 6 ; RB7 = SDA, RB6 = SCL
;
STATUS EQU 08 ; Status register
FLAG EQU 09 ; Common flag bits register
EEPROM EQU 0A ; Bit buffer
ERCODE EQU 0B ; Error code (to indicate bus status)
ADDR EQU 10 ; Address register
DATAI EQU 11 ; Stored data input register
DATAO EQU 12 ; Stored data output register
SLAVE EQU 13 ; Device address (1010xxx0)
TXBUF EQU 14 ; TX buffer
RXBUF EQU 15 ; RX buffer
COUNT EQU 16 ; Bit counter
;
TIMER0 EQU 18 ; Delay timer0
TIMER1 EQU 19 ; Delay timer1
;
;
;-----------------------------------------------------------------------------
; Bit Assignments
;-----------------------------------------------------------------------------
;
; Status bits
;
Z EQU 2
C EQU 0
;
; FLAG Bits
;
ERR1 EQU 0 ; Error flag
;
; Instruction Destination Bits
;
F EQU 1
W EQU 0
;
; EEPROM Bits
;
DI EQU 7 ; EEPROM input
DO EQU 6 ; EEPROM output
;
; I2C Device Bits
;
SDA EQU 7 ; RB7, data in/out
SCL EQU 6 ; RB6, serial clock
;
;END FILES/BITS EQUATE
PAGE
;
;-----------------------------------------------------------------------------
; Two wire/I2C - CPU communication error status table and subroutine
;-----------------------------------------------------------------------------
; input : W-reg = error code
; output : ERCODE = error code
; FLAG(ERR1) = 1
;
; code error status mode
; ------- ------------------------------------------------------
; 1 : SCL locked low by device (bus is still busy)
; 2 : SDA locked low by device (bus is still busy)
; 3 : No acknowledge from device (no handshake)
; 4 : SDA bus not released for master to generate STOP bit
;-----------------------------------------------------------------------------
;
;Subroutine to identify the status of the serial clock (SCL) and serial data
;(SDA) condition according to the error status table. Codes generated are
;useful for bus/device diagnosis.
;
ERR
BTFSS FLAG,ERR1 ; Remain as first error encountered
MOVWF ERCODE ; Save error code
BSF FLAG,ERR1 ; Set error flag
RETLW 0
;
;-----------------------------------------------------------------------------
; START bus communication routine
;-----------------------------------------------------------------------------
; input : none
; output : initialize bus communication
;-----------------------------------------------------------------------------
;
;Generate START bit (SCL is high while SDA goes from high to low transition)
;and check status of the serial clock.
BSTART
MOVLW B'00111111' ; Put SCL, SDA line in output state
TRIS RB
;***************************************************************************
bsf RB,SDA ;make sure sda is high
;***************************************************************************
BSF RB,SCL ; Set clock high
MOVLW 1 ; Ready error status code 1
BTFSS RB,SCL ; Locked?
CALL ERR ; SCL locked low by device
BCF RB,SDA ; SDA goes low during SCL high
NOP ; Timing adjustment
NOP
NOP
BCF RB,SCL ; Start clock train
RETLW 0
;
;END SUB
PAGE
;
;-----------------------------------------------------------------------------
; STOP bus communication routine
;-----------------------------------------------------------------------------
; Input : None
; Output : Bus communication, STOP condition
;-----------------------------------------------------------------------------
;
;Generate STOP bit (SDA goes from low to high during SCL high state)
;and check bus conditions.
;
BSTOP
;****************************************************************************
MOVLW B'00111111' ; Put SCL, SDA line in output state
TRIS RB
;****************************************************************************
BCF RB,SDA ; Return SDA to low
BSF RB,SCL ; Set SCL high
nop
nop
nop
MOVLW 1 ; Ready error code 1
BTFSS RB,SCL ; High?
CALL ERR ; No, SCL locked low by device
BSF RB,SDA ; SDA goes from low to high during SCL high
MOVLW 4 ; Ready error code 4
BTFSS RB,SDA ; High?
CALL ERR ; No, SDA bus not release for STOP
RETLW 0
;
;END SUB
;
;-----------------------------------------------------------------------------
; Serial data send from PIC to serial EEPROM, bit-by-bit subroutine
;-----------------------------------------------------------------------------
; Input : None
; Output : To (DI) of serial EEPROM device
;-----------------------------------------------------------------------------
;
SNAKE
MOVLW B'10111111' ; Force SDA line as input
TRIS RB
BSF RB,SDA ; Set SDA for input
BCF EEPROM,DI
BSF RB,SCL ; Clock high
MOVLW 1
BTFSC RB,SCL ; Skip if SCL is high
GOTO BIT1
BTFSS FLAG,ERR1 ; Remain as first error encountered
MOVWF ERCODE ; Save error code
BSF FLAG,ERR1 ; Set error flag
BIT1
BTFSC RB,SDA ; Read SDA pin
BSF EEPROM,DI ; DI =
NOP ; Delay
BCF RB,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 B'00111111' ; Set SDA, SCL as outputs
TRIS RB
BTFSS EEPROM,DO
GOTO BIT0
BSF RB,SDA ; Output bit 0
MOVLW 2
BTFSC RB,SDA ; Check for error code 2
GOTO CLK1
BTFSS FLAG,ERR1 ; Remain as first error encountered
MOVWF ERCODE ; Save error code
BSF FLAG,ERR1 ; Set error flag
GOTO CLK1 ; SDA locked low by device
;
BIT0
BCF RB,SDA ; Output bit 0
NOP ; Delay
NOP
NOP
CLK1
BSF RB,SCL
MOVLW 1 ; Error code 1
BTFSC RB,SCL ; SCL locked low?
GOTO BIT2 ; No.
BTFSS FLAG,ERR1 ; Yes.
MOVWF ERCODE ; Save error code
BSF FLAG,ERR1 ; Set error flag
BIT2
NOP
NOP
BCF RB,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
;
;-----------------------------------------------------------------------------
Previous article:PIC microcontroller loop program application example
Next article:Application of PIC16F877--AD Converter
- Popular Resources
- Popular amplifiers
Professor at Beihang University, dedicated to promoting microcontrollers and embedded systems for over 20 years.
- LED chemical incompatibility test to see which chemicals LEDs can be used with
- Application of ARM9 hardware coprocessor on WinCE embedded motherboard
- What are the key points for selecting rotor flowmeter?
- LM317 high power charger circuit
- A brief analysis of Embest's application and development of embedded medical devices
- Single-phase RC protection circuit
- stm32 PVD programmable voltage monitor
- Introduction and measurement of edge trigger and level trigger of 51 single chip microcomputer
- Improved design of Linux system software shell protection technology
- What to do if the ABB robot protection device stops
- Keysight Technologies Helps Samsung Electronics Successfully Validate FiRa® 2.0 Safe Distance Measurement Test Case
- Innovation is not limited to Meizhi, Welling will appear at the 2024 China Home Appliance Technology Conference
- Innovation is not limited to Meizhi, Welling will appear at the 2024 China Home Appliance Technology Conference
- Huawei's Strategic Department Director Gai Gang: The cumulative installed base of open source Euler operating system exceeds 10 million sets
- Download from the Internet--ARM Getting Started Notes
- Learn ARM development(22)
- Learn ARM development(21)
- Learn ARM development(20)
- Learn ARM development(19)
- Learn ARM development(14)
- PCB size measurement, VX9000 optical scanning imaging measuring machine VS imager measurement
- Xiaomi Mi Band 3 Disassembly
- 17 "Ten Thousand Miles" Raspberry Pi Car——VSCode Learning (Compiling and Debugging)
- MOS tube VBE1606\VBN1603 in the design of driving circuit of medical temperature control blanket control system
- A few questions about 4G signal indicators. In what range are these values considered good signal quality? In addition, some experts have suggested directly...
- Chip company recruitment: power hardware engineer
- [RVB2601 creative application development] + voice prompt type environmental status detection recorder
- How to write the test bench file for the verliog10 divider
- [Xianji HPM6750 Review] + Environment Setup Test
- EEWORLD University ---- Webinar: Thermal Monitoring and Protection