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

📄 hal9255.c

📁 威望公司MP3 + USB MCU 的参考软件
💻 C
字号:


#include "hal9255.h"

//data is stable on the rising edge of clk
//Data format, D20-D0 can be in/out according the cmd
//C4-C0, D20-D0

//The cmd should be supported is just 11011b which is used to read FM frequency.
//FM:D20=L,AM:D20=H;
//D19 D18D17D16_D15D14D13D12_D11D10D9D8·D7D6D5D4_D3D2D1D0MHz
//115.80MHz
#if (FMRX_MODE == FMRX_9255)

#if(BOARD_ID==EVB_V1)
sbit DCLK=P1^7;/*假设由P1.7和P1.6控制*/
sbit SDAT=P1^6;
#define SDAT_OUTPUT()               (P1_DDR|=0x40)
#define SDAT_INPUT()                 (P1_DDR&=0xBF)
#define DCLK_OUTPUT()			(P1_DDR|=0X80)
#endif

#define DELAY_TIME 	8
#define DELAY(x)    DelayUs(x)
///////////////////////////////////////////
//Define 9255 CMD
//#define	CMD_MSB 
#ifdef CMD_MSB
#define CMD_WAIT		(0X00<<3)	//Only the high 5bits is effective
#define CMD_RST			(0X1C<<3)
#define CMD_RSTDONE	(0X19<<3)
#define CMD_READFM 	(0X1B<<3)		
#define CMD_READAM		(0X19<<3)	//??
#define CMD_DISABLE		(0X10<<3)
#else
#define CMD_WAIT		(0X00)	//Only the high 5bits is effective
#define CMD_RST			(0X1C)
#define CMD_RSTDONE	(0X19)
#define CMD_READFM 	(0X1B)		
#define CMD_READAM		(0X19)	//??
#define CMD_DISABLE		(0X10)
#endif

#define FM_LOW		0X00
#define AM_HIGH		0X01
#define CMD_BITS		5
#define DATA_BITS		21

static BYTE FMFreq[5];

static void _halI2CInit(void)
{
	SDAT_OUTPUT();	
	DCLK_OUTPUT();
	
	SDAT = 0;
	DCLK = 1;

	return;
}

static void halSend1(void)
{
	/*发送1,在SCL为高电平时使SDA信号为高*/
	SDAT_OUTPUT();	
	DCLK_OUTPUT()	;

	SDAT=1;
	DCLK=0;
	DELAY(DELAY_TIME);		
	DCLK=1;
	DELAY(DELAY_TIME);

	return;	
}

static void halSend0(void)   /* SEND ACK */
{
	/*发送0,在SCL为高电平时使SDA信号为低*/
	SDAT_OUTPUT();	
	DCLK_OUTPUT();

	SDAT=0;
	DCLK=0;
	DELAY(DELAY_TIME);	
	DCLK=1;
	DELAY(DELAY_TIME);
	//DCLK=0;
	//DELAY(DELAY_TIME);

	return;
}

static void halSendClk()
{
	/*发送0,在SCL为高电平时使SDA信号为低*/
	//SDAT_OUTPUT();	
	DCLK_OUTPUT();

	//SDAT=0;
	DCLK=0;
	DELAY(DELAY_TIME);	
	DCLK=1;
	DELAY(DELAY_TIME);

	return;
}

static void _hal9255CMD(BYTE bCmd)
{
	BYTE i;
	BYTE cmd = bCmd;
	
	_halI2CInit();
	DelayMs(1);

#ifdef CMD_MSB
	//Send CMD
	for(i=0; i<CMD_BITS; i++){
		if(cmd&0x80){ //Send MSB first
			halSend1();
		}else{
			halSend0();
		}
		cmd <<= 1;
	}
#else //LSB First
	for(i=0; i<CMD_BITS; i++){
		if(cmd&0x01){ //Send LSB first
			halSend1();
		}else{
			halSend0();
		}
		cmd >>= 1;
	}
#endif

#if 0	
	//Take care about the direction.
	halSendClk();
	halSendClk();
	halSendClk();	
#endif

	return;
}

static void _hal9255Data()
{
	BYTE i, j;
	BYTE bTmp;
	BYTE fmam;

	//Read Data
	SDAT_INPUT(); 	
    	DCLK_OUTPUT();		

	//Get data at the rising edge	
	DCLK=0;    //Rising edge
	DelayUs(DELAY_TIME);
	 if(SDAT==1){
		fmam = AM_HIGH;
	 }else{
		fmam = FM_LOW;
	 }
 	DCLK=1;    
	DelayUs(DELAY_TIME);	 

	
	 for(i=0; i<5; i++){
	 	bTmp = 0;
		for(j=0; j<4; j++){
			bTmp=bTmp<<1;
			DCLK=0; 
			DelayUs(DELAY_TIME);
			
		        if(SDAT==1){		            
		            bTmp=bTmp|0x01;
		        }
			DCLK = 1;				
			DelayUs(DELAY_TIME);
		}

		FMFreq[i] = bTmp;
	 }

	halSendClk();
	halSendClk();
	halSendClk();		 

	for(i=0; i<5; i++){ 
		UartOutText("-I-: FMFreq[i] ");UartOutValue(FMFreq[i], 2);
	}	 

	return;
}

void hal9255Init(void)
{
	BYTE i, j;
	BYTE bTmp;
	BYTE fmam;
	
	_halI2CInit();
	DelayMs(1);

	//Send CMD
	_hal9255CMD(CMD_RST);
	//_hal9255Data();	
	DelayMs(1);

	_hal9255CMD(CMD_RSTDONE);
	_hal9255Data();
	DelayMs(1);	

	return;
}


void hal9255FMRead(void)
{
#if 1
	hal9255Init();
	
	_hal9255CMD(CMD_READFM);
	_hal9255Data();

#endif

	return;
}

#endif

⌨️ 快捷键说明

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