/***************************************************************** * akc6951ライブラリ・へっだファイル * DSP MODULE:aitendo M6951(原典先にならいakc6951とした。) * * 原典先:諏訪工房さん * * 2018/7/11 N.Ishii * * <更新履歴> * 2018/8/8 * V1a:Fosc=4MHz→ 16MHzに変更 ******************************************************************/ char RegVal[28]; ////////////////////////// 定義 ////////////////////////////////////////// // AKC6951 setting value // get from read/write register(address from 0 to 13) #define power_on ((RegVal[0]&0x8)>>7) #define fm_en ((RegVal[0]&0x40)>>6) #define tune ((RegVal[0]&0x20)>>5) #define seek ((RegVal[0]&0x10)>>4) #define seekup ((RegVal[0]&0x08)>>3) #define mute ((RegVal[0]&0x04)>>2) #define amband ((RegVal[1]&0xf8)>>3) #define fmband (RegVal[1]&0x07) #define ref_32kmode ((RegVal[2]&0x40)>>6) #define mode3k ((RegVal[2]&0x20)>>5) #define chan ((RegVal[2]&0x001f)<<8|RegVal[3]) #define usr_chan_start (RegVal[4]) #define usr_chan_stop (RegVal[5]) #define volume ((RegVal[6]&0xFC)>>2) #define line ((RegVal[6]&0x02)>>1) #define phase_inv (RegVal[6]&0x01) #define De ((RegVal[7]&0x20)>>5) #define BBEN ((RegVal[7]&0x10)>>4) #define Stereo ((RegVal[7]&0x08)>>3) #define Mono ((RegVal[7]&0x04)>>2) #define bw (RegVal[7]&0x03) #define fm_cnr_th ((RegVal[8]&0xc0)>>6) #define am_cnr_th ((RegVal[8]&0x30)>>4) #define fd_th ((RegVal[8]&0x0c)>>2) #define streo_th (RegVal[8]&0x03) #define pd_adc_vol ((RegVal[9]&0x08)>>3) #define osc_en ((RegVal[9]&0x04)>>2) #define lv_en (RegVal[9]&0x01) #define space ((RegVal[11]&0x30)>>4) #define pd_adc ((RegVal[12]&0x80)>>7) #define pd_rx ((RegVal[12]&0x20)>>5) #define st_led ((RegVal[13]&0x40)>>6) #define vol_pre ((RegVal[13]&0x0c)>>2) // AKC6951 status value // get from read only register(address from 20 to 27) #define ST ((RegVal[20]&0x80)>>7) #define STC ((RegVal[20]&0x40)>>6) #define TUNED ((RegVal[20]&0x20)>>5) #define READ_CHAN ((RegVal[20]&0x1f)<<8)+(RegVal[21]&0xff) #define MODE3K_F ((RegVal[22]&0x80)>>7) #define CNR_AM (RegVal[22]&0x7f) #define ST_DEM ((RegVal[23]&0x80)>>7) #define CNR_FM (RegVal[23]&0x7f) #define PGALEVEL_RF ((RegVal[24]&0xe0)>>5) #define PGALEVEL_IF ((RegVal[24]&0x1c)>>2) #define FM_MODE ((RegVal[24]&0x02)>>1) #define LVMODE (RegVal[24]&0x01) #define VBAT (RegVal[25]&0x3f) #define FD_NUM RegVal[26] #define RSSI (RegVal[27]&0x7f) // AM Band (amband) #define LW 0b00000 // LW:150-285KHz, 3KHz Step #define MW1 0b00001 // MW1:520-1710KHz, 5KHz Step #define MW2 0b00010 // MW2:522-1620KHz, 9KHz Step (Japan) #define MW3 0b00011 // MW3:520-1710KHz, 10KHz Step #define MW4 0b10010 // MW4:520-1730KHz, 5KHz Step // FM Band (fmband) #define FM1 0b000 // FM1:87-108MHz #define FM2 0b001 // FM2:76-108MHz #define FM3 0b010 // FM3:70-93MHz #define FM4 0b011 // FM4:76-90MHz (Japan) #define FM5 0b100 // FM5:64-88MHz #define TV1 0b101 // TV1:56.25-91.75MHz (Low Channel) #define TV2 0b110 // TV2:174.75-222.25MHz (High Channel) // FM Band Width (bw) FM channel spacing #define BW150K 0 #define BW200K 1 #define BW50K 2 #define BW100K 3 // Setting of FM seek step #define STEP25K 0 #define STEP50K 1 #define STEP100K 2 #define STEP200K 3 // Setting volume of output #define VL0DB 0 #define VL3D5DB 1 #define VL7DB 2 #define VL10D5DB 3 // Register 0 #define PowerOn() RegVal[0]|=0x80 #define PowerOff() RegVal[0]&=0x7f #define FMmode() RegVal[0]|=0x40 #define AMmode() RegVal[0]&=0xbf #define TrigTune() RegVal[0]|=0x20 #define ResetTune() RegVal[0]&=0xdf #define TrigSeek() RegVal[0]|=0x10 #define ResetSeek() RegVal[0]&=0xef #define SeekUp() RegVal[0]|=0x08 #define SeekDown() RegVal[0]&=0xf7 #define MuteOn() RegVal[0]|=0x04 #define MuteOff() RegVal[0]&=0xfb // Register 1 #define AMBand(x) RegVal[1]=((RegVal[1]&0x07)|((x) << 3)) #define FMBand(x) RegVal[1]=((RegVal[1]&0xf8)|(x)) // Register 2,3 #define OSC32K() RegVal[2]|=0x40 #define OSC12M() RegVal[2]&=0xbf #define AM3KStep() RegVal[2]|=0x20 #define AM5KStep() RegVal[2]&=0xdf #define SetChannel(x) RegVal[2]=((RegVal[2]&0xe0)|(((x)>>8)&0x01f));RegVal[3]=((x)&0xff) // Register 4 #define UsrChanStart(x) RegVal[4]=(x) // Register 5 #define UsrChanStop(x) RegVal[5]=(x) // Register 6 #define Volume(x) RegVal[6]=((RegVal[6]&0x3)|((x)<<2)) #define LineInMode() RegVal[6]|=0x02 #define RadioMode() RegVal[6]&=0xfd #define SingleSPK() RegVal[6]|=1 #define DualSPK() RegVal[6]&=0xfe // Register 7 #define NormalOPR() RegVal[7]&=0x3f #define De50() RegVal[7]|=0x20 // Japan #define De75() RegVal[7]&=0xdf #define BaseBoostOn() RegVal[7]|=0x10 #define BaseBoostOff() RegVal[7]&=0xef #define AutoMode() RegVal[7]&=0xf3 #define StereoMode() RegVal[7]&=0xf3;RegVal[7]|=0x08 #define MonoMode() RegVal[7]&=0xf3;RegVal[7]|=0x04 #define FMBandWidth(x) RegVal[7]&=0xfc;RegVal[7]|=(x) // Register 8 don't set, use default #define FMCNR(x) RegVal[8]&=0x3f;RegVal[8]|=((x)<<6) #define AMCNR(x) RegVal[8]&=0xcf;RegVal[8]|=((x)<<4) #define FDTH(x) RegVal[8]&=0xf3;RegVal[8]|=((x)<<2) #define StereoTH(x) RegVal[8]&=0xfc;RegVal[8]|=(x) // Register 9 #define VolCtrlByReg() RegVal[9]&=0xf7 #define VolCtrlByI2C() RegVal[9]|=0x08 #define SelEXO() RegVal[9]&=0xfb #define SelXTL() RegVal[9]|=0x04 #define LowPowerOn() RegVal[9]|=1 #define LowPowerOff() RegVal[9]&=0xfe // Register 10 reserve // Register 11 #define FMSeekStep(x) RegVal[11]&=0xcf;RegVal[11]|=((x)<<4) // Register 12 #define ADCEnable() RegVal[12]&=0x7f #define ADCDisable() RegVal[12]|=0x80 #define RFEnable() RegVal[12]&=0xdf #define RFDisable() RegVal[12]|=0x20 // Register 13 #define TuneLED() RegVal[13]&=0xbf #define FMStereoLED() RegVal[13]|=0x40 #define VolOut(x) RegVal[13]&=0xf3;RegVal[13]|=((x)<<2) #define DEVADDR 0x20 // AKC6951 device address #define MW 0 // I2C master write #define MR 1 // I2C master read //------------------------------------------------------------------------------------------------ #define DEVADDR 0x20 // AKC6951 device address #define MW 0 // I2C master write #define MR 1 // I2C master read //------------------------------------------------------------------------------------------------ /// PICマスターハード定義 //#define _XTAL_FREQ 4000000 #define _XTAL_FREQ 16000000 // 180808 #define i2cStart() SSPCON2bits.SEN=1;while(SSPCON2bits.SEN) #define i2cStop() SSPCON2bits.PEN=1;while(SSPCON2bits.PEN) #define i2c_Ack() SSPCON2bits.ACKDT=0;SSPCON2bits.ACKEN=1;while(SSPCON2bits.ACKEN) #define i2c_NAck() SSPCON2bits.ACKDT=1;SSPCON2bits.ACKEN=1;while(SSPCON2bits.ACKEN) //------------------------------------------------------------------------------------------------- /*************************************************************** * function prototype ****************************************************************/ // AKC6951 register access char akc6951_read_byte(char); void akc6951_read_byte_block(char, char*, int); void akc6951_write_byte(char, char); void akc6951_write_byte_block(char, char*, int); // I2C handling void i2cintl(void); unsigned char i2c_Read( void ); void i2cTxData(char data); void delay_ms (int); // AKC6951 各種機能関数 void akc6951_initialize(void); int akc6951_FM_tunning(signed long); int akc6951_AM_tunning(signed long freq); void akc6951_VOL_setting(unsigned char vol); void akc6951_SelectSpeaker(char);