📄 i2cproc.h
字号:
;===============================================
; Function:I2cDelay():多个延时函数共用.
;===============================================
I2cDelay:
SpiDelay:
LcdDelay:
WDTC
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET
;===============================================
; Function:I2cStart():SCL为高时,SDA由高到低
;===============================================
I2cStart:
BS I2cPort,SDA
CALL I2cDelay
BS I2cPort,SCL
CALL I2cDelay
BC I2cPort,SDA
CALL I2cDelay
BC I2cPort,SCL
CALL I2cDelay
RET
;===============================================
; Function:I2cStop():SCL为高时,SDA由低到高
;===============================================
I2cStop:
BC I2cPort,SCL
CALL I2cDelay
BC I2cPort,SDA
CALL I2cDelay
BS I2cPort,SCL
CALL I2cDelay
BS I2cPort,SDA
CALL I2cDelay
RET
;===============================================
; Function:I2cGetAck()(GetAck(Read0),DoAck(Send1))
;===============================================
I2cGetAck:
; SDA输入模式
IOR I2cPort
OR A,@OI2c_SDA
IOW I2cPort
CLR A_buff
; 时钟拉高,开始读数据
BS I2cPort,SCL
CALL I2cDelay
CALL I2cDelay
; SDA 为低就是应答,否则不是
JBS I2cPort,SDA
BS A_buff,ACK
BC I2cPort,SCL
CALL I2cDelay
; 切换为SDA输出模式
IOR I2cPort
AND A,@AI2c_SDA
IOW I2cPort
MOV A,A_buff
RET
;===============================================
; Function:I2cDoAck()(GetAck(Read0),DoAck(Send1))
;===============================================
I2cDoAck:
; 数据置高,准备输入
BC I2cPort,SDA
CALL I2cDelay
; 时钟拉高,数据的低表示ACK信号
BS I2cPort,SCL
CALL I2cDelay
CALL I2cDelay
BC I2cPort,SCL
CALL I2cDelay
RET
;===============================================
; Function:I2cSendByte(A=Data)
;===============================================
I2cSendByte:
MOV A_buff,A
MOV A,@8
MOV N1,A
I2cLoopSend:
JBS A_buff,7
JMP I2cSend0
I2cSend1:
BS I2cPort,SDA
JMP I2cSendBegin
I2cSend0:
BC I2cPort,SDA
I2cSendBegin:
CALL I2cDelay
BS I2cPort,SCL
CALL I2cDelay
CALL I2cDelay
BC I2cPort,SCL
CALL I2cDelay
I2cSendNext:
RLC A_buff
DJZ N1
JMP I2cLoopSend
I2cSendDone:
RET
;===============================================
; Function:I2cReadByte()= A
;===============================================
I2cReadByte:
IOR I2cPort
OR A,@OI2c_SDA
IOW I2cPort
CLR A_buff
MOV A,@8
MOV N1,A
I2cLoopRead:
; 数据置高,准备读数据
BS I2cPort,SDA
CALL I2cDelay
; 时钟置高,开始读
BS I2cPort,SCL
CALL I2cDelay
; 设进位标志,准备移进入低位1
BS STATU,C
RLC A_buff
; 读数据,
JBS I2cPort,SDA
BC A_buff,0
CALL I2cDelay
; 数据读取完毕
BC I2cPort,SCL
CALL I2cDelay
DJZ N1
JMP I2cLoopRead
; 数据置为输出
IOR I2cPort
AND A,@AI2c_SDA
IOW I2cPort
MOV A,A_buff
RET
;**********************************************
;* 下面是标准协议,可以用于标准I2C传输
;**********************************************
;==============================================
; Function:I2cRead(I2cDevId,I2cAddr) Return(I2cData)
;===============================================
I2cRead:
CALL I2cStart
; Device Id:0xa0
MOV A,I2cDevId
CALL I2cSendByte
CALL I2cGetAck
JBS A_buff,ACK
JMP I2cReadDone
; SubDevice:Addr
MOV A,I2cAddr
CALL I2cSendByte
CALL I2cGetAck
JBS A_buff,ACK
JMP I2cReadDone
CALL I2cStart
; Device Id:0xa1
MOV A,I2cDevId
OR A,@0x01
CALL I2cSendByte
CALL I2cGetAck
JBS A_buff,ACK
JMP I2cReadDone
; Read Data:Data
CALL I2cReadByte
MOV I2cData,A
; Set Ok flag!
MOV A,@1
NOP
I2cReadDone:
CALL I2cStop
MOV A,A_buff
RET
;===============================================
; Function:I2cWrite(I2cDevId,I2cAddr,I2cData)
;===============================================
I2cWrite:
CALL I2cStart
; Device Id : I2cDevId
MOV A,I2cDevId
CALL I2cSendByte
CALL I2cGetAck
JBS A_buff,ACK
JMP I2cWriteDone
; Sub Address : I2cAddr
MOV A,I2cAddr
CALL I2cSendByte
CALL I2cGetAck
JBS A_buff,ACK
JMP I2cWriteDone
; Write Data : I2cData
MOV A,I2cData
CALL I2cSendByte
CALL I2cGetAck
JBS A_buff,ACK
JMP I2cWriteDone
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 + -