Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

I2C FM Radio на чипе BК1080

Чт ноя 06, 2014 13:46:00

Подскажите с начальной инициализацией микросхемы:

1. Какой адрес чипа BK1080 на шине I2C.

2. Непонятна процедура настройки на FM канал.

Дока в файле.
Вложения
BK1080.pdf
(1.24 MiB) Скачиваний: 2509

Re: I2C FM Radio на чипе BК1080

Чт ноя 06, 2014 13:58:37

Могу ошибаться, но в пункте 6.2.2 указан адрес 0х80

Re: I2C FM Radio на чипе BК1080

Чт ноя 06, 2014 14:13:48

DarkWolf писал(а):Могу ошибаться, но в пункте 6.2.2 указан адрес 0х80

Похоже что это он. Я думал что это ID этого чипа считаное с регистра. Спасибо.


В разрыве линий SDA и SCL со стороны контроллера на плате стоят резисторы 1ком и конденсаторы 470 pF обычно в разрыве этих линий стоят 100 Om - зачем такие большие номиналы резисторов ?

Фото платы тут https://file-up.net/big_1ce2b7e8dd645bd ... 32236.html


Код не мой а с китайского сайта - почему то там CHIP_ADDR 0xc0 - может ошибка при копировании

#define CHIP_ADDR 0xc0 //0x60<<1
#define READ_OP 0x20

//BK108X register map
#define REG0_DEVICE_ID 0x00
#define REG1_CHIP_ID 0x01
#define REG2_POWER_CFG 0x02
#define REG3_CHANNEL 0x03
#define REG4_SYS_CONF1 0x04
#define REG5_SYS_CONF2 0x05
#define REG6_SYS_CONF3 0x06

#define REG7_TEST1 0x07
#define REG8_TEST2 0x08
#define REG9_BOOT_CFG 0x09
#define REGa_STATUS_RSSI 0x0a

#define RDSR_BIT 15
#define STC_BIT 14
#define SF_BL_BIT 13
#define AFCRL_BIT 12

#define REGb_READ_CHAN 0x0b

/* Определение совиестимости функций */
#define Delay1us() { uSleep_10us(DT_I2C); }


class BK1080 : public I2C {

public:

/***************************************************/
u16 BK1080_FreqToChan(u16 frequency);
u16 BK1080_Get_ID();
void BK1080_Intialization();
void BK1080_SetMute(bool mute);
void BK1080_PowerOffProc();
void BK1080_SetFreq(WORD curFreq);
bool BK1080_ValidStop(WORD freq,WORD start_freq);
void BEKEN_I2c_Read(UCHAR reg,UCHAR *pBuf,UCHAR len);
void BEKEN_I2c_Write(UCHAR reg,UCHAR *pBuf,UCHAR len);
void BK1080_SetVolume(UCHAR vol);
/*************************************************/
BK1080(){};
virtual ~BK1080(){};

} ;


#ifdef USE_BK1080_FM
extern bool iic_busy;
extern bool sys_clock_flag;
//BK1080 initialization value
_code u16 HW_Reg[]=
{
0x0008,
0x1080,
#ifdef XTAL_CLOCK //reg2
0x1201, //for crystal clock
#else
0x0201, //for extern clock share crystal with mcu
#endif
0x0000,
0x40C0,
0x0A5F,
0x002E,
0x02FF,
0x5B11,
0x0000,
0x411E,
0x0000,
0xCE00,
0x0000,
0x0000,
0x1000,
0x0010,//reg16
0x0002,//0x0002,//
0x13FF,
0x9852,
0x2000,//0000
0x0000,
0x4008, //0008
0x0000,
0x51E1,
0x38bc,//0x20bC,
0x2645,
0x00E4,
0x1CD8,
0x3A50,
0xEAF0,
0x3000,//31
0x0200,
0x0000,
0x0001, //for 1084evc1
0x0000, //for 1084evc1
0x00c2, //for 1084evc1
};





/**************************************************
Function: EnableWire2()
Parameter:
b_enable: 1: wire2;0: wire3;

Description:
Enable wire2 or wire 3 mode
/**************************************************/
#if defined(USE_FM_GPIO)
void BK1080__gpio_ctrl(bool fm_ctrl_flag,u8 gpio_num)
{
u8 TmpData[2];
//printf(" BK1080__gpio_ctrl \r\n");
BEKEN_I2c_Read(0x04,TmpData,2); //read reg2,with 4 bytes
if(fm_ctrl_flag)
{
if(gpio_num==FM_GPIO_1)
TmpData[1]|= 0x03;
else if(gpio_num==FM_GPIO_2)
TmpData[1]|= 0x0C;
}
else
{
if(gpio_num==FM_GPIO_1)
TmpData[1]&=~0x03;
else if(gpio_num==FM_GPIO_2)
TmpData[1]&=~0x0C;
}
BEKEN_I2c_Write(0x04,TmpData,2); //write reg2,with 4 bytes
}
#endif

/**************************************************
Function: BK1080_FreqToChan()
Parameter:
frequency: FM frequency *10 ,such as 1017,933,1077..

Description:
change from frequency to channel
/**************************************************/

u16 BK1080_FreqToChan(u16 frequency)
{
u16 bottomOfBand;
u8 channelSpacing;
u16 channel;

bottomOfBand = 760;
channelSpacing=1;

channel = (frequency - bottomOfBand) / channelSpacing;

return (channel);

}


u16 BK1080_Get_ID()
{
u8 TmpData[2];
u16 ChipID = 0xFFFF;

//sys_printf(" FM SET BK1080_PowerOffProc ");
BEKEN_I2c_Read(0x01,TmpData,2); //read reg2,with 4 bytes


ChipID = TmpData[0];
ChipID = ((ChipID<<8) | TmpData[1]);
printf(" BK1080ChipID %x \r\n",ChipID);
return ChipID;
}


/**************************************************
Function: Chip_wire2_Initialize()
Parameter:
None

Description:
BK1080 I2C mode initialization
/**************************************************/
void BK1080_Intialization()
{
u8 index;
u8 _xdata bk1080_writeData8[74];
u8 TmpData[2];

delay_10ms(50);//delay 1s,please revise delay time according to your MCU


for(index = 0; index < 37; index++)
{
bk1080_writeData8[index*2] = (HW_Reg[index] >> 8)&0xff;
bk1080_writeData8[index*2+1] = (HW_Reg[index])&0xff;
}

BEKEN_I2c_Write(0,&(bk1080_writeData8[0]),68);//start from reg2,total 60 byte

delay_10ms(10);//delay 250ms

bk1080_writeData8[25*2+1]&=0x7f;
BEKEN_I2c_Write(25,&(bk1080_writeData8[25*2]),2);
bk1080_writeData8[25*2+1]|=0x80;
BEKEN_I2c_Write(25,&(bk1080_writeData8[25*2]),2);

delay_10ms(3);//delay 60ms
BEKEN_I2c_Read(0x04,TmpData,2); //read reg2,with 4 bytes

//printf(" BK1080IntializationOK=%x ",TmpData[0]);


}

void BK1080_SetMute(bool mute)
{
u8 TmpData[2];

BEKEN_I2c_Read(0x02,TmpData,2); //read reg2,with 4 bytes

if(mute)
{
//sys_printf(" FM SET BK1080_SetMute ");

TmpData[0]|= 0x40;
}
else
{
//sys_printf(" FM SET BK1080_Set UNMute ");

TmpData [0]&=0xbf;
}

BEKEN_I2c_Write(2,TmpData,2); //write reg2,with 4 bytes
}
void BK1080_SetVolume(u8 vol)
{
u8 TmpData[2];

if(vol ==0){
BK1080_SetMute(TRUE);
return;
}
else{
BK1080_SetMute(FALSE);
}
delay_10ms(1);//delay 60ms
BEKEN_I2c_Read(0x05,TmpData,2); //read reg2,with 4 bytes
//delay_10ms(2);//delay 60ms

TmpData[1] =((TmpData[1]&0xF0)|vol);

BEKEN_I2c_Write(0x05,TmpData,2); //write reg2,with 4 bytes
delay_10ms(2);//delay 60ms

}

void BK1080_PowerOffProc()
{
u8 TmpData[2];

//sys_printf(" FM SET BK1080_PowerOffProc ");
BEKEN_I2c_Read(0x02,TmpData,2); //read reg2,with 4 bytes
TmpData[1] |=0x41;

BEKEN_I2c_Write(2,TmpData,2); //write reg2,with 4 bytes
}

/**************************************************
Function: BK1080_SetFreq()
Parameter:
curFreq: FM frequency *10 ,such as 1017,933,1077..

Description:
set FM to a frequency
/**************************************************/
void BK1080_SetFreq(u16 curFreq)
{
u16 curChan;
u8 TmpData8[2];

//BEKEN_I2c_Read(2,TmpData8,4); //read reg2,with 4 bytes

curChan=BK1080_FreqToChan(curFreq); /*stop seek and tune*/

//TmpData8[0]&=0xfe;
TmpData8[0] =0x0;//reset tune
TmpData8[1]=curChan&0xff;
BEKEN_I2c_Write(3,TmpData8,3); //write reg2,with 4 bytes


TmpData8[0]=(curChan>>8)&0xff;
TmpData8[0] |= 0x80;//start tune
TmpData8[1]=curChan&0xff;
BEKEN_I2c_Write(3,TmpData8,2); //write reg2,with 4 bytes


TmpData8[0] &= 0x7F;//start tune
BEKEN_I2c_Write(3,TmpData8,2); //write reg2,with 4 bytes



}


/**************************************************
Function: BK1080_ValidStop()

Parameter:
freq:FM frequency *10 ,such as 1017,933,1077...
start_freq:lowest frequency,in China,start_freq=875
Description:
check a frequency is a valid.
Return:
1:ok
0:false
/**************************************************/
u16 _xdata g_freq_deviation_array[1081-MIN_FRE];
bool BK1080_ValidStop(u16 freq,u16 start_freq)
{
static _xdata u16 last_tuned_freq=0;//static variable
static _xdata u16 g_last_freq_deviation_value=0;
u16 cur_freq_deviation;
u8 TmpData8[8];

BK1080_SetFreq(freq);
#if defined(VOL_TUNE_FREQ_VOL)||defined(VOL_TUNE_FREQ_ONLY)||defined(VOL_TUNE_NEW_VOLUME_KEY_FEATURE)
if( get_radio_freq_tune_protect()){

}
else
#endif
{
#if defined(K000_HG_898_V001)||defined(FAST_BAND_SCAN_SPEED)
delay_10ms(10);//delay 70ms
#else
delay_10ms(20);//delay 70ms
#endif
}
////////////////////////////////////
//new added 2009-05-30
BEKEN_I2c_Read(0x07,TmpData8,2);//start from reg 0x7,with 2bytes

cur_freq_deviation=TmpData8[0];
cur_freq_deviation<<=8;
cur_freq_deviation|=TmpData8[1];
cur_freq_deviation=cur_freq_deviation>>4;

g_freq_deviation_array[freq-start_freq]=cur_freq_deviation;


////////////////////////////////////

BEKEN_I2c_Read(7,TmpData8,8);//start from reg7,with 8bytes

if(TmpData8[6]&0x10) //check AFCRL bit12
{
last_tuned_freq=freq;//save last tuned freqency
g_last_freq_deviation_value=cur_freq_deviation;
return 0;//false
}

if(TmpData8[7]<12) //RSSI<10 РЕєЕЗї¶И


//if(TmpData8[7]<10) //RSSI<10 РЕєЕЗї¶И

//if(TmpData8[7]<12) //RSSI<10 РЕєЕЗї¶И
{
last_tuned_freq=freq;//save last tuned freqency
g_last_freq_deviation_value=cur_freq_deviation;
return 0;//false
}

//if( (TmpData8[1]&0xf) <3) //SNR<2 3---5 јЩМЁ


if( (TmpData8[1]&0xf) <2) //SNR<2 3---5 јЩМЁ
{
last_tuned_freq=freq;//save last tuned freqency
g_last_freq_deviation_value=cur_freq_deviation;
return 0;//false
}


//add frequency devation check
//if( (cur_freq_deviation>=0x64)&&(cur_freq_deviation<=(0xfff-0x64))) ///Оўµч
if( (cur_freq_deviation>=250)&&(cur_freq_deviation<=(0xfff-250))) ///Оўµч

//if( (cur_freq_deviation>=0x96)&&(cur_freq_deviation<=(0xfff-0x96))) ///Оўµч
{
last_tuned_freq=freq;//save last tuned freqency
g_last_freq_deviation_value=cur_freq_deviation;

return 0;

}


/*/new added 2009-05-30
if( (freq>start_freq)&&( (freq-last_tuned_freq)==1) )
{
if(g_last_freq_deviation_value&0x800)
{
last_tuned_freq=freq;//save last tuned freqency
g_last_freq_deviation_value=cur_freq_deviation;
return 0;
}

if(g_last_freq_deviation_value<200)
{
last_tuned_freq=freq;//save last tuned freqency
g_last_freq_deviation_value=cur_freq_deviation;
return 0;
}

}

if( (freq>=start_freq)&&( (last_tuned_freq-freq)==1) )
{
if( (g_last_freq_deviation_value&0x800)==0)
{
last_tuned_freq=freq;//save last tuned freqency
g_last_freq_deviation_value=cur_freq_deviation;
return 0;
}

if(g_last_freq_deviation_value>(0xfff-200) )
{
last_tuned_freq=freq;//save last tuned freqency
g_last_freq_deviation_value=cur_freq_deviation;
return 0;
}

}
*/
#if 1
//new added 2009-08-25
if( (freq>=876)&&( (freq-last_tuned_freq)==1) )
{
if(g_freq_deviation_array[freq-start_freq-1]&0x800)
{
return 0;
}

if(g_freq_deviation_array[freq-start_freq-1]<50)//150
{
return 0;
}
}

if( (freq>=MIN_FRE)&&( (last_tuned_freq-freq)==1) )
{
if( (g_freq_deviation_array[freq-start_freq+1]&0x800)==0)
{
return 0;
}

if(g_freq_deviation_array[freq-start_freq+1]>(0xfff-50) )//150
{
return 0;
}

}
#endif


last_tuned_freq=freq;//save last tuned freqency
//g_last_freq_deviation_value=cur_freq_deviation;


return 1; //OK

}


/**************************************************
Function: BK1080_SearchByTune()

Parameter:
searched_freq:a buffer for search frequency list
Description:
search all the frequency.
Return:
the number of the searched frequency.
/**************************************************/
u8 BK1080_SearchByTune(u16* searched_freq)
{
u16 freq;
u8 i=0;

for(freq=MIN_FRE;freq<1080;freq++)
{
if(BK1080_ValidStop(freq,MIN_FRE))
{
searched_freq[i++]=freq;
}
}

return i;

}
#endif








Writing to TEA5767

Radio chip is controlled by writing 5 bytes one by one. During writing TEA5767 IC2 address is 0x60, reading – 0x61. Arduino IDE supports only 7 bit address ant last bite is assigned automatically, so in code 0x60 is used as address.

frequency=87.5; //starting frequency

frequencyB=4*(frequency*1000000+225000)/32768; //calculating PLL word

frequencyH=frequencyB>>8;

frequencyL=frequencyB&0XFF;

delay(100);

Wire.beginTransmission(0x60); //writing TEA5767

Wire.send(frequencyH);
Wire.send(frequencyL);
Wire.send(0xB0);
Wire.send(0x10);
Wire.send(0x00);
Wire.endTransmission();



Wire.requestFrom(0x60,5); //reading TEA5767

if (Wire.available())

{
for (int i=0; i<5; i++) {

buffer[i]= Wire.receive();
}

freq_available=(((buffer[0]&0x3F)<<8)+buffer[1])*32768/4-225000;

lcd.print("FM ");

lcd.print((freq_available/1000000));

frequencyH=((buffer[0]&0x3F));

frequencyL=buffer[1];

if (search_mode) {

if(buffer[0]&0x80) search_mode=0;

}

if (search_mode==1) lcd.print(" SCAN");
else {
lcd.print(" ");
}

lcd.setCursor(0, 1);

lcd.print("Level: ");
lcd.print((buffer[3]>>4));
lcd.print("/16 ");

if (buffer[2]&0x80) lcd.print("STEREO ");
else lcd.print("MONO ");

}

Re: I2C FM Radio на чипе BК1080

Сб июл 16, 2016 22:18:32

в мп3 декодере стоит данный чип. переключаясь на штатное аудио в машине слышно что 1080 звучит плоско, абсолютно нет низов, динамика никакая. это его норма или както обвесом лечится?
Вложения
HTB1YpVgGpXXXXaGXXXXq6xXFXXXS.jpg
(123.1 KiB) Скачиваний: 748
HTB1.MA2GXXXXXcKXFXXq6xXFXXXQ.jpg
(121.29 KiB) Скачиваний: 753
HTB1znRfGpXXXXaNXXXXq6xXFXXXA.jpg
(81.09 KiB) Скачиваний: 448

Re: I2C FM Radio на чипе почему то там CHIP_ADDR 0xc0 - може

Вт июл 19, 2016 15:49:03

почему то там CHIP_ADDR 0xc0 - может ошибка при копировании

У Вас даже в коде указано C0 - это сдвинутый влево на единицу семибитный адрес 60. Младший бит байта адреса используется для указателя запись/чтение. Такой адрес имеет оригинальный чип TEA5767 от NXP. Скорее всего BK1080 полный китайский аналог этого чипа. В даташите, кстати, не упоминается адрес, а то, что Вы приняли за адрес - это идентификатор м/сх.

Re: I2C FM Radio на чипе BК1080

Чт июл 23, 2020 16:21:12

Какой номинал катушки и конденсатора поставить для этой микросхемы чтобы расширить диапазон?
Ответить