fm_i2cdrv2.msa
来自「MP3 整个 SDK」· MSA 代码 · 共 326 行
MSA
326 行
/********************************************************************************************
philips TEA5767 FM module driver(I2C DRIVER)
writen by GONGJIAN. for 3961
last update 05-3-30 14:57
********************************************************************************************/
//for FM_i2cdrv1
public WRITE_ONEFRAME
public READ_STATUS
public CALCULATE_PLL
//from I2C_Driver
extern I2C_Start
extern I2C_Stop
extern I2C_Writeonebyte
extern I2C_ReadOneByte
extern DELAY_15us
//from FM_i2cdrv1
extern FREQ_RF
extern WSET_PLLLB
extern WSET_PLLHB
extern WRITE_BUFFER
extern READ_BUFFER
extern WSET_HLSI
extern FM_result
//=====================================================
rseg FM_CTRL_D
//=====================================================
FMupdatestatus:
PUSH AF
PUSH BC
PUSH HL
LD E,0C0H //send start & address
CALL LWRD I2C_Start
CP 00H
JR Z,FMupdatestatus_exit
LD HL,LWRD WRITE_BUFFER
LD E,(HL)
LD C,02H
CALL LWRD I2C_Writeonebyte
CP 00H
JR Z,FMupdatestatus_exit
LD A,01H
LD (LWRD FM_result),A
JR FMupdatestatus_ok
FMupdatestatus_exit:
LD A,00H
LD (LWRD FM_result),A
FMupdatestatus_ok:
POP HL
POP BC
POP AF
RET
//===========================================================
// READ STATUS
//===========================================================
READ_STATUS:
PUSH BC
PUSH HL
LD B,05H
CALL LWRD FMwait50ms
FMwaitreadyloop1:
DEC B
JR Z,READ_STATUS_err
CALL LWRD READ_ONEFRAME
CP 00H
JR Z,FMwaitreadyloop1
LD HL,LWRD READ_BUFFER //判断RF=1?
BIT 7,(HL)
JR Z,FMwaitreadyloop1
READ_STATUS_err:
LD A,(LWRD FM_result)
POP HL
POP BC
RET
/********************************************************************************************
********************************************************************************************
Function is calculate the value of PLL.
Input parameter:no.
Output parameter:no.
Operation condition:
WSET_XTAL=1 and WSET_HLSI=1,PLL≡(125*(FREQ_RF+FREQ_IF))/1024
WSET_XTAL=1 and WSET_HLSI=0,PLL≡(125*(FREQ_RF-FREQ_IF))/1024
WSET_XTAL=0 and WSET_HLSI=1,PLL≡(2*(FREQ_RF+FREQ_IF))/25
WSET_XTAL=0 and WSET_HLSI=0,PLL≡(2*(FREQ_RF-FREQ_IF))/25
FREQ_RF:unit is KHz
FREQ_IF:unit is KHz
125=7d=01111101
********************************************************************************************/
CALCULATE_PLL:
PUSH AF
PUSH BC
PUSH DE
PUSH HL
LD HL,(LWRD FREQ_RF)
LD DE,0E1H
LD A,(LWRD WSET_HLSI)
CP 00H
JR Z,subfreqIF
ADD HL,DE //HL=HL+DE
JR calculate_st
subfreqIF:
SCF //CY=1
CCF //CY=/CY
SBC HL,DE //HL=HL-DE-CY
calculate_st:
LD D,H
LD E,L
LD BC,0500h
SCF
RR H
RR L
SRL H
RR L
MULshiftadd:
ADD HL,DE
JR NC,MULshiftaddnocarry
INC C
MULshiftaddnocarry:
INC C
SRL C //最后一次多移一位
RR H
RR L
DJNZ MULshiftadd
LD A,L
LD B,03H //本来应该是4位
MULshiftadd2:
SRL C
RR H
RR L
DJNZ MULshiftadd2
//优化PLL值
/*
LD A,(LWRD WSET_HLSI)
CP 01H
JR Z,calculate_ok
*/
LD B,07H
AND B
CP 05H
JR C,calculate_ok
INC HL
calculate_ok:
LD (LWRD WSET_PLLLB),HL
POP HL
POP DE
POP BC
POP AF
RET
//=========================================================
// WRITE FM REGISTER
//=========================================================
WRITE_ONEFRAME:
PUSH HL
PUSH BC
PUSH DE
LD E,0C0H //send start & address
CALL LWRD I2C_Start
CP 00H
JR Z,I2C_werror_exit
LD DE,LWRD WRITE_BUFFER
LD C,05H
CALL LWRD I2C_Write
CP 00H
JR Z,I2C_werror_exit
LD A,01H
LD (LWRD FM_result),A
JR I2Cwstop_exit
I2C_werror_exit:
LD A,00H
LD (LWRD FM_result),A
I2Cwstop_exit:
LD A,(LWRD FM_result)
POP DE
POP BC
POP HL
RET
//=========================================================
// READ FM REGISTER
//=========================================================
READ_ONEFRAME:
PUSH BC
PUSH HL
PUSH DE
LD E,0C1H //send start & address
CALL LWRD I2C_Start
CP 00H
JR Z,I2C_rerror_exit
LD DE,LWRD READ_BUFFER
LD C,05H
CALL LWRD I2C_Read
CP 00H
JR Z,I2C_rerror_exit
LD A,01H
LD (LWRD FM_result),A
JR I2Crstop_exit
I2C_rerror_exit:
LD A,00H
LD (LWRD FM_result),A
I2Crstop_exit:
LD A,(LWRD FM_result)
POP DE
POP HL
POP BC
RET
/*************************************************************
I2C Write One Frame
input parameter:DE:Sendbuffer address
C:byte length
output parameter:A:01-sucess;00-fail.
*************************************************************/
I2C_Write:
PUSH BC
PUSH DE
LD L,E
LD H,D
LD B,C
DEC B
I2C_Write_loop:
LD E,(HL)
LD C,00H
CALL LWRD I2C_Writeonebyte
CP 00H
JR Z,I2C_Write_exit
INC HL
DJNZ I2C_Write_loop
LD E,(HL)
LD C,02H
CALL LWRD I2C_Writeonebyte
I2C_Write_exit:
POP DE
POP BC
RET
/*************************************************************
I2C Read Continuous Byte
input parameter:DE:Receivebuffer address.
C:Data length
output parameter:A:1-success;0:fail.
*************************************************************/
I2C_Read:
PUSH DE
LD L,E
LD H,D
LD B,C
DEC B
CALL DELAY_15us //must >10us;avoid address ACK too short.
Read_data_loop:
LD E,00H
CALL LWRD I2C_ReadOneByte
CP 00H
JR Z,I2C_Read_Exit
LD A,C
LD (HL),A
INC HL
DJNZ Read_data_loop
LD E,02H //Send Stop & Receive data
CALL LWRD I2C_ReadOneByte
CP 00H
JR Z,I2C_Read_Exit
LD A,C
LD (HL),A
LD A,01H
I2C_Read_Exit:
POP DE
RET
//========================================================
// FM wait 50ms
//========================================================
FMwait50ms:
PUSH AF
PUSH BC
IN A,(4eh)
OR 08h
OUT (4eh),A
LD B,100
FMwait50msloop1:
PUSH BC
//500us
LD B,230
FMwait50msloop2:
PUSH DE
POP DE
PUSH DE
POP DE
DJNZ FMwait50msloop2
POP BC
DJNZ FMwait50msloop1
POP BC
POP AF
RET
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?