/** * @mainpage PU2CLR KT0915 Arduino Library * @brief PU2CLR KT0915 Arduino Library implementation.
* @details This is an Arduino library for the KT0915, BROADCAST RECEIVER.
* @details It works with I2C protocol and can provide an easier interface for controlling the KT0915 device.
* @details This library was built based on KT0915 Datasheet from KTMicro (Monolithic Digital FM/MW/SW/LW Receiver Radio-on-a-Chip TM). * @details Others sources help the author to build this library. They are referenced in the documentation for this library on: https://github.com/pu2clr/KT0915 * @details This library uses the I2C protocols to read and write KT0915 registers. In this context, registers are memory position into the device. * @details The KT0915 is a full band AM (LW, MW and SW) and FM DSP receiver that can provide you a easy way to build a high quality radio with low cost. * @details This device, will surprise hobbyists and experimenters with its simplicity. * * This library can be freely distributed using the MIT Free Software model. * * Copyright (c) 2020 Ricardo Lima Caratti. * Contact: pu2clr@gmail.com */ /* #include #include */ #include "main.h" #include "i2c_sw.h" #define KT0915_I2C_ADDRESS 0x6A //arduino:0x35 It is needed to check it when the KT0915 device arrives. #define MODE_FM 0 #define MODE_AM 1 #define TURN_ON 1 #define TURN_OFF 0 #define ENABLE_ON 1 #define ENABLE_OFF 0 #define DE_EMPHASIS_75 0 #define DE_EMPHASIS_50 1 #define OSCILLATOR_32KHZ 0 // 32.768KHz #define OSCILLATOR_6_5MHZ 1 // 6.5MHz #define OSCILLATOR_7_6MHZ 2 // 7.6MHz #define OSCILLATOR_12MHZ 3 // 12MHz #define OSCILLATOR_13MHZ 4 // 13MHz #define OSCILLATOR_15_2MHZ 5 // 15.2MHz #define OSCILLATOR_19_2MHZ 6 // 19.2MHz #define OSCILLATOR_24MHZ 7 // 24MHz #define OSCILLATOR_26MHZ 8 // 26MHz #define OSCILLATOR_38KHz 9 // 38KHz #define REF_CLOCK_ENABLE 1 // Reference Clock #define REF_CLOCK_DISABLE 0 // Crystal Clock #define DIAL_MODE_ON 1 // Mechanical tuning (Via 100K resistor) #define DIAL_MODE_OFF 0 // MCU (Arduino) tuning #define REG_CHIP_ID 0x01 #define REG_SEEK 0x02 #define REG_TUNE 0x03 #define REG_VOLUME 0x04 #define REG_DSPCFGA 0x05 #define REG_LOCFGA 0x0A #define REG_LOCFGC 0x0C #define REG_RXCFG 0x0F #define REG_STATUSA 0x12 #define REG_STATUSB 0x13 #define REG_STATUSC 0x14 #define REG_AMSYSCFG 0x16 #define REG_AMCHAN 0x17 #define REG_AMCALI 0x18 #define REG_GPIOCFG 0x1D #define REG_AMDSP 0x22 #define REG_AMSTATUSA 0x24 #define REG_AMSTATUSB 0x25 #define REG_SOFTMUTE 0x2E #define REG_USERSTARTCH 0x2F #define REG_USERGUARD 0x30 #define REG_USERCHANNUM 0x31 #define REG_AMCFG 0x33 #define REG_AMCFG2 0x34 #define REG_AFC 0x3C //typedef uint8_t bool; /** * @defgroup GA01 Union, Structure and Defined Data Types * @brief KT0915 Defined Data Types * @details Defined Data Types is a way to represent the KT0915 registers information * @details Some information appears to be inaccurate due to translation problems from Chinese to English. * @details The information shown here was extracted from Datasheet: * @details KT0915 stereo FM / TV / MW / SW / LW digital tuning radio documentation. * @details Other information seems incomplete even in the original Chinese Datasheet. * @details For example: Reg 10 (0x0A). There is no information about it. The Reg11 and 12 seem wrong */ /** * @ingroup GA01 * @brief 3.10.1. CHIP ID (Address 0x01) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 15. */ typedef union { uint16_t chip_id; char chip_id_ascii[2]; } kt09xx_chip_id; /** * @ingroup GA01 * @brief 3.10.2. SEEK (Address 0x02) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 15. */ typedef union { struct { uint8_t DMUTEL : 1; //!< Left Channel Mute Control; 0 = Left channel mute enable; 1 = Left channel mute disable uint8_t DMUTER : 1; //!< Right Channel Mute Control; 0 = Left channel mute enable; 1 = Left channel mute disable uint8_t FMSPACE : 2; //!< FM Channel Spacing; 00 = 200KHz; 01 = 100KHz; 10 = 50KHz uint16_t RESERVED : 11; //!< Reserved } refinied; uint16_t raw; } kt09xx_seek; /** * @ingroup GA01 * @brief 3.10.3. TUNE (Address 0x03) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 15. */ typedef union { struct { uint16_t FMCHAN : 12; //!< FM Channel Setting FMCHAN<11:0>=Frequency (KHz) / 50KHz. For example, if desired channel is 86MHz, then the FMCHAN<11:0> should be 0x06B8. uint8_t RESERVED : 3; //!< Reserved uint8_t FMTUNE : 1; //!< FM Tune Enable; 0 = Normal operation 1 = Start to tune to desired FM channel } refined; uint16_t raw; } kt09xx_tune; /** * @ingroup GA01 * @brief 3.10.4. VOLUME (Address 0x04) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 15/16. */ typedef union { struct { uint8_t RESERVED1 : 4; //!< Reserved uint8_t POP : 2; //!< Audio DAC Anti - pop Configuration00 : 100uF AC - coupling capacitor 01 : 10 : 11 : Reserved 60uF AC - coupling capacitor 20uF AC - coupling capacitor 10uF AC - coupling capacitor. uint8_t RESERVED2 : 2; //!< Reserved uint8_t BASS : 2; //!< Bass Boost Effect Mode Selection; 00 = Disable; 01 = Low ; 10 = Med; 11 = High. uint8_t RESERVED3 : 3; //!< Reserved uint8_t DMUTE : 1; //!< Mute Disable; 0 = Mute enable; 1 = Mute disable. uint8_t AMDSMUTE : 1; //!< AM Softmute Disable; 0 = AM softmute enable; 1 = AM softmute disable. uint8_t FMDSMUTE : 1; //!< AM Softmute Disable; 0 = FM softmute enable; 1 = FM softmute disable. } refined; uint16_t raw; } kt09xx_volume; /** * @ingroup GA01 * @brief 3.10.5. DSPCFGA (Address 0x05) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 16/17. */ typedef union { struct { uint8_t RESERVED1 : 5; //!< Reserved uint8_t DBLND : 1; //!< Blend disable; 0 = Blend enable; 1 = Blend disable uint8_t RESERVED2 : 2; //!< Reserved uint8_t BLNDADJ : 2; //! Stereo/Mono Blend; Level Adjustment 00 = High; 01 = Highest 10; = Lowest 11 = Low uint8_t RESERVED3 : 1; //!< Reserved uint8_t DE : 1; //!< De-emphasis Time Constant Selection. 0 = 75us; 1 = 50us. uint8_t RESERVED4 : 3; //!< Reserved uint8_t MONO : 1; //!< Mono Select; 0 = Stereo; 1 = Force mono } refined; uint16_t raw; } kt09xx_dspcfga; /** * @ingroup GA01 * @brief 3.10.6. LOCFGA (Address 0x0A) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 17. */ typedef union { struct { uint8_t RESERVED1 : 8; //!< Reserved uint8_t FMAFCD : 1; //!< AFC Disable Control Bit; 0 = AFC enable; 1 = AFC disable. uint8_t RESERVED2 : 7; //!< Reserved } refined; uint16_t raw; } kt09xx_locfga; // LOCFGA /** * @ingroup GA01 * @brief 3.10.7. LOCFGC (Address 0x0C) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 17. */ typedef union { struct { uint8_t RESERVED1 : 3; //!< Reserved uint8_t CAMPUSBAND_EN : 1; //!< Campus FM Band Enable; 0 = User can only use 64MHz ~110MHz; 1 = User can extend the FM band down to 32MHz uint16_t RESERVED2 : 12; //!< Reserved } refined; uint16_t raw; } kt09xx_locfgc; // LOCFGC /** * @ingroup GA01 * @brief 3.10.8. RXCFG (Address 0x0F) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 17. */ typedef union { struct { uint8_t VOLUME : 5; //!< Volume Control 11111 = 0dB 11110 = -2dB 11101 = -4dB .... 00010 = -58dB 00001 = -60dB 00000 = Mute uint8_t RESERVED1 : 7; //!< Campus FM Band Enable; 0 = User can only use 64MHz ~110MHz; 1 = User can extend the FM band down to 32MHz uint8_t STDBY : 1; //!< Standby Mode Enable. 0 = Disable; 1 = Enable uint8_t RESERVED2 : 3; //!< Reserved } refined; uint16_t raw; } kt09xx_rxcfg; // RXCFG /** * @ingroup GA01 * @brief 3.10.19. STATUSA (Address 0x12) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 18. */ typedef union { struct { uint8_t RESERVED1 : 3; //!< Reserved uint8_t FMRSSI : 5; //!< FM RSSI Value Indicator; RSSI starts from -100dBm and step is 3dB namely; RSSI(dBm) = -100 + FMRSSI<4:0> *3dB uint8_t ST : 2; //!< Stereo Indicator; 11 = Stereo state; Other = Mono state uint8_t LO_LOCK : 1; //!< LO Synthesizer Ready Indicator; 0 = Not ready; 1 = Ready uint8_t PLL_LOCK : 1; //!< System PLL Ready Indicator; 0 = Not ready; 1 = System PLL ready uint8_t RESERVED2 : 2; //!< Reserved uint8_t STC : 1; //!< Seek/Tune Complete; 0 = Not Complete; 1 = Complete; Every time the Seek/tune process begins, the STC bit will clear to zero by hardware. uint8_t XTAL_OK : 1; //!< Crystal ready indictor; 0 = Not ready; 1 = Crystal is ok } refined; uint16_t raw; } kt09xx_statusa; // STATUSA /** * @ingroup GA01 * @brief 3.10.10. STATUSB (Address 0x13) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 18. */ typedef union { struct { uint8_t RESERVED1 : 1; //!< Reserved uint16_t RDCHAN : 15; //!< Current Channel Indicator } refined; uint16_t raw; } kt09xx_statusb; // STATUSB /** * @ingroup GA01 * @brief 3.10.11. STATUSC (Address 0x14) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 18/19. */ typedef union { struct { uint8_t RESERVED1 : 6; //!< Reserved uint8_t FMSNR : 7; //!< Channel SNR value is FM mode.; 0000000 = Minimum SNR; 1111111 = Maximum SNR uint8_t CHIPRDY : 1; //!< Chip Ready Indicator; 0 = Chip is not ready; 1 = Chip is ready, calibration done uint8_t RESERVED2 : 1; //!< Reserved uint8_t PWSTATUS : 1; //!< Power Status Indicator; 0 = Power not ready; 1 = Power ready } refined; uint16_t raw; } kt09xx_statusc; // STATUSC /** * @ingroup GA01 * @brief 3.10.12. AMSYSCFG (Address 0x16) * @details The table below shows REFCLK possibvle values * * Crystal type table * | Dec | binary | Description | defined constant | * | -- | ------ | ----------- | --------------- | * | 0 | 0000 | 32.768KHz | OSCILLATOR_32KHZ | * | 1 | 0001 | 6.5MHz | OSCILLATOR_6_5MHZ | * | 2 | 0010 | 7.6MHz | OSCILLATOR_7_6MHZ | * | 3 | 0011 | 12MHz | OSCILLATOR_12MHZ | * | 4 | 0100 | 13MHz | OSCILLATOR_13MHZ | * | 5 | 0101 | 15.2MHz | OSCILLATOR_15_2MHZ | * | 6 | 0110 | 19.2MHz | OSCILLATOR_19_2MHZ | * | 7 | 0111 | 24MHz | OSCILLATOR_24MHZ | * | 8 | 1000 | 26MHz | OSCILLATOR_26MHZ | * | 9 | 1001 | ?? 38KHz ?? | OSCILLATOR_38KHz | * * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 19. * */ typedef union { struct { uint8_t AMAFCD : 1; //!< AFC Disable Control in AM Mode; 0 = Enable; 1 = Disable uint8_t RESERVED1 : 5; //!< Reserved uint8_t AU_GAIN : 2; //!< Audio Gain Selection; 01 = 6dB; 00 = 3dB; 11 = 0dB; 10 = -3dB uint8_t REFCLK : 4; //!< See Crystal type table uint8_t RCLK_EN : 1; //!< Reference Clock Enable; 0 = Crystal; 1 = Reference clock uint8_t RESERVED2 : 1; //!< Reserved uint8_t USERBAND : 1; //!< User Definition Band Enable; 0 = Use internal defined band; 1 = Use user-defined band which is specified in USER_START_CHAN<14:0>, USER_GUARD<8:0> and USER_CHAN_NUM<11:0> uint8_t AM_FM : 1; //!< AM/FM Mode Control; 0 = FM mode; 1 = AM mode } refined; uint16_t raw; } kt09xx_amsyscfg; // AMSYSCFG /** * @ingroup GA01 * @brief 3.10.13. AMCHAN (Address 0x17) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 20. */ typedef union { struct { uint16_t AMCHAN : 15; //!< AM Channel Setting; AMCHAN<14:0> = Frequency(in KHz) uint8_t AMTUNE : 1; //!< AM Tune Enable } refined; uint16_t raw; } kt09xx_amchan; // AMCHAN /** * @ingroup GA01 * @brief 3.10.14. AMCALI (Address 0x18) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 20. */ typedef union { struct { uint16_t CAP_INDEX : 14; //!< On Chip Capacitor for AM Antenna Calibration; 0x0000 = Minimum capacitor; 0x3FFF = Maximum capacitor uint8_t RESERVED1 : 2; //!< Reserved } refined; uint16_t raw; } kt09xx_amcali; // AMCALI /** * @ingroup GA01 * @brief 3.10.15. GPIOCFG (Address 0x1D) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 20. */ typedef union { struct { uint8_t GPIO1 : 2; //!< CH Pin Mode Selection; 00 = High Z; 01 = Key controlled channel increase / decrease; 10 = Dial controlled channel increase / decrease; 11 = Reserved uint8_t GPIO2 : 2; //!< VOL Pin Mode Selection; 00 = High Z; 01 = Key controlled volume increase/decrease; 10 = Dial controlled volume increase/decrease; 11 = Reserved uint16_t RESERVED : 12; //!< Reserved } refined; uint16_t raw; } kt09xx_gpiocfg; // GPIOCFG /** * @ingroup GA01 * @brief 3.10.16. AMDSP (Address 0x22) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); pages 20 and 21. */ typedef union { struct { uint8_t RESERVED1 : 3; //!< Reserved uint8_t INV_LEFT_AUDIO : 1; //!< Left channel inverse control; 0 = Normal operation; 1 = Inversing the left channel audio signal uint8_t RESERVED2 : 2; //!< Reserved uint8_t AM_BW : 2; //!< AM Channel Bandwidth Selection; 00 = 2KHz; 01 = 2KHz; 10 = 4KHz; 11 = 6KHz uint8_t RESERVED3 : 8; //!< Reserved } refined; uint16_t raw; } kt09xx_amdsp; // AMDSP /** * @ingroup GA01 * @brief 3.10.17. AMSTATUSA (Address 0x24) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 21. */ typedef union { struct { uint8_t RESERVED1 : 8; //!< Reserved uint8_t AMRSSI : 5; //!< AM Channel RSSI; AM RSSI starts from -90dBm and step is 3dB, namely AMRSSI(dBm) = -90 + AMRSSI<4:0> *3dB uint8_t RESERVED2 : 3; //!< Reserved } refined; uint16_t raw; } kt09xx_amdstatusa; // AMSTATUSA /** * @ingroup GA01 * @brief 3.10.18. AMSTATUSB (Address 0x25) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 21. */ typedef union { struct { uint8_t AM_AFCDELTAF : 8; //!< Signed binary, max 16KHz , min -16KHz, step is 128Hz. uint8_t RESERVED : 8; //!< Reserved } refined; uint16_t raw; } kt09xx_amdstatusb; // AMSTATUSB /** * @ingroup GA01 * @brief 3.10.19. SOFTMUTE (Address 0x2Eh) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 21. */ typedef union { struct { uint8_t FM_SMTH : 3; //!< FM Softmute Start Threshold; 000 = Lowest ... 111 = Highest uint8_t SMMD : 1; //!< Softmute Mode Selection; 0 = RSSI mode; 1 = SNR mode (only effective in FM mode) uint8_t VOLUMET : 5; //!< Softmute target Volume. 0 = RSSI; 1 = SNR mode (only effective in FM mode) uint8_t AM_SMTH : 3; //!< AM Softmute Start Level. 000 = Lowest ... 111 = Highest uint8_t SMUTER : 2; //!< Softmute Attack/Recover Rate; 00 = Slowest; 01 = Fastest (RSSI mode only); 10 = Fast; 11 = Slow uint8_t SMUTEA : 2; //!< Softmute Attenuation; 00 = Strong; 01 = Strongest; 10 = Weak; 11 = Weakest } refined; uint16_t raw; } kt09xx_softmute; // SOFTMUTE /** * @ingroup GA01 * @brief 3.10.20. USERSTARTCH (Address 0x2F) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 22. */ typedef union { struct { uint16_t USER_START_CHAN : 15; //!< User band start channel, only effect when USERBAND=1. See section 3.7.3. of the Datasheet uint8_t RESERVED : 1; //!< Reserved } refined; uint16_t raw; } kt09xx_userstartch; // USERSTARTCH /** * @ingroup GA01 * @brief 3.10.21. USERGUARD (Address 0x30) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio on a Chip(TM); page 22. */ typedef union { struct { uint16_t USER_GUARD : 9; //!< User band guard number, only effective when USERBAND=1. See section 3.7.2. uint8_t RESERVED : 7; //!< Reserved } refined; uint16_t raw; } kt09xx_userguard; // USERGUARD /** * @ingroup GA01 * @brief 3.10.22. USERCHANNUM (Address 0x31) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio-on-a-Chip(TM); page 22. */ typedef union { struct { uint16_t USER_CHAN_NUM : 12; //!< User band channel number, only effective when USERBAND=1. See section 3.7.3. uint8_t RESERVED : 4; //!< Reserved } refined; uint16_t raw; } kt09xx_userchannum; // USERCHANNUM /** * @ingroup GA01 * @brief 3.10.23. AMCFG (Address 0x33) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio-on-a-Chip(TM); page 23. */ typedef union { struct { uint8_t RESERVED1 : 5; //!< Reserved uint8_t KEY_MODE : 2; //!< Working mode selection when key mode is selected. 00 = Working mode A; 01 = Working mode B Others = Reserved; For detailed information about working mode A and working mode B, please refer to section 3.7.1. uint8_t RESERVED2 : 7; //!< Reserved uint8_t AMSPACE : 2; //!< AM Channel Space Selection; 00 = 1KHz; 01 = 9KHz; 10 = 10KHz; 11 = 10KHz. } refined; uint16_t raw; } kt09xx_amcfg; // AMCFG /** * @ingroup GA01 * @brief 3.10.24. AMCFG2 (Address 0x34h) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio-on-a-Chip(TM); page 23. */ typedef union { struct { uint8_t RESERVED1 : 1; //!< Reserved uint8_t TIME2 : 3; //!< 000 = Fastest...... 111 = Slowest uint8_t TIME1 : 2; //!< 00 = Shortest...... 11 = Longest uint16_t RESERVED2 : 10; //!< Reserved } refined; uint16_t raw; } kt09xx_amcfg2; // AMCFG2 /** * @ingroup GA01 * @brief 3.10.25. AFC (Address 0x3Ch) * @see KT0915; Monolithic Digital FM/MW/SW/LW Receiver Radio-on-a-Chip(TM); page 23. */ typedef union { struct { uint8_t FM_AFC_DELTAF : 8; //!< Frequency difference between CHAN and received signal, calculated by AFC block in two’s complement format. Range is - 127 to +127. Unit is KHz. This register is valid when STC=1 uint8_t RESERVED1 : 8; //!< Reserved } refined; uint16_t raw; } kt09xx_afc; // AFC /** * @ingroup GA01 * @brief Converts 16 bits word to two bytes */ typedef union { uint16_t refined; uint16_t raw; } word16_to_bytes; void KT0915_setRegister(int reg, uint16_t parameter); uint16_t KT0915_getRegister(int reg); uint16_t KT0915_getDeviceId(void); void KT0915_enable(uint8_t on_off); // void KT0915_setI2CBusAddress(int N_deviceAddress); //TODO CHECK void KT0915_setReferenceClockType(uint8_t crystal, uint8_t ref_clock); uint8_t KT0915_isCrystalReady(void); void KT0915_setup(uint8_t oscillator_type, uint8_t ref_clock); void KT0915_setTuneDialModeOn(uint32_t minimu_frequency, uint32_t maximum_frequency); void KT0915_setTuneDialModeOff(void); void KT0915_setVolumeDialModeOn(void); void KT0915_setVolumeDialModeOff(void); void KT0915_setAudioGain(uint8_t gain); void KT0915_setLeftChannelInverseControl(uint8_t enable_disable); void KT0915_setVolume(uint8_t value); void KT0915_setVolumeUp(void); void KT0915_setVolumeDown(void); uint8_t KT0915_getVolume(void); void KT0915_SetStandby(uint8_t on_off); void KT0915_setSoftMute(uint8_t on_off); void KT0915_setAudioBass(uint8_t bass); void KT0915_setAudioAntiPop(uint8_t value); void KT0915_setAudioMute(uint8_t mute_on_off); void KT0915_setDeEmphasis(uint8_t value); void KT0915_setMono(uint8_t on_off); void KT0915_setFmAfc(uint8_t on_off); void KT0915_setAmAfc(uint8_t on_off); void KT0915_setFM(uint32_t minimum_frequency, uint32_t maximum_frequency, uint32_t default_frequency, uint16_t step); void KT0915_setAM(uint32_t minimum_frequency, uint32_t maximum_frequency, uint32_t default_frequency, uint16_t step, uint8_t am_space); void KT0915_setAmSpace(uint8_t value); void KT0915_setAmBandwidth(uint8_t value); uint8_t KT0915_getAmBandwidth(void); uint8_t KT0915_isFmStereo(void); //bool void KT0915_setFrequency(uint32_t frequency); void KT0915_setStep(uint16_t step); void KT0915_frequencyUp(void); void KT0915_frequencyDown(void); inline void KT0915_setFrequencyUp() { KT0915_frequencyUp(); }; // Just an alias inline void KT0915_setFrequencyDown() { KT0915_frequencyDown(); }; // Just an alias uint32_t KT0915_getFrequency(void); uint16_t KT0915_getFmCurrentChannel(void); uint16_t KT0915_getAmCurrentChannel(void); void KT0915_seekStation(void); int KT0915_getFmRssi(void); int KT0915_getAmRssi(void); int KT0915_getFmSnr(void); uint8_t KT0915_PLLStatus(void); uint8_t KT0915_LOStatus(void);