📄 i2cproc-bak.asm
字号:
include "I2cproc.inc"
;===============================================
; Function:I2cDelay():;;多个延时函数共用.
;===============================================
I2cDelay:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
ret
;===============================================
; Function:I2cStart()
;===============================================
I2cStart:
bs SdaPort,@SDA
bs SclPort,@SCL
call I2cDelay
bc SdaPort,@SDA
call I2cDelay
bc SclPort,@SCL
call I2cDelay
ret
;===============================================
; Function:I2cStop()
;===============================================
I2cStop:
bc SdaPort,@SDA
call I2cDelay
bs SclPort,@SCL
call I2cDelay
bs SdaPort,@SDA
call I2cDelay
bc SclPort,@SCL
call I2cDelay
ret
;===============================================
; Function:I2cStop()
;===============================================
/*I2cStop:
bc SclPort,@SCL
call I2cDelay
call I2cDelay
bc SdaPort,@SDA
call I2cDelay
call I2cDelay
bs SclPort,@SCL
call I2cDelay
call I2cDelay
bs SdaPort,@SDA
call I2cDelay
call I2cDelay
ret
*/
;===============================================
; Function:I2cGetAck()(GetAck(Read0),DoAck(Send1))
;===============================================
I2cGetAck:
;Set @SDA to input Modual
ior SdaPort
mov IO_buff,A
bs IO_buff,@SDA
mov A,IO_buff
iow SdaPort
CLR A_buff
call I2cDelay
;@SCL = 1
bs SclPort,@SCL
call I2cDelay
;if(@SDA == 0) A_buff=(1<<ACK);
jbs SdaPort,@SDA
bs A_buff,ACK
;@SCL = 0
bc SclPort,@SCL
call I2cDelay
;Set @SDA output
ior SdaPort
mov IO_buff,A
bc IO_buff,@SDA
mov A,IO_buff
iow SdaPort
mov A,A_buff
ret
;===============================================
; Function:I2cDoAck()
;===============================================
I2cDoAck:
;@SDA = 0;
bc SdaPort,@SDA
call I2cDelay
;@SCL = 1;
bs SclPort,@SCL
call I2cDelay
bc SclPort,@SCL
call I2cDelay
bs SclPort,@SDA
call I2cDelay
ret
;===============================================
; Function:I2cDoAck()
;===============================================
I2cUnDoAck:
;@SDA = 0;
bs SdaPort,@SDA
call I2cDelay
bs SclPort,@SCL
call I2cDelay
bc SclPort,@SCL
call I2cDelay
;@SCL = 0;
bc SclPort,@SDA
call I2cDelay
ret
;===============================================
; Function:I2cSendByte(A=Data)
;===============================================
I2cSendByte:
mov A_buff,A
mov A,@8
mov Count,A
I2cLoopSend:
;if(A_buff & 0x80) Send1 else Send0;
jbs A_buff,7
jmp I2cSend0
I2cSend1:
bs SdaPort,@SDA
jmp I2cSendBegin
I2cSend0:
bc SdaPort,@SDA
I2cSendBegin:
call I2cDelay
;@SCL = 1;
bs SclPort,@SCL
call I2cDelay
call I2cDelay
;@SCL = 0;
bc SclPort,@SCL
call I2cDelay
I2cSendNext:
;A_buff <<= 1;
rlc A_buff
djz Count
jmp I2cLoopSend
ret
;===============================================
; Function:I2cSendVByte(A=Data)
;===============================================
I2cSendVByte:
mov A_buff,A
mov A,@8
mov Count,A
I2cLoopSendV:
;if(A_buff & 0x01) Send1 else Send 0;
jbs A_buff,0
jmp I2cSendV0
I2cSendV1:
;@SDA = 1;
bs SdaPort,@SDA
jmp I2cSendVBegin
I2cSendV0:
;@SDA = 0
bc SdaPort,@SDA
I2cSendVBegin:
call I2cDelay
;@SCL = 1
bs SclPort,@SCL
call I2cDelay
call I2cDelay
;@SCL = 0;
bc SclPort,@SCL
call I2cDelay
;A_buff >>= 1;
rrc A_buff
djz Count
jmp I2cLoopSendV
ret
;===============================================
; Function:I2cReadByte()= A
;===============================================
I2cReadByte:
;Set Input @SDA
ior SdaPort
mov IO_buff,A
bs IO_buff,@SDA
mov A,IO_buff
iow SdaPort
CLR A_buff
mov A,@8
mov Count,A
I2cLoopRead:
;@SDA = 1;
bs SdaPort,@SDA
call I2cDelay
;@SCL = 1
bs SclPort,@SCL
call I2cDelay
call I2cDelay
;A_buff <<= 1;
bs FLAG,C
rlc A_buff
;if(@SDA)
jbs SdaPort,@SDA
bc A_buff,0
call I2cDelay
;@SCL = 0;
bc SclPort,@SCL
call I2cDelay
djz Count
jmp I2cLoopRead
;Set @SDA output
ior SdaPort
mov IO_buff,A
bc IO_buff,@SDA
mov A,IO_buff
iow SdaPort
mov A,A_buff
ret
;**********************************************
;* 下面是标准协议,可以用于标准I2C传输
;**********************************************
;==============================================
; Function:I2cRead(I2cDevId,I2cAddr)
;===============================================
I2cRead:
call I2cStart
; Device Id:I2cAddr
mov A,@0x21;I2cDevId
call I2cSendByte
call I2cGetAck
jbs A_buff,ACK
jmp I2cReadDone
; SubDevice:I2cAddr
call I2cReadByte
mov channel_cnt,a
call I2cDoAck
; Read Data:Data
call I2cReadByte
mov channel_cnt,A
call I2cUnDoAck
; Set Ok flag!
mov A,@1
NOP
I2cReadDone:
;call I2cStop
call I2cStop
mov A,A_buff
ret
;===============================================
; Function:I2cWrite(I2cDevId,I2cAddr,I2cData)
;===============================================
;I2cWrite:
; call I2cStart
; Device Id : (A = I2cDevId)
; mov A,I2cDevId
; call I2cSendByte
; call I2cGetAck
; jbs A_buff,ACK
; jmp I2cWriteDone
;
; Sub Address : (A = I2cAddr)
; mov A,I2cAddr
; call I2cSendByte
; call I2cGetAck
; jbs A_buff,ACK
; jmp I2cWriteDone
; Write Data : (A = I2cData)
; mov A,I2cData
; call I2cSendByte
; call I2cGetAck
; jbs A_buff,ACK
; jmp I2cWriteDone
; return true!
; mov A,@1
; NOP
;
;I2cWriteDone:
; call I2cStop
; mov A,A_buff
;
; ret
;===============================================
; END OF I2C
;===============================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -