?? 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 + -