📄 i2cproc.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
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
call I2cDelay
bc SclPort,@SCL
call I2cDelay
call I2cDelay
ret
;===============================================
; Function:I2cStop()
;===============================================
I2cStop:
bc SdaPort,@SDA
call I2cDelay
bs SclPort,@SCL
call I2cDelay
bs SdaPort,@SDA
call I2cDelay
call I2cDelay
bc SclPort,@SCL
call I2cDelay
call I2cDelay
ret
;===============================================
; Function:I2cStop()
;===============================================
;===============================================
; 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
call I2cDelay
;@SCL = 1;
bs SclPort,@SCL
call I2cDelay
call I2cDelay
bc SclPort,@SCL
call I2cDelay
call I2cDelay
bs SclPort,@SDA
call I2cDelay
call I2cDelay
ret
;===============================================
; Function:I2cDoAck()
;===============================================
I2cUnDoAck:
;@SDA = 0;
bs SdaPort,@SDA
call I2cDelay
bs SclPort,@SCL
call I2cDelay
call I2cDelay
bc SclPort,@SCL
call I2cDelay
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
; Read Data:0AH
call I2cReadByte
mov channel_cnt,a
call I2cDoAck
; Read Data:00AL
call I2cReadByte
mov channel_cnt,A
call I2cDoAck
; Read Data:0BH
call I2cReadByte
mov RSSI,a
call I2cDoAck
; Read Data:0BL
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 + -