📄 i2chwcommon.lis
字号:
0000
0000 IF I2CHW_POLLED_PROCESS
0000 ret ; NOT and ISR so use only a ret to return from poll
0000 ELSE
0000 reti ; use reti to return from ISR
0000 ENDIF
0000 macro I2CHW_POLL_SERVICE
0000
0000 IF I2CHW_POLLED_PROCESS
0000 lcall I2CHW_Poll ; Call this function repeatedly if we are in a loop
0000 ; waiting for bStatus BUS_BUSY to clear. Otherwise
0000 ; this is a deadlock condtion
0000 ENDIF
export I2CHW_InitWrite
export _I2CHW_InitWrite
export I2CHW_InitRamRead
export _I2CHW_InitRamRead
export I2CHW_InitFlashRead
export _I2CHW_InitFlashRead
export I2CHW_bReadI2CStatus
export _I2CHW_bReadI2CStatus
export I2CHW_ClrRdStatus
export _I2CHW_ClrRdStatus
export I2CHW_ClrWrStatus
export _I2CHW_ClrWrStatus
AREA UserModules (ROM, REL)
0000 .SECTION
0000 ;-----------------------------------------------------------------------------
0000 ; FUNCTION NAME: I2CHW_InitWrite
0000 ;
0000 ; DESCRIPTION:
0000 ; Initializes a data buffer pointer for the slave to use to deposit data, and
0000 ; zeroes the value of a count byte for the same buffer.
0000 ;
0000 ;-----------------------------------------------------------------------------
0000 ;
0000 ; ARGUMENTS: [SP-5] -- count of bytes to write
0000 ; [SP-4] -- Hi order part of address Wrbuf
0000 ; [SP-3] -- Low order part of the address Wrbuf
0000 ;
0000 ; RETURNS: none
0000 ;
0000 ; Write Status bits are cleared
0000 ;
0000 ; SIDE EFFECTS:
0000 ; The A and X registers may be modified by this or future implementations
0000 ; of this function. The same is true for all RAM page pointer registers in
0000 ; the Large Memory Model. When necessary, it is the calling function's
0000 ; responsibility to perserve their values across calls to fastcall16
0000 ; functions.
0000 ;
0000 ; Currently only the page pointer registers listed below are modified:
0000 ; CUR_PP
0000 ;
0000 ; Write Status bits are cleared
0000 ;
0000 ; THEORY of OPERATION or PROCEDURE:
0000 ; The C compiler will always place a 0 (the upper order byte of the address pointer) in
0000 ; the accumulator. X register is the low order pointer.
0000 ; IF a one byte buffer is established, set a flag to NAK the first written data byte.
0000 ;
0000
0000 I2CHW_InitWrite:
0000 _I2CHW_InitWrite:
0000
FFFFFFFB WrCnt: equ -5
FFFFFFFC WrBufHi: equ -4
FFFFFFFD WrBufLo: equ -3
0000
IF ( RAM_USE_CLASS_4 & RAM_USE_CLASS_1 )
; Nothing to do
ENDIF ; RAM_USE_CLASS_1
IF ( RAM_USE_CLASS_4 & RAM_USE_CLASS_2 )
IF ( SYSTEM_IDXPG_TRACKS_IDX_PP )
IF ( SYSTEM_LARGE_MEMORY_MODEL )
or F, FLAG_PGMODE_01b
ENDIF ; SYSTEM_LARGE_MEMORY_MODEL
ENDIF
ENDIF ; RAM_USE_CLASS_2
IF ( RAM_USE_CLASS_4 & RAM_USE_CLASS_3 )
IF ( SYSTEM_IDXPG_TRACKS_STK_PP )
IF ( SYSTEM_LARGE_MEMORY_MODEL )
and F, ~FLAG_PGMODE_01b
ENDIF ; SYSTEM_LARGE_MEMORY_MODEL
ENDIF
ENDIF ; RAM_USE_CLASS_3
IF ( RAM_USE_CLASS_4 & RAM_USE_CLASS_4 )
; Nothing to do
ENDIF ; RAM_USE_CLASS_4
IF ( RAM_USE_CLASS_2 & RAM_USE_CLASS_1 )
; Nothing to do
ENDIF ; RAM_USE_CLASS_1
IF ( RAM_USE_CLASS_2 & RAM_USE_CLASS_2 )
IF ( SYSTEM_IDXPG_TRACKS_IDX_PP )
IF ( SYSTEM_LARGE_MEMORY_MODEL )
or F, FLAG_PGMODE_01b
ENDIF ; SYSTEM_LARGE_MEMORY_MODEL
ENDIF
ENDIF ; RAM_USE_CLASS_2
IF ( RAM_USE_CLASS_2 & RAM_USE_CLASS_3 )
IF ( SYSTEM_IDXPG_TRACKS_STK_PP )
IF ( SYSTEM_LARGE_MEMORY_MODEL )
and F, ~FLAG_PGMODE_01b
ENDIF ; SYSTEM_LARGE_MEMORY_MODEL
ENDIF
ENDIF ; RAM_USE_CLASS_3
IF ( RAM_USE_CLASS_2 & RAM_USE_CLASS_4 )
; Nothing to do
ENDIF ; RAM_USE_CLASS_4
0000 10 push X
0001 4F mov X, SP
0002 79 dec X ;set up the pointer for correct param access
0003 08 push A
0004 5DDE mov A, reg[INT_MSK3]
0006 08 push A ;preserve flags prior to disabling int
0007 41DEFE and reg[INT_MSK3], ~INT_MSK3_I2C ; disable specified interrupt enable bit
000A
IF ( SYSTEM_LARGE_MEMORY_MODEL )
000A 62D000 mov reg[CUR_PP], >I2CHW_bStatus
ENDIF
000D 2600FB and [I2CHW_bStatus], ~fI2C_NAKnextWr ;reset the nak-next-written-byte flag.
IF SYSTEM_LARGE_MEMORY_MODEL
0010 52FC mov A, [X + WrBufHi] ;move wrbuf addr to A
0012 5300 mov [pI2CHW_Write_BufHI], A
ENDIF
0014 52FD mov A, [X + WrBufLo] ;move wrbuf addr to A
0016 5300 mov [pI2CHW_Write_BufLO], A
0018 52FB mov A, [X + WrCnt] ;move Write_count to A
001A 5300 mov [I2CHW_Write_Count], A
001C 3901 cmp A, 01 ;if data buffer is one byte long or less
001E A008 jz I2CHW_SetNak
0020 C006 jc I2CHW_SetNak
0022 26008F and [I2CHW_RsrcStatus], ~0x70 ;clear the 0x10, 0x20 (Write status bits)
0025 8009 jmp I2Cs_1_ResetFlgs
0027
0027 I2CHW_SetNak:
0027 2E0004 or [I2CHW_bStatus], fI2C_NAKnextWr ;set the nak-next-written-byte flag.
002A 26008F and [I2CHW_RsrcStatus], ~0x70 ; clear the 0x10, 0x20 (Write status bits)
002D 8001 jmp I2Cs_1_ResetFlgs
002F
002F I2Cs_1_ResetFlgs:
002F 18 pop A
0030 2101 and A, INT_MSK3_I2C ; Only enable if it was previously enabled
0032 A004 jz . + 5
0034 43DE01 or reg[INT_MSK3], INT_MSK3_I2C ; enable specified interrupt enable bit
0037 18 pop A
0038 20 pop X
IF ( RAM_USE_CLASS_4 & RAM_USE_CLASS_1 )
; Nothing to do
ENDIF ; RAM_USE_CLASS_1
IF ( RAM_USE_CLASS_4 & RAM_USE_CLASS_2 )
IF ( SYSTEM_LARGE_MEMORY_MODEL )
IF ( SYSTEM_IDXPG_TRACKS_STK_PP )
IF ( SYSTEM_LARGE_MEMORY_MODEL )
and F, ~FLAG_PGMODE_MASK ; NOTE: transition thru 00b state
or F, FLAG_PGMODE_MASK & FLAG_PGMODE_11b
ENDIF
ENDIF ; PGMODE LOCKED
IF ( SYSTEM_IDXPG_TRACKS_IDX_PP )
IF ( SYSTEM_LARGE_MEMORY_MODEL )
and F, ~FLAG_PGMODE_MASK ; NOTE: transition thru 00b state
or F, FLAG_PGMODE_MASK & FLAG_PGMODE_10b
ENDIF
ENDIF ; PGMODE FREE
ENDIF ; SYSTEM_LARGE_MEMORY_MODEL
ENDIF ; RAM_USE_CLASS_2
IF ( RAM_USE_CLASS_4 & RAM_USE_CLASS_3 )
IF ( SYSTEM_LARGE_MEMORY_MODEL )
IF ( SYSTEM_IDXPG_TRACKS_STK_PP )
IF ( SYSTEM_LARGE_MEMORY_MODEL )
and F, ~FLAG_PGMODE_MASK ; NOTE: transition thru 00b state
or F, FLAG_PGMODE_MASK & FLAG_PGMODE_11b
ENDIF
ENDIF ; PGMODE LOCKED
IF ( SYSTEM_IDXPG_TRACKS_IDX_PP )
IF ( SYSTEM_LARGE_MEMORY_MODEL )
and F, ~FLAG_PGMODE_MASK ; NOTE: transition thru 00b state
or F, FLAG_PGMODE_MASK & FLAG_PGMODE_10b
ENDIF
ENDIF ; PGMODE FREE
ENDIF ; SYSTEM_LARGE_MEMORY_MODEL
ENDIF ; RAM_USE_CLASS_3
IF ( RAM_USE_CLASS_4 & RAM_USE_CLASS_4 )
; Nothing to do
ENDIF ; RAM_USE_CLASS_4
IF ( RAM_USE_CLASS_2 & RAM_USE_CLASS_1 )
; Nothing to do
ENDIF ; RAM_USE_CLASS_1
IF ( RAM_USE_CLASS_2 & RAM_USE_CLASS_2 )
IF ( SYSTEM_LARGE_MEMORY_MODEL )
IF ( SYSTEM_IDXPG_TRACKS_STK_PP )
IF ( SYSTEM_LARGE_MEMORY_MODEL )
0039 703F and F, ~FLAG_PGMODE_MASK ; NOTE: transition thru 00b state
003B 71C0 or F, FLAG_PGMODE_MASK & FLAG_PGMODE_11b
ENDIF
ENDIF ; PGMODE LOCKED
IF ( SYSTEM_IDXPG_TRACKS_IDX_PP )
IF ( SYSTEM_LARGE_MEMOR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -