/******************************************************************************** * DSP RADIO BK1088 * 受信バンド:FM * 音量:vol (0x00-0x1F)に設定 * 受信周波数:inFreq に設定する * * BK_Simple プログラムは、放送大学 77.1MHz を受信設定するだけのプログラムです。 * BK1088の初期化、I2Cデータ書込み だけで、それ以外の機能は付加してありません。 * どのように、DSP モジュールをコントロールするのか理解しやすいでしょう。 * 出力する音量を制御するには、 Bk1088 の05 レジスタのLSB 5ビット(bit4 - bit0)に * 希望する値を書き込みます。 * 受信周波数を変更するには、 Bk1088 の 03 レジスタに * バンドの最少周波数とステップ周波数から計算した周波数セット値をセットします。 * セット後、同じ 03 レジスタ のMSB (TuneBit)を「1」にセットします。 * なお、回路図に示されている PushSW は、使用していません。 * * * PIC18F14K50 MPLAB X IDE with XC8 Ver1.32 * Copyright (c) 2014 iwamoto All Rights Reserved * * ここまで「初めてのPIC」サイト、岩本さんコメント * ------------------------------------------------------------------------------ * <オリジナルとの相違点> * (1) PICの、MCLRピンを、RA3(選局SW)ポートとして使っているが * 外部リセットピンとして使うように変更。 * (2) 選局SWは、RA5に変更した。 * (3) デバッグ用のLEDポート(RC2)を追加 * * 2016/5/31 N.Ishii ********************************************************************************/ #include //////////////////////////////////////////////////////////////////////// // vol : reg 05に設定する音量値 ( 0 - 31 ) // inFreq : reg 03に設定する値 ( freq - mimFreq ) / StepFreq // 77.1MHzの場合 ( 77.1x100 - 7600 ) / 10 //////////////////////////////////////////////////////////////////////// //#define vol 22 // 音量 0 - 31 #define vol 28 //#define inFreq (7710 - 7600) / 10 // 放送大学 11 //#define inFreq (8000 - 7600) / 10 // FM東京 40 //#define inFreq (8130 - 7600) / 10 // J-WAVE #define inFreq (8250 - 7600) / 10 // NHK-FM //#define inFreq (8470 - 7600) / 10 // FM横浜 87 //#define inFreq (9050 - 7600) / 10 // TBS-FM ///////////////////////// コンフィグレーション ///////////////////////// #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 HFOFST = OFF, MCLRE = ON, 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) #define LED LATCbits.LATC2 #define SW PORTAbits.RA5 ////////////////////////// プロトタイプ ////////////////////////////////// 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 UCONbits.USBEN = 0 ; // USBは使用しない PORTA = 0x00; PORTB = 0x00; PORTC = 0x00; // TRISA = 0xFF; TRISB = 0xFF; TRISC = 0xFF; //Port すべて入力 // TRISA = 0xFF; TRISB = 0xFF; TRISC = 0xFB; //RC2以外、すべて入力 TRISA = 0xFF; TRISB = 0xFF; TRISC = 0; ANSEL = 0x00; ANSELH = 0x00; //すべてデジタル LED = 1; // Green LED ON delay_ms(1000); LED = 0; // Green LED OFF // 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); // 送信終了待ち }