📄 i2c.c.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,®ister_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,®ister_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,®Val);
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,®Val);
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 + -