English
Language : 

AN113 Datasheet, PDF (17/52 Pages) Silicon Laboratories – SERIAL COMMUNICATION WITH THE SMBUS
AN113
mov TEST_ADDR, #00h
mov TEST_COUNT, #0feh
; Load initial test values
;
; TEST CODE--------------------------------------------------------------------------
TEST:
; Send TEST_BYTE to memory location TEST_ADDR
mov SLA_ADD, #CHIP_A
; Load slave address
mov TRANSMIT_BYTE, TEST_BYTE ; Load transmit data into TRANSMIT_BYTE
mov MEM_ADD, TEST_ADDR
; Load memory address into MEM_ADD
acall SEND
; Call send routine
; Read memory location TEST_ADDR into RECEIVE_BYTE
mov SLA_ADD, #CHIP_A
; Load slave address
mov MEM_ADD, TEST_ADDR
; Load memory address into MEM_ADD
acall RECEIVE
; Call receive routine
; Compare byte received to byte sent
mov A, RECEIVE_BYTE
; Load received byte into accumulator
cjne A, TEST_BYTE, END_TEST
; Compare sent byte to received byte
; Jump to END_TEST if not equal
; Change test variables
dec TEST_BYTE
inc TEST_ADDR
; If sent=received, change test variables
; and cycle through again.
; Cycle through again if TEST_COUNTER not zero
djnz TEST_COUNT, TEST
; Decrement counter, loop back to beginning
mov A, #99h
; Load accumulator with 99h if test successful.
END_TEST:
jmp $
; Spin
;---------------------------------------------------------------------------------------
; SUBROUTINES
;---------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------
; SEND subroutine. Assumes that the slave address, memory location, and transmit
; data have all been loaded into their associated variables. This routine manages
; the SM_BUSY bit, sets RW=WRITE, loads the WRI_ADD, and initiates the transfer.
;
SEND:
push
jb
clr
ACC
SM_BUSY, $
RW
; Preserve accumulator
; Wait for SMBus to be free
; RW = 0 (WRITE)
mov A, SLA_ADD
orl A, #WRITE
mov WRI_ADD, A
setb
setb
pop
SM_BUSY
STA
ACC
; Store SLA_ADD + WRITE
; in WRI_ADD
;
; Occupy SMBus
; Initiate Transfer
; Restore accumulator
Rev. 1.3
17