📄 mpc_iic.asm
字号:
;--------------------------------------;
; Set functions of DAC3550A with IIC
inc_volume: ; Increase Volume setting (ZR=could not increse)
lds r16,Volume
inc r16
cpi r16,VOLMAX+1
brcs PC+3
sez
ret
sts Volume,r16
rcall set_volume
clz
ret
dec_volume: ; Decrease Volume setting (ZR=could not decrese)
lds r16,Volume
dec r16
cpi r16,VOLMIN
brcc PC+3
sez
ret
sts Volume,r16
rcall set_volume
clz
ret
set_volume: ; Volume = send data into AVOL
rcall iic_start ; START
ldi r16,0x9a ; Device address
rcall iic_send ; /
ldi r16,0xc2 ; Register = AVOL
rcall iic_send ; /
lds r16,Volume ; Volume R
rcall iic_send ; /
lds r16,Volume ; Volume L
rcall iic_send ; /
rjmp iic_stop ; STOP
dac_on: ; Unmute
rcall iic_start ; START
ldi r16,0x9a ; Device address
rcall iic_send ; /
ldi r16,0xc3 ; Register = GCFG
rcall iic_send ; /
ldi r16,0b00001110 ; GCFG = DAC on, AUX1 on-mono
rcall iic_send ; /
rjmp iic_stop ; STOP
dac_off: ; Mute
sts FtmMr,_0 ; Clear muting delayed release
rcall iic_start ; START
ldi r16,0x9a ; Device address
rcall iic_send ; /
ldi r16,0xc3 ; Register = GCFG
rcall iic_send ; /
ldi r16,0b00001010 ; GCFG = DAC off, AUX1 on-mono
rcall iic_send ; /
rjmp iic_stop ; STOP
dac_iiscfg: ; Set LR_SEL bit because DSP outputs inverted LRCK in default.
rcall iic_start ; START
ldi r16,0x9a ; Device address
rcall iic_send ; /
ldi r16,0xc1 ; Register = SR_REG
rcall iic_send ; /
ldi r16,0b00010110 ; WSI:L=R-ch, No delay
rcall iic_send ; /
rjmp iic_stop ; STOP
;--------------------------------------;
; Set functions of MAS3570D with IIC
set_dcdc: ; Set DC-DC output voltage
sbi PORTD,WSEN ; Enable DSP
ldi r16,100 ; Delay 600us
rcall iic_delay ;
dec r16 ;
brne PC-2 ; /
rcall iic_start ; START
ldi r16,0x3a ; Device address
rcall iic_send ; /
ldi r16,0x68 ; CMD:Write
rcall iic_send ; /
ldi r16,0x98
rcall iic_send
ldi r16,0xe0
rcall iic_send
ldi r16,0x04 ; Voltage: 04=2.9, 08=3.0, 0c=3.1,
rcall iic_send ; 10=3.2, 14=3.3, 18=3.4
ldi r16,0x00 ;
rcall iic_send ; /
rcall iic_stop ; STOP
ldi r16,100 ; Delay 600us
rcall iic_delay ;
dec r16 ;
brne PC-2 ; /
cbi PORTD,WSEN ; Disable DSP
ret
;--------------------------------------;
; IIC - Generate START condition
;
; Call: None
; Rte: None
iic_start:
cbi DDRD,IICD ; SDA="P"
rcall iic_delay ; Delay
sbi PORTD,IICC ; SCK="H"
rcall iic_delay ; Delay
sbi DDRD,IICD ; SDA="L"
rcall iic_delay ; Delay
cbi PORTD,IICC ; SCK="L"
rjmp iic_delay ; Delay
;--------------------------------------;
; IIC - Generate STOP condition
;
; Call: None
; Rte: None
iic_stop:
cbi PORTD,IICC ; SCK="L"
sbi DDRD,IICD ; SDA="L"
rcall iic_delay ; Delay
sbi PORTD,IICC ; SCK="H"
rcall iic_delay ; Delay
cbi DDRD,IICD ; SDA="P"
rjmp iic_delay ; Delay
;--------------------------------------;
; IIC - Send byte data to slave device
;
; Call: r16 = data to send
; Ret: C = 0:ACK, 1:NAK
iic_send:
sec
rol r16 ; SDA = Bit for send
breq iic_rack ; Break when end of data
cbi PORTD,IICC ; SCK="L"
brcc PC+3 ; Set data to SDA
cbi DDRD,IICD ;
rjmp PC+2 ;
sbi DDRD,IICD ; /
rcall iic_delay ; Delay
sbi PORTD,IICC ; SCK="H"
rcall iic_delay ; Delay
clc
rjmp PC-11
iic_rack: ; Receive ACK/NAK bit into C.
cbi PORTD,IICC ; SCK="L"
cbi DDRD,IICD ; SDA="P"
rcall iic_delay ; Delay
sbi PORTD,IICC ; SCK="H"
rcall iic_delay ; Delay
clc ; Read SDA into C
sbic PIND,IICD ;
sec ; /
ret
;--------------------------------------;
; IIC - Read byte data from slave
;
; Call: None
; Ret: r16 = read data, C = ACK/NAK
iic_rcvr:
cbi DDRD,IICD ; SDA="P"
ldi r16,1
cbi PORTD,IICC ; SCK="L"
rcall iic_delay ; Delay
sbi PORTD,IICC ; SCK="H"
rcall iic_delay ; Delay
lsl r16
sbic PIND,IICD ; Read SDA into r16.0
ori r16,1 ; /
brcc PC-7
rjmp iic_rack
;--------------------------------------;
; IIC timing
;
iic_delay: ; delay for 5.8us
push r16
ldi r16,5
dec r16
brne PC-1
pop r16
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -