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

📄 i2c.c.bak

📁 silabs USB c8051f321 ,DAB USB dongle的资料,已经可以量产的东西
💻 BAK
字号:

#include <c8051f320.h>  
#include "usb_api.h"

sbit 	SDA	=  P2^2 ;
sbit 	SCL	=  P2^3 ;


#define   HIGH       1
#define   LOW        0


code  int cwFMDefault[]={
0x0000,
0x0000,	
0xd881,	//0x02
//0x6300,
0x8e00, //101.7M
0x4400,	//0x04
0x06ff, //0x13ff, lilin, 06/22, 0x10f8, //0x05
0x0000,
0x00cd,
0x0096,
0x0020,
0x4163,
0x0806,
0x5800,
0x5800,
0x5800,
0x5800,
0x4c17,	//lilin, 08/13, seek_singlestep, 0x4817,
0x20a2,
0x0000,
0x000f,
0x06de,
0xecc0,
0x0200,
0x5383,
0x95a4,
0xe848,
0x0500,	//0x0500, lilin, 06/22, 0x0500,
0x00a4, //0x00a4, lilin, 06/22, 0x00a4,
0x889b,
0x0d84,
0x4f04,
0x8832,
0x7f71,
0x0660,
0x4010,
0x6002,
0x1808,
0x6458,
0x787f,
0x0100,
0xc040,
0xc020,
0x0024,
0x0400,
0x0020,//
};

void nop(unsigned int cnt)
{
	unsigned int i;
	for(i=0;i<cnt;i++);
}


void I2C_Start(void)
{
	SDA=HIGH;
	nop(1);
	SCL = HIGH;
	nop(4);
	SDA = LOW;
	nop(4);
	SCL = LOW;
	nop(1);
}



void I2C_Stop(void)
{
	SDA = LOW;
	nop(1);
	SCL = HIGH;
	nop(4);
	SDA = HIGH;
	nop(4);
}


void I2C_Write_Byte(unsigned char i2c_data)
{
   	unsigned char BitCnt;
	bit status;

   	for(BitCnt = 0; BitCnt < 8; BitCnt++)
   	{

		if(i2c_data &0x80)
			    SDA=1;
		else
		  		SDA=0;
   		i2c_data = i2c_data << 1;
		SCL=HIGH;
		nop(4);
		SCL=LOW;
   	}
	SDA=LOW;
	nop(1);
	SCL = HIGH;
	nop(1);
	nop(1);
	status=SDA;
	SCL = LOW;
	nop(4);

}





unsigned char I2C_Read_Byte_ACK(void)		
{

	unsigned char BitCnt,i2c_data=0;

	for(BitCnt= 0; BitCnt < 8; BitCnt++)
	{

		i2c_data = i2c_data << 1;
		//SDA=LOW;//modify by zjf
		SDA=HIGH;
		nop(1);
		SCL=HIGH;	
		if(SDA==1)i2c_data++;
		nop(4);
		SCL=LOW;


	}

	SDA=LOW;//ack

	nop(1);
	SCL = HIGH;
	nop(4);
	SCL = LOW;
	nop(1);	
	
	return i2c_data;	

}

unsigned char I2C_Read_Byte_NAK(void)		
{
	unsigned char BitCnt,i2c_data=0;

	for(BitCnt= 0; BitCnt < 8; BitCnt++)
	{

		i2c_data = i2c_data << 1;
		SDA=HIGH;
		nop(1);
		SCL=HIGH;	
		if(SDA==1)i2c_data++;
		nop(4);
		SCL=LOW;


	}

	SDA=HIGH;//nak

	nop(1);
	SCL = HIGH;
	nop(4);
	SCL = LOW;
	nop(1);	
	
	return i2c_data;	

}







unsigned int rda5800_reg_tab[45];

