⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 halhy1418.c

📁 威望公司MP3 + USB MCU 的参考软件
💻 C
字号:
/****************************************************************
*                      Viaon Technology (Suzhou) Co.,Ltd
*
*    Copyright 2007, Viaon Technology (Suzhou) Co.,Ltd,Suzhou,China
*                    All rights reserved.
*
*
* Filename:      	halhy1418.c
*
* Programmer:    	Greg
*
* Created: 	 	1/2/2008
*
* Description: 		public functions 
*              
*        
* Change History (most recent first):	2008.1.2
****************************************************************/
#include "utiltypedef.h"
#include "common.h"
#include "halhy1418.h"

#if(FM_TRANS_MODULE == FM_TRANS_HY1418)

//0:input, 1:output
#if (BOARD_ID == EVB_V1)	//For debug only, because P2 port is occupied by external flash
#define SPI_CLK_OUT()		(P1_DDR|=0x01)
#define SPI_EN1_OUT()		(P1_DDR|=0x04)
#define SPI_DAT_OUT()		(P1_DDR|=0x02)
#define SPI_DAT_IN()			(P1_DDR&=(~0x02))

sbit SPI_CLK	= P1^0;	//Direction: out, Default:0
sbit SPI_DAT	= P1^1;  //Direction: in/out, Default:x
sbit SPI_EN1	= P1^2;  //Direction: out, negative, Default:1
#elif (BOARD_ID == HZ_114)
#define SPI_CLK_OUT()		(P2_DDR|=0x04)
#define SPI_EN1_OUT()		(P2_DDR|=0x08)
#define SPI_DAT_OUT()		(P2_DDR|=0x02)
#define SPI_DAT_IN()			(P2_DDR&=(~0x02))

sbit SPI_CLK	= P2^2;
sbit SPI_DAT	= P2^1;
sbit SPI_EN1	= P2^3;

#else //for leeed, P2.0=1, P2.1 not assigned, P2.2 DA, P2.3 clk, P2.4 CE
#if 0
sbit SPI_CLK	= P2^2;
sbit SPI_DAT	= P2^1;
sbit SPI_EN1	= P2^3;
#else
//sbit LEEED_ON = P2^0;
sbit SPI_CLK  = P2^3;
sbit SPI_DAT = P2^2;
sbit SPI_EN1 = P2^4;
#endif
#define SPI_CLK_OUT()		(P2_DDR|=0x02)
#define SPI_EN1_OUT()		(P2_DDR|=0x01)
#define SPI_DAT_OUT()		(P2_DDR|=0x04)
#define SPI_DAT_IN()			(P2_DDR&=(~0x04))
#endif

#if 0
void halSPIInit(void)
{
	//set gpio direction, value
	SPI_CLK = 0;
	SPI_EN1 = 0;
	SPI_CLK_OUT();
	SPI_EN1_OUT();
	
	return;
}
#endif

void _halSPISend0(void)
{
	//SPI_EN should be setup before this function

//	SPI_DAT_OUT();
	SPI_CLK = 0;		//Here is the falling edge
	SPI_DAT = 0;
	DelayUs(SPI_CLK_TIME);
	SPI_CLK = 1;		// the raising edge
	DelayUs(SPI_CLK_TIME);

	return;
}

void _halSPISend1(void)
{
	//SPI_EN should be setup before this function

//	SPI_DAT_OUT();
	SPI_CLK = 0;		//Here is the falling edge
	SPI_DAT = 1;
	DelayUs(SPI_CLK_TIME);
	SPI_CLK = 1;		// the raising edge
	DelayUs(SPI_CLK_TIME);

	return;
}

void _halSPIWrite(WORD wVal)	//LSB -> MSB
{
	BYTE i;

	SPI_EN1 = 1;
	//LEEED_ON = 1;
	SPI_DAT_OUT();
	for(i=0;i<16;i++){
		if(wVal&0x0001){
			_halSPISend1();
		}else{
			_halSPISend0();
		}
		wVal >>= 1; //LSB will be put on the SPI bus first.
	}

	SPI_EN1 = 0;
	SPI_CLK = 0;
	
	return;
}

/*
Frequency: 87.7MHz -> 108MHz, step 0.1MHz
Steps: 0 -> 203
16bit SPI DATA:
      T1(bit15/MSB), T0, PD1, PD0, MONO(bit11), D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0(bit0/LSB)
      T0, T1: for test should be set 0
      PD0, PD1: for charge pump output, (0, 0) for usual operation
      D0~D10: Program Counter/(Steps + FM_FREQ_BASE)
Order when put on SPI DATA PIN:
	MSB, ..., LSB -> DATA_PIN
*/
static BYTE data s_FMIdx;
void halFMSet(BYTE byChIdx)	//byChIdx: 0-> 203
{
	WORD wProgCnt = 0;

	s_FMIdx = byChIdx;	
	wProgCnt = FM_FREQ_BASE + (WORD)byChIdx;

	UartOutText("-I-: FM Idx 0x");UartOutValue(byChIdx, 2);

#ifndef FM_NULL_TEST
	_halSPIWrite(wProgCnt);
#endif

	return;
}

void halFMUp(void)	//byChIdx: 0-> 203
{
	s_FMIdx++;
	if(s_FMIdx > FM_CHIDX_MAX){//Over Max
		s_FMIdx = 0;		
	}	

	halFMSet(s_FMIdx);	
	
	return;
}

void halFMDown(void)	//byChIdx: 0-> 203
{
	if(s_FMIdx == 0){//Minmal
		s_FMIdx = FM_CHIDX_MAX;//turn around		
	}else
		s_FMIdx--;

	halFMSet(s_FMIdx);	
	
	return;
}

WORD halFMGetFreq(void)
{
//	FMDigital = FM_FREQ_BASE+FMLevel;
	WORD wTmp = FM_FREQ_BASE + (WORD)s_FMIdx;

	//UartOutText("-I-: halFMGetFreq 0x");UartOutValue(wTmp, 4);
	return wTmp;
}

BYTE halFMGetIdx(void)
{
//	FMDigital = FM_FREQ_BASE+FMLevel;
	//WORD wTmp = FM_FREQ_BASE + s_FMIdx;

	return s_FMIdx;
}

BYTE halFMFreq2Idx(WORD wFreq)
{
	WORD wTmp = wFreq;

	//Checking parameter validation
	if((wFreq>=FM_FREQ_BASE) && (wFreq<=FM_FREQ_MAX)){
		wTmp = wTmp - FM_FREQ_BASE; 
	}else{
		wTmp = FM_CHIDX_INVALID;
	}		
	
	return (BYTE)wTmp;
}
#endif



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -