/* * File: main.c * Author: JH7UBC Keiji Hata * PIC12F1822 Si5351A SDR * 3.5MHz/7MHz * Created on 2019/02/15 */ #include #include #include // CONFIG1 #pragma config FOSC = INTOSC #pragma config WDTE = OFF #pragma config PWRTE = ON #pragma config MCLRE = OFF #pragma config CP = OFF #pragma config CPD = OFF #pragma config BOREN = ON #pragma config CLKOUTEN = OFF #pragma config IESO = OFF #pragma config FCMEN = OFF // CONFIG2 #pragma config WRT = OFF #pragma config PLLEN = ON #pragma config STVREN = ON #pragma config BORV = HI #pragma config LVP = OFF #define _XTAL_FREQ 32000000 #define SW RA3 #define LED RA0 /* Si5351A関係定義*/ #define Si5351_ADDR 0xC0 //60<<1 #define MSNA_ADDR 26 #define MS0_ADDR 42 #define MS1_ADDR 50 #define CLK0_CTRL 16 #define CLK1_CTRL 17 #define CLK2_CTRL 18 #define OUTPUT_CTRL 3 #define PLL_RESET 177 #define XTAL_LC 183 #define CLK0_PHOFF 165 #define CLK1_PHOFF 166 unsigned long P1; unsigned long P2; unsigned long P3; unsigned char PHASE; unsigned char val; //RA3の値 unsigned char val_old; //RA3の前の値 unsigned char flag=0; //7MHz:flag=0 3.5MHz:flag=1 /* I2C 初期化*/ void I2C_init(){ SSP1CON1 = 0x28; //SSPEN = 1,I2C Master Mode SSP1STATbits.SMP = 1; //標準速度モード(100KHz) SSP1ADD = 0x4F; //Fosc/(4*Clock)-1 Clock=100kHz,Fosc=32MHz } /* スタートコンディション */ void I2C_start(){ SEN = 1; while(SEN); } /* ストップコンディション */ void I2C_stop(){ SSP1IF = 0; PEN = 1; while(PEN); SSP1IF = 0; } /* I2Cに1byte送信 */ void I2C_write(unsigned char dat){ SSP1IF = 0; SSP1BUF = dat; while(!SSP1IF); } /* Si5351A関係関数*/ /* Si5351Aのレジスタにデータ送信*/ void Si5351_write(unsigned char Reg , unsigned char Data){ I2C_start(); I2C_write(Si5351_ADDR); I2C_write(Reg); I2C_write(Data); I2C_stop(); } /* Si5351A初期化 */ void Si5351_init(){ Si5351_write(OUTPUT_CTRL,0xFF); //Disable oll output Si5351_write(CLK0_CTRL,0x80); //CLOCK0 power down Si5351_write(CLK1_CTRL,0x80); //CLOCK1 power down Si5351_write(CLK2_CTRL,0x80); //CLOCK2 power down Si5351_write(XTAL_LC,0x92); //Crystal Load Capasitance=8pF Si5351_write(PLL_RESET,0xA0); //Reset PLLA and PLLB Si5351_write(CLK0_CTRL,0b01001110); //CLOCK0 Power up 6mA,Sorce PLLA Si5351_write(CLK1_CTRL,0b01001110); //CLOCK1 Power up 6mA,Sorce PLLA Si5351_write(OUTPUT_CTRL,0b11111100); //Enable CLOCK0 & CLOCK1 } //レジスタにパラメータP1,P2,P3を書き込む。 void Parameter_write(unsigned char REG_ADDR,unsigned long Pa1,unsigned long Pa2,unsigned long Pa3){ Si5351_write(REG_ADDR + 0,(Pa3 & 0x0000FF00) >> 8); Si5351_write(REG_ADDR + 1,(Pa3 & 0x000000FF)); Si5351_write(REG_ADDR + 2,(Pa1 & 0x00030000) >> 16); Si5351_write(REG_ADDR + 3,(Pa1 & 0x0000FF00) >> 8); Si5351_write(REG_ADDR + 4,(Pa1 & 0x000000FF)); Si5351_write(REG_ADDR + 5,((Pa3 & 0x000F0000) >> 12) | ((Pa2 & 0X000F0000) >> 16)); Si5351_write(REG_ADDR + 6,(Pa2 & 0x0000FF00) >> 8); Si5351_write(REG_ADDR + 7,(Pa2 & 0x000000FF)); } void PLLA_set(unsigned char bd){ if(bd == 0){ P1 = 3072; //7MHz }else{ P1 = 1536; //3.5MHz } P2 = 0; P3 = 1; Parameter_write(MSNA_ADDR,P1,P2,P3); } void MS0_set(unsigned char bd){ if(bd == 0){ P1 = 12215; P2 = 78920; }else{ P1 = 13961; P2 = 273216; } P3 = 1000000; Parameter_write(MS0_ADDR,P1,P2,P3); Si5351_write(CLK0_PHOFF,0); //CLK0 delay 0 } void MS1_set(unsigned char bd){ if(bd == 0){ P1 = 12215; P2 = 78920; PHASE = 93; }else{ P1 = 13961; P2 = 273216; PHASE = 127; } P3 = 1000000; Parameter_write(MS1_ADDR,P1,P2,P3); Si5351_write(CLK1_PHOFF,PHASE); //CLK1 delay T/4 (90degree) } void Band(unsigned char bnd){ PLLA_set(bnd); MS0_set(bnd); MS1_set(bnd); Si5351_write(PLL_RESET,0xA0); //Reset PLLA and PLLB } void main() { OSCCON = 0b01110000 ; // 内部クロック8MHz ANSELA = 0b00000000 ; // アナログは使用しない TRISA = 0b00001110 ; // RA1,RA2,RA3は入力、他は出力 OPTION_REGbits.nWPUEN = 0;//week pull up有効 WPUA = 0b00001110; // RA1,RA2,RA3 pull up PORTA = 0b00000000 ; // 出力ピンの初期化 I2C_init(); Si5351_init(); val = SW; //SWの値 val_old = val; Band(flag); while(1){ val = SW; if((val == 0)&&(val_old == 1)){ flag = 1 - flag; //flagを反転させる LED = flag; __delay_ms(10); Band(flag); }else if((val == 1)&&(val_old == 0)){ __delay_ms(10); } val_old = val; } }