- 追加された行はこの色です。
- 削除された行はこの色です。
- BK1088 へ行く。
#author("2017-12-03T23:09:43+09:00","","")
#author("2017-12-03T23:09:54+09:00","","")
*BK1088
-ピン配置
#ref(BK1088_01.png,nolink) #ref(BK1088_02.png,nolink)
#ref(BK1088_01.png,nolink)
#ref(BK1088_02.png,nolink)
-レジスタ
データの並び順が特殊で I2C EEPROM とは異なる。
具体的には、R/W ビットが2バイト目にある。操作対象のRegADDを1ビット左にシフトし、LSBにR/Wビットを付加して送信。
<pre>
EEPROM | Start | ChipADD + W | ADD | ADD | DATA | Stop |
BK1088 | Start | ChipADD | RegADD + W | DATA | DATA | Stop |
</pre>
-サンプルソース
<pre>
/*********************************************************************
* DSP RADIO BK1088
* 受信バンド:FM
* 音量:vol (0x00-0x1F)に設定
* 受信周波数:inFreq に設定する
* PIC18F14K50 MPLAB X IDE with XC8 Ver1.32
* Copyright (c) 2014 iwamoto All Rights Reserved
* *******************************************************************/
#include <xc.h>
//********************************************************************
// vol : reg 05に設定する音量値 ( 0 - 31 )
// inFreq : reg 03に設定する値 ( freq - mimFreq ) / StepFreq
// 77.1MHzの場合 ( 77.1x100 - 7600 ) / 10
//*********************************************************************
#define vol 22 // 音量 0 - 31
#define inFreq (7710 - 7600) / 10 // 放送大学 11
//#define inFreq (8000 - 7600) / 10 // FM東京 40
//#define inFreq (8470 - 7600) / 10 // FM横浜 87
//******************* コンフィグレーション ****************************
#pragma config FOSC = IRC // 内部クロック
#pragma config USBDIV = OFF, CPUDIV = NOCLKDIV
#pragma config IESO = OFF, FCMEN = OFF, PLLEN = ON
#pragma config BORV = 30, BOREN = OFF, PWRTEN = OFF
#pragma config WDTPS = 32768, WDTEN = OFF
#pragma config MCLRE = OFF, HFOFST = OFF, XINST = OFF
#pragma config BBSIZ = OFF, LVP = OFF, STVREN = ON
#pragma config CP1 = OFF, CP0 = OFF, CPD = OFF, CPB = OFF
#pragma config WRT1 = OFF, WRT0 = OFF, WRTB = OFF, WRTC = OFF
#pragma config EBTR1 = OFF, EBTR0 = OFF, EBTRB = OFF
//
//******************* 定義 *******************************************
#define _XTAL_FREQ 4000000
#define i2cStart() SSPCON2bits.SEN=1;while(SSPCON2bits.SEN)
#define i2cStop() SSPCON2bits.PEN=1;while(SSPCON2bits.PEN)
//******************* プロトタイプ ***********************************
void delay_ms (int ms);
void i2cintl(void);
void Bk1088_Write(unsigned int, unsigned int);
void i2cTxData(char data);
// ******************* main ******************************************
void main() {
OSCCON = 0b01010010; // 内部クロック4Mhz
PORTA = 0x00; PORTB = 0x00; PORTC = 0x00;
TRISA = 0xFF; TRISB = 0xFF; TRISC = 0xFF; //Port すべて入力
ANSEL = 0x00; ANSELH = 0x00; //すべてデジタル
// I2C初期化 SCLK=100KHz ------------------------------------------
i2cintl();
// DSP初期化 受信バンド:FM 音量:1A -----------------------------
Bk1088_Write(0x02, 0x6281); // power config
Bk1088_Write(0x03, inFreq); // channel
Bk1088_Write(0x05, 0x3740 + vol); // system config2
Bk1088_Write(0x06, 0x0930); // system config3
Bk1088_Write(0x07, 0x0901); // test1
Bk1088_Write(0x14, 0x878E); // boot config 5
Bk1088_Write(0x1A, 0x0001); // boot config 11
Bk1088_Write(0x1B, 0x48D4); // analog config 1
Bk1088_Write(0x1D, 0x0200); // analog config 3
Bk1088_Write(0x1E, 0x80AA); //
Bk1088_Write(0x20, 0x0EF7); //
Bk1088_Write(0x26, 0x8400); //
Bk1088_Write(0x03, inFreq | 0x8000); // TUNEビットを立てる
delay_ms(500); // 安定するまで遅延
Bk1088_Write(0x02,0x0281); // mute off 音を出す
while (1);
}
//********************************************************************
// mS 単位の遅延
//********************************************************************
void delay_ms (int ms){
while(ms-- > 0)__delay_ms(1);
}
//********************************************************************
// SSPを I2C Master mode、SCL 100kHz @ 4MHz に設定
//********************************************************************
void i2cintl(void){
SSPCON1 = 0b00001000; // I2C Master modeにする
SSPCON2 = 0x00; // PowerOn初期値にする
SSPSTAT = 0b10000000; // スルーレート制御はOff
SSPADD = 9; // クロックの設定 100k@4MHz
SSPCON1bits.SSPEN = 1; // SSP 有効にする bit5
}
//********************************************************************
// Bk1088_のレジスタに書き込む
//********************************************************************
void Bk1088_Write(unsigned int add, unsigned int data) {
i2cStart(); // 送信開始
i2cTxData(0x80); // Chipアドレス送信
i2cTxData(add << 1); // RegAdd + Write
i2cTxData(data >> 8); // Register data MSB
i2cTxData(data & 0xff); // Register data LSB
i2cStop(); // 送信終了
__delay_us(500);
}
//********************************************************************
// SSPBUF に1文字保存し送信終了を待つ
//********************************************************************
void i2cTxData(char data){
PIR1bits.SSPIF = 0; // 終了フラグクリア
SSPBUF = data; // データセット
while(!PIR1bits.SSPIF); // 送信終了待ち
}
</pre>