📄 i2c.asm
字号:
RAM_PROLOGUE RAM_USE_CLASS_1
;first clear any pending interrupts
push A
mov A, reg[INT_CLR3]
and A, ~I2C_INT_MASK
mov reg[INT_CLR3], A
M8C_EnableIntMask I2C_INT_REG, I2C_INT_MASK
pop A
RAM_EPILOGUE RAM_USE_CLASS_1
ret
.ENDSECTION
.SECTION
;-----------------------------------------------------------------------------
; FUNCTION NAME: I2C_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:
;
I2C_EnableSlave:
_I2C_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[I2C_CFG_REG],(I2C_CFG_Slave_EN | I2C_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: I2C_DisableInt
; FUNCTION NAME: I2C_Stop
;
; DESCRIPTION:
; Disables I2C 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:
;
I2C_Stop:
_I2C_Stop:
RAM_PROLOGUE RAM_USE_CLASS_1
M8C_DisableIntMask I2C_INT_REG, I2C_INT_MASK
and reg[I2C_CFG_REG],~I2C_CFG_Slave_EN
RAM_EPILOGUE RAM_USE_CLASS_1
ret
.ENDSECTION
.SECTION
;-----------------------------------------------------------------------------
; FUNCTION NAME: I2C_DisableInt
; FUNCTION NAME: I2C_Stop
;
; DESCRIPTION:
; Disables I2C 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:
;
I2C_DisableInt:
_I2C_DisableInt:
RAM_PROLOGUE RAM_USE_CLASS_1
M8C_DisableIntMask I2C_INT_REG, I2C_INT_MASK
RAM_EPILOGUE RAM_USE_CLASS_1
ret
.ENDSECTION
.SECTION
;-----------------------------------------------------------------------------
; FUNCTION NAME: I2C_DisableSlave
;
; DESCRIPTION:
; Disables I2C 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:
;
I2C_DisableSlave:
_I2C_DisableSlave:
RAM_PROLOGUE RAM_USE_CLASS_1
and reg[I2C_CFG_REG],~I2C_CFG_Slave_EN
RAM_EPILOGUE RAM_USE_CLASS_1
ret
.ENDSECTION
.SECTION
;-----------------------------------------------------------------------------
; FUNCTION NAME:
; void I2C_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.
I2C_SetRamBuffer:
_I2C_SetRamBuffer:
RAM_PROLOGUE RAM_USE_CLASS_4
RAM_PROLOGUE RAM_USE_CLASS_2
RAM_SETPAGE_CUR >I2C_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 [I2C_bRAM_Buf_Size],A ; Store the buffer size
mov A,[X+RW_SIZE] ; Store R/W boundary
mov [I2C_bRAM_Buf_WSize],A ;
mov A,[X+RAMPTR_LSB] ; Store only LSB of data pointer
mov [I2C_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 [I2C_pRAM_Buf_Addr_MSB],A ;
ENDIF
RAM_EPILOGUE RAM_USE_CLASS_2
RAM_EPILOGUE RAM_USE_CLASS_4
ret
.ENDSECTION
IF (I2C_ROM_ENABLE) ;; Enable only if alternate ROM Address is Enabled
.SECTION
;-----------------------------------------------------------------------------
; FUNCTION NAME:
; void I2C_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.
I2C_SetRomBuffer:
_I2C_SetRomBuffer:
RAM_PROLOGUE RAM_USE_CLASS_4
RAM_PROLOGUE RAM_USE_CLASS_2
RAM_SETPAGE_CUR >I2C_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 [I2C_bROM_Buf_Size],A ; Store the buffer size
mov A,[X+ROMPTR_LSB] ; Store LSB of data pointer
mov [I2C_pROM_Buf_Addr_LSB],A ;
mov A,[X+ROMPTR_MSB] ; Store MSB of data pointer
mov [I2C_pROM_Buf_Addr_MSB],A ;
RAM_EPILOGUE RAM_USE_CLASS_2
RAM_EPILOGUE RAM_USE_CLASS_4
ret
.ENDSECTION
ENDIF
; End of File I2C.asm
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -