📄 fm_i2cdrv2.msa
字号:
/********************************************************************************************
Nigata NS953 FM module YTS7001 driver(I2C DRIVER)
writen by Gongjian. for GL3951 S1. 05-1-17
********************************************************************************************/
//For FM_DRV1.msa
public CALCULATE_PLL
public READ_Stereo
public I2C_Init
public I2C_Exit
public Write_Register
public WRITE_ONEFRAME
public Read_Register
public READ_ONEFRAME
public R8_Readdata
public FMwait10ms
public FMwait20ms
public FMwait30ms
//From FM_DRV1.msa
extern FREQ_RF
extern WRITE_BUFFER
extern READ_BUFFER
extern FM_result
extern R1_PCNTL
extern R2_PCNTH
extern R8_PDETTST
extern Register_Data
extern Register_Address
//output enable port
#define SDA_outport 0F3H
#define SDA_outport_num 01H
//input enable port
#define SDA_inport 0F3H
#define SDA_inport_num 05H
#define SCL_outport 0F3H
#define SCL_outport_num 00h
#define SCL_inport 0F3h
#define SCL_inport_num 004h
//data port
#define SDA_doport 0F4h
#define SDA_doport_num 01h
#define SDA_dinport 0F4h
#define SDA_dinport_num 01h
#define SCL_doport 0F4h
#define SCL_doport_num 00h
#define SCL_dinport 0F4h
#define SCL_dinport_num 00h
//=====================================================
rseg FM_CTRL_D
//=====================================================
/********************************************************************************************
Function is calculate the value of PLL.
Input parameter:no.
Output parameter:no.
Operation condition:
PLL≡(125*(FREQ_RF-FREQ_IF))/1024
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) //radio freq
//LD HL,28E0H //76MHz
LD DE,0177H //375kHz IF
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
LD B,07H
AND B
CP 05H
JR C,calculate_ok
INC HL
calculate_ok:
LD A,L
LD (LWRD R1_PCNTL),A
LD A,H
LD (LWRD R2_PCNTH),A
//LD E,L
//LD D,H
POP HL
POP DE
POP BC
POP AF
RET
//=========================================================
// Read Stereo:
// Input parameter:NO
// Output parameter:A:1-sucess;0-Fail.
//=========================================================
READ_Stereo:
PUSH BC
PUSH HL
LD B,05H
FMwaitreadyloop1:
DEC B
JR Z,READ_STATUS_err
CALL LWRD R8_Readdata
CP 00H
JR Z,FMwaitreadyloop1
READ_STATUS_err:
LD A,(LWRD FM_result)
POP HL
POP BC
RET
//=========================================================
// Write register:
// Input parameter:E:register Address
// C:register data
// Output parameter:A:1-sucess;0-Fail.
//=========================================================
Write_Register:
PUSH BC
PUSH DE
LD A,E
LD (LWRD Register_Address),A
LD A,C
LD (LWRD Register_Data),A
CALL LWRD I2C_Start
LD A,0C8H //slave address:1100 10 ADR R/W
LD B,00H
CALL LWRD I2Ctransbyte
CP 00H
JR NZ,I2C_wrerror_exit
LD A,(LWRD Register_Address) //write register address
LD B,00H
CALL LWRD I2Ctransbyte
CP 00H
JR NZ,I2C_wrerror_exit
LD A,(LWRD Register_Data)
LD B,00H
CALL LWRD I2Ctransbyte
CP 00H
JR NZ,I2C_wrerror_exit
LD A,01H
LD (LWRD FM_result),A
JR I2C_wrstop_exit
I2C_wrerror_exit:
LD A,00H
LD (LWRD FM_result),A
I2C_wrstop_exit:
CALL LWRD I2C_Stop
LD A,(LWRD FM_result)
POP DE
POP BC
RET
//=========================================================
// Write Continous register:
// Input parameter:WRITE_BUFFER
// Output parameter:A:1-sucess;0-Fail.
//=========================================================
WRITE_ONEFRAME:
PUSH HL
PUSH BC
CALL LWRD I2C_Start
LD A,0C8H //Slave Address
LD B,00H
CALL LWRD I2Ctransbyte
CP 00H
JR NZ,I2C_wferror_exit
LD A,00H //First Register Address
LD B,00H
CALL LWRD I2Ctransbyte
CP 00H
JR NZ,I2C_wferror_exit
LD C,14 //R0~R13
LD HL,LWRD WRITE_BUFFER
I2C_wf_nextbyte:
LD A,(HL)
LD B,00H
CALL LWRD I2Ctransbyte
CP 00H
JR NZ,I2C_wferror_exit
INC HL
DEC C
JR NZ,I2C_wf_nextbyte
LD A,01H
LD (LWRD FM_result),A
JR I2Cwfstop_exit
I2C_wferror_exit:
LD A,00H
LD (LWRD FM_result),A
I2Cwfstop_exit:
CALL LWRD I2C_Stop
LD A,(LWRD FM_result)
POP BC
POP HL
RET
//=========================================================
// Read register:
// Input parameter:E:register Address
// Output parameter:C:Register_Data
// A:1-sucess;0-Fail.
//=========================================================
Read_Register:
PUSH DE
LD A,E
LD (LWRD Register_Address),A
CALL LWRD I2C_Start
LD A,0C8H //Slave Address-Write
LD B,00H
CALL LWRD I2Ctransbyte
CP 00H
JR NZ,I2C_rrerror_exit
LD A,(LWRD Register_Address) //Register Address
LD B,00H
CALL LWRD I2Ctransbyte
CP 00H
JR NZ,I2C_rrerror_exit
CALL LWRD I2C_Init //Restart
CALL LWRD I2C_Start
LD A,0C9H //Slave Address-Read
LD B,01H
CALL LWRD I2Ctransbyte
CP 00H
JR NZ,I2C_rrerror_exit
LD A,01h
CALL LWRD I2Crecebyte
LD (LWRD Register_Data),A
LD A,01H
LD (LWRD FM_result),A
JR I2Crrstop_exit
I2C_rrerror_exit:
LD A,00H
LD (LWRD FM_result),A
I2Crrstop_exit:
CALL LWRD I2C_Stop
LD A,(LWRD Register_Data)
LD C,A
LD A,(LWRD FM_result)
POP DE
RET
//=========================================================
// Read Continous register:
// Input parameter:READ_BUFFER
// Output parameter:A:1-sucess;0-Fail.
//=========================================================
READ_ONEFRAME:
PUSH BC
PUSH HL
CALL LWRD I2C_Start
LD A,0C8H //Slave Address-Write
LD B,00H
CALL LWRD I2Ctransbyte
CP 00H
JR NZ,I2C_rferror_exit
LD A,00H
LD B,00H
CALL LWRD I2Ctransbyte
CP 00H
JR NZ,I2C_rferror_exit
CALL LWRD I2C_Init //Restart
CALL LWRD I2C_Start
LD A,0C9H //Slave Address-Read
LD B,01H
CALL LWRD I2Ctransbyte
CP 00H
JR NZ,I2C_rferror_exit
LD C,13 //R0~R12
LD HL,LWRD READ_BUFFER
I2C_rd_nextbyte:
LD A,00h
CALL LWRD I2Crecebyte
LD (HL),A
INC HL
DEC C
JR NZ,I2C_rd_nextbyte
LD A,01h //R13
CALL LWRD I2Crecebyte
LD (HL),A
LD A,01H
LD (LWRD FM_result),A
JR I2Crfstop_exit
I2C_rferror_exit:
LD A,00H
LD (LWRD FM_result),A
I2Crfstop_exit:
CALL LWRD I2C_Stop
LD A,(LWRD FM_result)
POP HL
POP BC
RET
//=========================================================
// Read R8 Data:
// Input parameter:NO
// Output parameter:A:1-sucess;0-Fail.
//=========================================================
R8_Readdata:
PUSH BC
PUSH HL
LD B,03H
R8_Readdata_LOOP:
DEC B
JR Z,R8_Readdata_Exit
LD E,08H
CALL LWRD Read_Register
CP 00H
JR Z,R8_Readdata_LOOP
xor a
LD (LWRD FM_result),A
LD A,C
BIT 7,A
JR Z,R8_Readdata_Exit
LD A,01H
LD (LWRD R8_PDETTST),A
LD (LWRD FM_result),A
R8_Readdata_Exit:
LD A,(LWRD FM_result)
POP HL
POP BC
RET
//=========================================================
// I2C Init:
// Input parameter:NO
// Output parameter:NO.
//=========================================================
I2C_Init:
PUSH AF
IN A,(SDA_doport)
SET SDA_doport_num,A
OUT (SDA_doport),A
IN A,(SCL_doport)
SET SCL_doport_num,A
OUT (SCL_doport),A
IN A,(SDA_outport)
SET SDA_outport_num,A
OUT (SDA_outport),A
IN A,(SCL_outport)
SET SCL_outport_num,A
OUT (SCL_outport),A
POP AF
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -