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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
FUZZY_
Потрогал лапой паяльник
Сообщения: 390
Зарегистрирован: Чт сен 24, 2009 17:22:51
Откуда: UK

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

Сообщение FUZZY_ »

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

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

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

Дока в файле.
Вложения
BK1080.pdf
(1.24 МБ) 2635 скачиваний
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

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

Сообщение DarkWolf »

Могу ошибаться, но в пункте 6.2.2 указан адрес 0х80
FUZZY_
Потрогал лапой паяльник
Сообщения: 390
Зарегистрирован: Чт сен 24, 2009 17:22:51
Откуда: UK

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

Сообщение FUZZY_ »

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 ");

}
volverrr
Родился
Сообщения: 9
Зарегистрирован: Вт янв 14, 2014 23:50:20

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

Сообщение volverrr »

в мп3 декодере стоит данный чип. переключаясь на штатное аудио в машине слышно что 1080 звучит плоско, абсолютно нет низов, динамика никакая. это его норма или както обвесом лечится?
Вложения
HTB1YpVgGpXXXXaGXXXXq6xXFXXXS.jpg
(123.1 КБ) 843 скачивания
HTB1.MA2GXXXXXcKXFXXq6xXFXXXQ.jpg
(121.29 КБ) 835 скачиваний
HTB1znRfGpXXXXaNXXXXq6xXFXXXA.jpg
(81.09 КБ) 537 скачиваний
Аватара пользователя
Halex
Грызет канифоль
Сообщения: 281
Зарегистрирован: Пт ноя 15, 2013 20:58:23

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

Сообщение Halex »

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

У Вас даже в коде указано C0 - это сдвинутый влево на единицу семибитный адрес 60. Младший бит байта адреса используется для указателя запись/чтение. Такой адрес имеет оригинальный чип TEA5767 от NXP. Скорее всего BK1080 полный китайский аналог этого чипа. В даташите, кстати, не упоминается адрес, а то, что Вы приняли за адрес - это идентификатор м/сх.
Аватара пользователя
djoi
Прорезались зубы
Сообщения: 213
Зарегистрирован: Вс сен 23, 2018 18:08:12
Откуда: Няндома

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

Сообщение djoi »

Какой номинал катушки и конденсатора поставить для этой микросхемы чтобы расширить диапазон?
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

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

Сообщение shonty »

Адреса записи 0xE0 и 0x80

Изображение
Ответить

Вернуться в «Разные вопросы по МК»