📄 ezi2cs.asm
字号:
push A
mov A, reg[INT_CLR3]
and A, ~EzI2Cs_INT_MASK
mov reg[INT_CLR3], A
M8C_EnableIntMask EzI2Cs_INT_REG, EzI2Cs_INT_MASK
pop A
RAM_EPILOGUE RAM_USE_CLASS_1
ret
.ENDSECTION
.SECTION
;-----------------------------------------------------------------------------
; FUNCTION NAME: EzI2Cs_EnableSlave
;
; DESCRIPTION:
; Enables SDA interrupt allowing start condition detection. Remember to call the
; global interrupt enable function by using the macro: M8C_EnableGInt.
;
;-----------------------------------------------------------------------------
;
; ARGUMENTS: none
;
; RETURNS: none
;
; SIDE EFFECTS: REGISTERS ARE VOLATILE: THE A AND X REGISTERS MAY BE MODIFIED!
;
; THEORY of OPERATION or PROCEDURE:
;
EzI2Cs_EnableSlave:
_EzI2Cs_EnableSlave:
RAM_PROLOGUE RAM_USE_CLASS_1
; Save original CPU clock speed
M8C_SetBank1 ; Set Bank 1
mov A,reg[OSC_CR0] ; Get current configuration of OSC_CR0 (Bank 1)
push A ; Save OSC_CR0 configuration
and A,0xF8 ; Mask off CPU speed
or A,0x05 ; Set clock to 750KHz
mov reg[OSC_CR0],A ; Write new value to OSC_CR0 (Bank 1)
M8C_SetBank0 ; Back to Bank 0
; Enable I2C Slave
or reg[EzI2Cs_CFG_REG],(EzI2Cs_CFG_Slave_EN | EzI2Cs_CFG_BUS_ERROR_IE)
; Restore original CPU clock speed
pop A
M8C_SetBank1 ; Set Bank 1
mov reg[OSC_CR0],A ; Restore
M8C_SetBank0 ; Back to Bank 0
RAM_EPILOGUE RAM_USE_CLASS_1
ret
.ENDSECTION
.SECTION
;-----------------------------------------------------------------------------
; FUNCTION NAME: EzI2Cs_DisableInt
; FUNCTION NAME: EzI2Cs_Stop
;
; DESCRIPTION:
; Disables EzI2Cs slave by disabling SDA interrupt
;
;-----------------------------------------------------------------------------
;
; ARGUMENTS: none
;
; RETURNS: none
;
; SIDE EFFECTS: REGISTERS ARE VOLATILE: THE A AND X REGISTERS MAY BE MODIFIED!
;
; THEORY of OPERATION or PROCEDURE:
;
EzI2Cs_Stop:
_EzI2Cs_Stop:
RAM_PROLOGUE RAM_USE_CLASS_1
M8C_DisableIntMask EzI2Cs_INT_REG, EzI2Cs_INT_MASK
and reg[EzI2Cs_CFG_REG],~EzI2Cs_CFG_Slave_EN
RAM_EPILOGUE RAM_USE_CLASS_1
ret
.ENDSECTION
.SECTION
;-----------------------------------------------------------------------------
; FUNCTION NAME: EzI2Cs_DisableInt
; FUNCTION NAME: EzI2Cs_Stop
;
; DESCRIPTION:
; Disables EzI2Cs slave by disabling SDA interrupt
;
;-----------------------------------------------------------------------------
;
; ARGUMENTS: none
;
; RETURNS: none
;
; SIDE EFFECTS: REGISTERS ARE VOLATILE: THE A AND X REGISTERS MAY BE MODIFIED!
;
; THEORY of OPERATION or PROCEDURE:
;
EzI2Cs_DisableInt:
_EzI2Cs_DisableInt:
RAM_PROLOGUE RAM_USE_CLASS_1
M8C_DisableIntMask EzI2Cs_INT_REG, EzI2Cs_INT_MASK
RAM_EPILOGUE RAM_USE_CLASS_1
ret
.ENDSECTION
.SECTION
;-----------------------------------------------------------------------------
; FUNCTION NAME: EzI2Cs_DisableSlave
;
; DESCRIPTION:
; Disables EzI2Cs slave by disabling SDA interrupt
;
;-----------------------------------------------------------------------------
;
; ARGUMENTS: none
;
; RETURNS: none
;
; SIDE EFFECTS: REGISTERS ARE VOLATILE: THE A AND X REGISTERS MAY BE MODIFIED!
;
; THEORY of OPERATION or PROCEDURE:
;
EzI2Cs_DisableSlave:
_EzI2Cs_DisableSlave:
RAM_PROLOGUE RAM_USE_CLASS_1
and reg[EzI2Cs_CFG_REG],~EzI2Cs_CFG_Slave_EN
RAM_EPILOGUE RAM_USE_CLASS_1
ret
.ENDSECTION
.SECTION
;-----------------------------------------------------------------------------
; FUNCTION NAME:
; void EzI2Cs_SetRamBuffer(BYTE bSize, BYTE bRWboundry, BYTE * pAddr)
;
; DESCRIPTION:
; Sets the location and size of the I2C RAM buffer.
;
;-----------------------------------------------------------------------------
;
; ARGUMENTS:
; [SP-3] => Size of data structure
; [SP-4] => R/W boundary of (Must be less than or equal to size.)
; [SP-5] => LSB of data pointer
; [SP-6] => MSB of data pointer (Only used for large memory model)
;
; RETURNS: none
;
; SIDE EFFECTS;
; REGISTERS ARE VOLATILE: THE A AND X REGISTERS MAY BE MODIFIED!
; IN THE LARGE MEMORY MODEL CURRENTLY ONLY THE PAGE POINTER
; REGISTERS LISTED BELOW ARE MODIFIED. THIS DOES NOT GUARANTEE
; THAT IN FUTURE IMPLEMENTATIONS OF THIS FUNCTION OTHER PAGE POINTER
; REGISTERS WILL NOT BE MODIFIED.
;
; Page Pointer Registers Modified:
; CUR_PP
;
; THEORY of OPERATION or PROCEDURE:
;
; Stack offset constants
RAMBUF_SIZE: equ -3 ; Stack position for data structure size.
RW_SIZE: equ -4 ; Stack position for R/W area size.
RAMPTR_LSB: equ -5 ; Stack position for RAM pointer LSB.
RAMPTR_MSB: equ -6 ; Stack position for RAM pointer MSB.
EzI2Cs_SetRamBuffer:
_EzI2Cs_SetRamBuffer:
RAM_PROLOGUE RAM_USE_CLASS_4
RAM_PROLOGUE RAM_USE_CLASS_2
RAM_SETPAGE_CUR >EzI2Cs_bRAM_Buf_Size ; Set page to global var page.
; All these globals should be
; on the same page.
mov X,SP
mov A,[X+RAMBUF_SIZE]
mov [EzI2Cs_bRAM_Buf_Size],A ; Store the buffer size
mov A,[X+RW_SIZE] ; Store R/W boundary
mov [EzI2Cs_bRAM_Buf_WSize],A ;
mov A,[X+RAMPTR_LSB] ; Store only LSB of data pointer
mov [EzI2Cs_pRAM_Buf_Addr_LSB],A ;
IF (SYSTEM_LARGE_MEMORY_MODEL) ; Only worry about the address MSB
; if in the large memory Model
mov A,[X+RAMPTR_MSB] ; Store only MSB of data pointer
mov [EzI2Cs_pRAM_Buf_Addr_MSB],A ;
ENDIF
RAM_EPILOGUE RAM_USE_CLASS_2
RAM_EPILOGUE RAM_USE_CLASS_4
ret
.ENDSECTION
IF (EzI2Cs_ROM_ENABLE) ;; Enable only if alternate ROM Address is Enabled
.SECTION
;-----------------------------------------------------------------------------
; FUNCTION NAME:
; void EzI2Cs_SetRomBuffer(BYTE bSize, BYTE * pAddr)
;
; DESCRIPTION:
; Sets the location and size of the I2C ROM buffer.
;
;-----------------------------------------------------------------------------
;
; ARGUMENTS:
; [SP-3] => Size of data const data structure
; [SP-4] => LSB of data pointer
; [SP-5] => MSB of data pointer (Only used for large memory model)
;
; RETURNS: none
;
; SIDE EFFECTS;
; REGISTERS ARE VOLATILE: THE A AND X REGISTERS MAY BE MODIFIED!
; IN THE LARGE MEMORY MODEL CURRENTLY ONLY THE PAGE POINTER
; REGISTERS LISTED BELOW ARE MODIFIED. THIS DOES NOT GUARANTEE
; THAT IN FUTURE IMPLEMENTATIONS OF THIS FUNCTION OTHER PAGE POINTER
; REGISTERS WILL NOT BE MODIFIED.
;
; Page Pointer Registers Modified:
; CUR_PP
;
; THEORY of OPERATION or PROCEDURE:
;
; Stack offset constants
ROMBUF_SIZE: equ -3 ; Stack position for data structure size.
ROMPTR_LSB: equ -4 ; Stack position for ROM pointer LSB.
ROMPTR_MSB: equ -5 ; Stack position for ROM pointer MSB.
EzI2Cs_SetRomBuffer:
_EzI2Cs_SetRomBuffer:
RAM_PROLOGUE RAM_USE_CLASS_4
RAM_PROLOGUE RAM_USE_CLASS_2
RAM_SETPAGE_CUR >EzI2Cs_bROM_Buf_Size ; Set page to global var page.
; All these globals should be
; on the same page.
mov X,SP
mov A,[X+ROMBUF_SIZE]
mov [EzI2Cs_bROM_Buf_Size],A ; Store the buffer size
mov A,[X+ROMPTR_LSB] ; Store LSB of data pointer
mov [EzI2Cs_pROM_Buf_Addr_LSB],A ;
mov A,[X+ROMPTR_MSB] ; Store MSB of data pointer
mov [EzI2Cs_pROM_Buf_Addr_MSB],A ;
RAM_EPILOGUE RAM_USE_CLASS_2
RAM_EPILOGUE RAM_USE_CLASS_4
ret
.ENDSECTION
ENDIF
; End of File EzI2Cs.asm
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -