|
//****************************TWI 相关****************************************
/*****************TWI中断中要用的常量********************/
.equ STATE_START = 0
.equ STATE_SLAW = 1
.equ STATE_COMMAND = 2
.equ STATE_ADDRH = 3
.equ STATE_ADDRL = 4
.equ STATE_DATA = 5
.equ STATE_STOP = 6
/********************************************************/
/* TWSR values (not bits) */
.equ TW_READ = 1
.equ TW_WRITE = 0
.equ TWI_ADDRESS = 0x02
/* Master */
.equ TW_START = 0x08
/* Master Transmitter */
.equ TW_MT_SLA_ACK = 0x18
.equ TW_MT_DATA_ACK = 0x28
//******************************************************************************
;I2C初始化
;ldi r16,$0
;OUT TWSR,R16
LDI R16,$0e
OUT TWBR,R16 ;400K
LDI R16,$0
OUT TWAR,R16 ;SLAVE ADDRESS,BROADCAST ADDRESS EN
LDI R16,$85
OUT TWCR,R16 ; INT EN ;TWI EN
//******************************************************************************
TWI_TRANS_INT:
;用寄存器R16,R17作为局部变量
;中断入口保护
PUSH R16
PUSH R17
IN temvar2 ,TWSR
ANDI temvar2 ,0xf8 ;----------找出状态
START_DEAL:
CPI TWI_STATE,STATE_START
BRNE SLAW_DEAL
CPI temvar2 ,TW_START
BRNE START_ERROR
LDI R16,TWI_ADDRESS|TW_WRITE ;从机地址设为02
OUT TWDR,R16
LDI R16,0x85 ;clear twsta
OUT TWCR,R16
LDI TWI_STATE,STATE_SLAW
RJMP TWI_TRANS_END
START_ERROR:
RJMP TWI_TRANS_ERROR
;---------------------------------------------------------------------
SLAW_DEAL:
CPI TWI_STATE,STATE_SLAW
BRNE ADDH_DEAL
CPI temvar2,TW_MT_SLA_ACK
BRNE SLAW_ERROR
OUT TWDR,COMMAND
CPI COMMAND,$1
BREQ OPEN_BACKLIGHTS
CPI COMMAND,$2
BREQ CLOSE_BACKLIGHTS
CPI COMMAND,$3
BREQ ADDRESS_TRANS
CPI COMMAND,$4
BREQ DATA_TRANS
SLAW_ERROR:
RJMP TWI_TRANS_ERROR
;--------------------------------------------------
OPEN_BACKLIGHTS:
CLOSE_BACKLIGHTS:
LDI TWI_STATE,STATE_STOP
LDI R16,0x85
OUT TWCR,R16
RJMP TWI_TRANS_END
ADDRESS_TRANS:
LDI TWI_STATE,STATE_ADDRH
LDI R16,0x85
OUT TWCR,R16
RJMP TWI_TRANS_END
DATA_TRANS:
LDI TWI_STATE,STATE_DATA
LDI R16,0x85
OUT TWCR,R16
RJMP TWI_TRANS_END
;-------------------------------------------------------------------
ADDH_DEAL:
CPI TWI_STATE,STATE_ADDRH
BRNE ADDL_DEAL
RCALL RED_LED_SHINE
CPI temvar2,TW_MT_DATA_ACK
BRNE TWI_TRANS_ERROR
OUT TWDR,ADDRH
LDI R16,0x85 ;clear twsta
OUT TWCR,R16
LDI TWI_STATE,STATE_ADDRL
RJMP TWI_TRANS_END
ADDL_DEAL:
CPI TWI_STATE,STATE_ADDRL
BRNE DATA_DEAL
RCALL GREEN_LED_SHINE ; green led ------------------------
CPI temvar2,TW_MT_DATA_ACK
BRNE TWI_TRANS_ERROR
OUT TWDR,ADDRL
LDI R16,0x85 ;clear twsta
OUT TWCR,R16
LDI TWI_STATE,STATE_STOP
RJMP TWI_TRANS_END
;--------------------------------------------------------------------------
DATA_DEAL:
CPI TWI_STATE,STATE_DATA
BRNE STOP_DEAL
CPI temvar2,TW_MT_DATA_ACK
BRNE TWI_TRANS_ERROR ;R10 = TWI_TRANS_SIZE
LD R16,Z+
;LPM R16,Z+
OUT TWDR,R16
LDI R16,0x85
OUT TWCR,R16
DEC TWI_TRANS_SIZE
BREQ DATA_TRANS_END
LDI TWI_STATE,STATE_DATA
RJMP TWI_TRANS_END
DATA_TRANS_END:
;RCALL GREEN_LED_SHINE ; green led ------------------------
LDI TWI_STATE,STATE_STOP
RJMP TWI_TRANS_END
STOP_DEAL:
CPI TWI_STATE,STATE_STOP
BRNE TWI_TRANS_ERROR
CPI temvar2,TW_MT_DATA_ACK
BRNE TWI_TRANS_ERROR
LDI R16,0x95 ;---发结束位
OUT TWCR,R16
LDI TWI_STATE,0
RJMP TWI_TRANS_END
TWI_TRANS_ERROR:
LDI R16,$95 ;---发结束位
OUT TWCR,R16
LDI TWI_STATE,0
TWI_TRANS_END:
POP R17
POP R16
RETI |
|