void DabFM_Read_Register(int reg_addr,int *ptrdata)
{

	unsigned char ValueH,ValueL,dev_addr;
	unsigned char i;
	unsigned int temp;

	I2C_Start();
	//read address
	dev_addr = 0x21;        
	I2C_Write_Byte(dev_addr);
	reg_addr=reg_addr;


	if(reg_addr<0x0a)	
	{
		for(i=0x0a;i<=0x3a;i++)
		{

			ValueH = I2C_Read_Byte_ACK();
			ValueL = I2C_Read_Byte_ACK();
			rda5800_reg_tab[i]=(((int)ValueH) << 8) | ValueL;
		}

		for(i=0x00;i<reg_addr;i++)
		{

			ValueH = I2C_Read_Byte_ACK();
			ValueL = I2C_Read_Byte_ACK();
			temp = (((int)ValueH) << 8) | ValueL;
			rda5800_reg_tab[i]= temp;
		}
	

	}

	else if(reg_addr>0x0a)
	{
		for(i=0x0a;i<reg_addr;i++)
		{

			ValueH = I2C_Read_Byte_ACK();
			ValueL = I2C_Read_Byte_ACK();
			rda5800_reg_tab[i]=(((int)ValueH) << 8) | ValueL;
		}

	}


	ValueH = I2C_Read_Byte_ACK();
	ValueL = I2C_Read_Byte_NAK();
	rda5800_reg_tab[reg_addr]=(((int)ValueH) << 8) | ValueL;



	I2C_Stop();
	
	
	*ptrdata = (((int)ValueH) << 8) | ValueL;


}





void DabFM_Write_Register(int reg_addr,int reg_data)
{

	unsigned char ValueH,ValueL,dev_addr;
	unsigned char i;
	

	I2C_Start();

	dev_addr = 0x20;       
	I2C_Write_Byte(dev_addr);

	for(i=2;i<reg_addr;i++)
	{
		ValueL = ((rda5800_reg_tab[i]) & 0xFF);
		ValueH = (((rda5800_reg_tab[i]) >> 8) & 0xFF);
		I2C_Write_Byte(ValueH);//write high byte first
		I2C_Write_Byte(ValueL);

	}

	ValueL = (reg_data & 0xFF);
	ValueH = ((reg_data >> 8) & 0xFF);
	I2C_Write_Byte(ValueH);
	I2C_Write_Byte(ValueL);

	rda5800_reg_tab[reg_addr]=reg_data;//update rda5800_reg_tab table


	I2C_Stop();
	
	



}




void Dab_Write_Register(int reg_addr,int reg_data)
{

	unsigned char ValueH,ValueL,dev_addr;
	///unsigned char i;
	

	I2C_Start();
	//device address
	dev_addr = 0xD6;       
	I2C_Write_Byte(dev_addr);


//write register address

	ValueL = (reg_addr & 0xFF);
	ValueH = ((reg_addr >> 8) & 0xFF);
	I2C_Write_Byte(ValueH);
	I2C_Write_Byte(ValueL);

//write register value
	ValueL = (reg_data & 0xFF);
	ValueH = ((reg_data >> 8) & 0xFF);
	I2C_Write_Byte(ValueH);
	I2C_Write_Byte(ValueL);

	I2C_Stop();


}



void Dab_Read_Register(int reg_addr,int *ptrdata)
{

	unsigned char ValueH,ValueL,dev_addr;
	//unsigned char i;
	

	I2C_Start();
	//device address
	dev_addr = 0xD6;  //write     
	I2C_Write_Byte(dev_addr);


//write register address

	ValueL = (reg_addr & 0xFF);
	ValueH = ((reg_addr >> 8) & 0xFF);
	I2C_Write_Byte(ValueH);
	I2C_Write_Byte(ValueL);

	I2C_Start();

	//device address
	dev_addr = 0xD7;  //read     
	I2C_Write_Byte(dev_addr);



//read register value

	//ValueH = I2C_Read_Byte_NAK();
	//ValueL = I2C_Read_Byte_NAK();


	ValueH = I2C_Read_Byte_ACK();
	ValueL = I2C_Read_Byte_NAK();


	I2C_Stop();

	*ptrdata = (((int)ValueH) << 8) | ValueL;

}


