📄 fm_i2cdrv2.msa
字号:
/********************************************************************************************philips TEA5767 FM module driver(I2C DRIVER)writen by Xuezhi. for 3951 S1last update 04-2-13 15:03********************************************************************************************///for FM_i2cdrv1 module FM_I2CDRV2public I2C_initpublic I2C_exitpublic WRITE_ONEFRAMEpublic READ_STATUSpublic FMwait50ms//from FM_i2cdrv1extern FREQ_RFextern WSET_PLLLBextern WSET_PLLHBextern WRITE_BUFFERextern READ_BUFFERextern WSET_HLSIextern FM_resultextern disable_hosc//----------------------------------------------------- //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//=====================================================FMupdatestatus: PUSH AF PUSH BC PUSH HL CALL LWRD I2C_start LD A,0C0H LD B,00H CALL LWRD I2Ctransbyte CP 00H JR NZ,FMupdatestatus_exit LD HL,LWRD WRITE_BUFFER LD A,(HL) LD B,00H CALL LWRD I2Ctransbyte CP 00H JR NZ,FMupdatestatus_exit LD A,01H LD (LWRD FM_result),A JR FMupdatestatus_okFMupdatestatus_exit: LD A,00H LD (LWRD FM_result),AFMupdatestatus_ok: CALL LWRD I2C_stop POP HL POP BC POP AF RET//=========================================================WRITE_ONEFRAME: PUSH HL PUSH BC CALL LWRD I2C_start LD A,020H LD B,00H CALL LWRD I2Ctransbyte CP 00H JR NZ,I2C_werror_exit //LD C,8 LD HL,LWRD WRITE_BUFFERI2C_wr_nextbyte: LD A,(HL) LD B,00H CALL LWRD I2Ctransbyte CP 00H JR NZ,I2C_werror_exit INC HL DEC C JR NZ,I2C_wr_nextbyte LD A,01H LD (LWRD FM_result),A JR I2Cwstop_exitI2C_werror_exit: LD A,00H LD (LWRD FM_result),AI2Cwstop_exit: CALL LWRD I2C_stop LD A,(LWRD FM_result) POP BC POP HL RET//======================================READ_ONEFRAME: PUSH BC PUSH HL CALL LWRD I2C_start LD A,021H LD B,01H CALL LWRD I2Ctransbyte CP 00H JR NZ,I2C_rerror_exit LD C,04H LD HL,LWRD READ_BUFFERI2C_rd_nextbyte: LD A,00h CALL LWRD I2Crecebyte LD (HL),A INC HL DEC C JR NZ,I2C_rd_nextbyte LD A,01h CALL LWRD I2Crecebyte LD (HL),A LD A,01H LD (LWRD FM_result),A JR I2Crstop_exitI2C_rerror_exit: LD A,00H LD (LWRD FM_result),AI2Crstop_exit: CALL LWRD I2C_stop LD A,(LWRD FM_result) POP HL POP BC RET//===================================================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//--------------------------------------I2C_exit: PUSH AF IN A,(SDA_outport) RES SDA_outport_num,A OUT (SDA_outport),A IN A,(SCL_outport) RES SCL_outport_num,A OUT (SCL_outport),A POP AF RET//===============================================I2C_start: PUSH AF IN A,(SDA_doport) RES SDA_doport_num,A OUT (SDA_doport),A CALL LWRD I2C_wait5us IN A,(SCL_doport) RES SCL_doport_num,A OUT (SCL_doport),A POP AF RET//---------------------------------------------I2C_stop: PUSH AF IN A,(SCL_doport) SET SCL_doport_num,A OUT (SCL_doport),A CALL LWRD I2C_wait5us IN A,(SDA_doport) SET SDA_doport_num,A OUT (SDA_doport),A POP AF RET//========================================================//========================================================//A 为待传数据,返回时A中为响应类型,0为ACK, 1为NACK//若为地址字节且欲读取数据,B为1,否则为0I2Ctransbyte: PUSH BC LD C,A CALL LWRD I2CSendbyte//SDA output-->input IN A,(SDA_outport) RES SDA_outport_num,A OUT (SDA_outport),A IN A,(SDA_inport) SET SDA_inport_num,A OUT (SDA_inport),A//SCL output 1 CALL LWRD I2C_wait5us IN A,(SCL_doport) SET SCL_doport_num,A OUT (SCL_doport),A IN A,(SDA_dinport) BIT SDA_dinport_num,A JR NZ,GetNACK LD C,00H LD A,B CP 01H JR Z,I2Creadaddbyte IN A,(SDA_inport) RES SDA_inport_num,A OUT (SDA_inport),A IN A,(SDA_doport) RES SDA_doport_num,A OUT (SDA_doport),A JR ACKgetokI2Creadaddbyte: CALL LWRD I2C_wait5us IN A,(SCL_doport) RES SCL_doport_num,A OUT (SCL_doport),A JR I2CtransokGetNACK: LD C,01H IN A,(SDA_doport) SET SDA_doport_num,A OUT (SDA_doport),AACKgetok: IN A,(SDA_outport) SET SDA_outport_num,A OUT (SDA_outport),A CALL LWRD I2C_wait5us IN A,(SCL_doport) RES SCL_doport_num,A OUT (SCL_doport),A IN A,(SDA_doport) RES SDA_doport_num,A OUT (SDA_doport),AI2Ctransok: LD A,C POP BC RET//==================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -