#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>

トップ   差分 履歴 リロード   一覧 検索 最終更新   ヘルプ   最終更新のRSS