/*
void  fmautoseek(BYTE seekdirection)
{

	BYTE read_data_buff[4];


	BYTE write_data_buff[2];
	int register_data,i;	

	Dab_Write_Register(0x0030,0x1549);
	//set seek bit		
	if(seekdirection == 0) 
		write_data_buff[1] =0xd1;//// seek down
	else 
		write_data_buff[1] =0xd3;//// seek up

	write_data_buff[0] = 0x81;//	
	rda5800_reg_tab[2]=(write_data_buff[1]<<8)|write_data_buff[0];

	//for(i=0;i<=(1080-875);i++)
	for(;;)
	{

		DabFM_Write_Register(2,rda5800_reg_tab[2]);
		//FmSetMute();
		//wait STC=1
		//nop(50000);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
		//read reg 0x0a&0x0b	

		DabFM_Read_Register(0x0a,&register_data);
		rda5800_reg_tab[0x0a]=register_data;

		read_data_buff[1]=rda5800_reg_tab[0x0A]>>8;
		read_data_buff[0]=rda5800_reg_tab[0x0A];

		DabFM_Read_Register(0x0b,&register_data);
		rda5800_reg_tab[0x0b]=register_data;

		read_data_buff[3]=rda5800_reg_tab[0x0b]>>8;
		read_data_buff[2]=rda5800_reg_tab[0x0b];

		//check whether SF==1  & RSSI value


		//if(((read_data_buff[1]&0x20)==0)&&((read_data_buff[3]&0x3f)>((rda5800_reg_tab[5]>>8)&0x3f)))
		if((read_data_buff[3]&0x3f)>=0x03)
		{

		break;

		}
	}

	Dab_Write_Register(0x0030,0x1149);



}
*/


void InitDAB(void)
{
	int i;
	Dab_Write_Register(0x2000,0);
	Dab_Write_Register(0x1000,0x0003);
	Dab_Write_Register(0x2000,0x0002);//set the register map to rf register

	Dab_Write_Register(0x0030,0x134c);//initial rf register
	Dab_Write_Register(0x0030,0x134d);//initial rf register

    for(i=0;i<30000;i++);
	
	Dab_Write_Register(0x0012,0x8411);//set the fbc phase to match the sdm

	Dab_Write_Register(0x0014,0x41fa);//set the pll digital level to match the sdm timing

	Dab_Write_Register(0x0010,0x8447);
	Dab_Write_Register(0x0015,0x76a0);
	Dab_Write_Register(0x0026,0x1400);
	Dab_Write_Register(0x000e,0x44b1);
	Dab_Write_Register(0x0029,0x0);
	Dab_Write_Register(0x002a,0x0);
	Dab_Write_Register(0x002d,0x9000);
	Dab_Write_Register(0x0009,0x0a26);//set the 1na input from p endpoint


	Dab_Write_Register(0x0001,0x0084);
	Dab_Write_Register(0x0002,0x0184);
	Dab_Write_Register(0x0003,0x0404);
	Dab_Write_Register(0x0004,0x0484);
	Dab_Write_Register(0x0005,0x0584);
	Dab_Write_Register(0x0006,0x0785);
	Dab_Write_Register(0x0007,0x07fb);
	Dab_Write_Register(0x0008,0x07fb);


	Dab_Write_Register(0x0030,0x134d);//initial rf register
	Dab_Write_Register(0x001c,0x077a);
	Dab_Write_Register(0x001d,0x2aaa);

	Dab_Write_Register(0x0026,0x0400);
	Dab_Write_Register(0x0030,0x1349);

    for(i=0;i<30000;i++);

	Dab_Write_Register(0x0030,0x134b);


    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);

	Dab_Write_Register(0x0030,0x134f);

	Dab_Write_Register(0x2000,0x0000);
	Dab_Write_Register(0x1000,0x0000);

    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
//reset off && set the agc controlled by channel decoder
	Dab_Write_Register(0x1000,0x0001);//
	Dab_Write_Register(0x002c,0xffff);//
	Dab_Write_Register(0x002d,0x0);//

	Dab_Write_Register(0x000f,0x01b0);//
	Dab_Write_Register(0x0017,0x3e12);//set the csi auto match

	Dab_Write_Register(0x0011,0x0ee0);//promote the sensitivity
	

	Dab_Write_Register(0x0064,0x0000);
	Dab_Write_Register(0x0065,0x0007);
	Dab_Write_Register(0x0066,0x0013);
	Dab_Write_Register(0x0067,0x001a);
	Dab_Write_Register(0x0068,0x0024);
	Dab_Write_Register(0x0069,0x0030);
	Dab_Write_Register(0x006a,0x003c);
	Dab_Write_Register(0x006b,0x003c);


	Dab_Write_Register(0x005a,0x0c8f);
	Dab_Write_Register(0x005b,0x16a3);
	Dab_Write_Register(0x005c,0x283c);
	Dab_Write_Register(0x005d,0x007f);
	Dab_Write_Register(0x003f,0xd839);


	Dab_Write_Register(0x0074,0x283c);
	Dab_Write_Register(0x0075,0x0a28);
	Dab_Write_Register(0x0070,0x0001);

	Dab_Write_Register(0x0072,0x029d);
	Dab_Write_Register(0x004f,0x806a);
	Dab_Write_Register(0x0048,0x080d);

//dab start
	Dab_Write_Register(0x0001,0x00c4);
	Dab_Write_Register(0x1000,0x0003);

}


void DABInit(void)

{
	int i,regVal;
	//init rf
	Dab_Write_Register(0x2000,0x02);
	Dab_Write_Register(0x30,0x134d);
	Dab_Write_Register(0x12,0x8611);
	Dab_Write_Register(0x12,0x8611);
	Dab_Write_Register(0x14,0x41fa);
	Dab_Write_Register(0x10,0x8447);
	Dab_Write_Register(0x15,0x76a0);
	Dab_Write_Register(0x26,0x1400);
	Dab_Write_Register(0x0e,0x44b0);
	Dab_Write_Register(0x09,0x0a26);


//dab L band
		Dab_Write_Register(0x01,0x0084);
		Dab_Write_Register(0x02,0x0184);
		Dab_Write_Register(0x03,0x0404);
		Dab_Write_Register(0x04,0x0484);
		Dab_Write_Register(0x05,0x0584);
		Dab_Write_Register(0x06,0x0785);
		Dab_Write_Register(0x07,0x07fb);
		Dab_Write_Register(0x08,0x07fb);

//sel L band
		Dab_Write_Register(0x30,0x1349);


	// dc_calibration
	DABReadRegister(0x30,&regVal);
	regVal &= 0xfffd;
	Dab_Write_Register(0x30,regVal);
	//DABSleep(100);

    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);
    for(i=0;i<30000;i++);

	regVal |= 0x0002;
	Dab_Write_Register(0x30,regVal);







	// set crystal freq
	m_crys_freq = privData->refClock;
	crys = (DWord_t)(CRYSTAL_FACTOR*6*24.576/m_crys_freq);
	lower = crys & 0xFFFF;
	Dab_Write_Register(0x1F,lower);
	upper = (crys >> 16) & 0xFFFF;
	Dab_Write_Register(0x1E,upper);

	DABReadRegister(0x30,&regVal);
	if(m_crys_freq == 24.576)
		regVal |= 0x0100;	
	else
		regVal &= 0xfffffeff;
	Dab_Write_Register(0x30,regVal);




	// set rf freq
	DABTuneRequest(DEFAULT_FREQ);










	// init channel decoder
	
	Dab_Write_Register(0x2000,0);
	Dab_Write_Register(0x1000,0);
	Dab_Write_Register(0x1000,0x0001);
	Dab_Write_Register(0x002c,0xffff);
	Dab_Write_Register(0x002d,0);
	Dab_Write_Register(0x000f,0x01b0);
	Dab_Write_Register(0x0017,0x3e12);
	Dab_Write_Register(0x0064,0);
	Dab_Write_Register(0x0065,0x0007);
	Dab_Write_Register(0x0066,0x0013);
	Dab_Write_Register(0x0067,0x001a);
	Dab_Write_Register(0x0068,0x0024);
	Dab_Write_Register(0x0069,0x0030);
	Dab_Write_Register(0x006a,0x003c);
	Dab_Write_Register(0x006b,0x003c);
	Dab_Write_Register(0x005a,0x0c8f);
	Dab_Write_Register(0x005b,0x16a3);
	Dab_Write_Register(0x005c,0x283c);
	Dab_Write_Register(0x005d,0x007f);
	Dab_Write_Register(0x003f,0xc839);
	Dab_Write_Register(0x0070,0x0001);
	Dab_Write_Register(0x0074,0x283c);
	Dab_Write_Register(0x0075,0x0a28);
	Dab_Write_Register(0x0072,0x029d);
	Dab_Write_Register(0x004f,0x806a);
	Dab_Write_Register(0x0048,0x080d);

//use master interface,mask all interrupt source
	Dab_Write_Register(0x001A,0x007e);
//use spi interface mode
	Dab_Write_Register(0x1000,0x0203);
		







}

⌨️ 快捷键说明

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