fm  2.0.0.0
fm.h
Go to the documentation of this file.
1 /*
2  * MikroSDK - MikroE Software Development Kit
3  * Copyright© 2020 MikroElektronika d.o.o.
4  *
5  * Permission is hereby granted, free of charge, to any person
6  * obtaining a copy of this software and associated documentation
7  * files (the "Software"), to deal in the Software without restriction,
8  * including without limitation the rights to use, copy, modify, merge,
9  * publish, distribute, sublicense, and/or sell copies of the Software,
10  * and to permit persons to whom the Software is furnished to do so,
11  * subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be
14  * included in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
20  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
22  * OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24 
33 // ----------------------------------------------------------------------------
34 
35 #ifndef FM_H
36 #define FM_H
37 
42 #ifdef PREINIT_SUPPORTED
43 #include "preinit.h"
44 #endif
45 
46 #ifdef MikroCCoreVersion
47  #if MikroCCoreVersion >= 1
48  #include "delays.h"
49  #endif
50 #endif
51 
52 #include "drv_digital_out.h"
53 #include "drv_digital_in.h"
54 #include "drv_i2c_master.h"
55 
56 // -------------------------------------------------------------- PUBLIC MACROS
66 #define FM_MAP_MIKROBUS( cfg, mikrobus ) \
67  cfg.scl = MIKROBUS( mikrobus, MIKROBUS_SCL ); \
68  cfg.sda = MIKROBUS( mikrobus, MIKROBUS_SDA ); \
69  cfg.gp2 = MIKROBUS( mikrobus, MIKROBUS_AN ); \
70  cfg.rst = MIKROBUS( mikrobus, MIKROBUS_RST ); \
71  cfg.sen = MIKROBUS( mikrobus, MIKROBUS_CS ); \
72  cfg.gp1 = MIKROBUS( mikrobus, MIKROBUS_INT )
73 
79 #define FM_RETVAL uint8_t
80 
81 #define FM_OK 0x00
82 #define FM_INIT_ERROR 0xFF
83 
89 #define DEFAULT_SLAVE_ADDRESS 0x10
90 
96 #define FM_DEVICE_ID 0x000E
97 #define FM_CHIP_ID 0x000F
98 #define FM_POWER_CONFIGURATION 0x0000
99 #define FM_CHANNEL 0x0001
100 #define FM_SYSTEM_CONFIGURATION_1 0x0002
101 #define FM_SYSTEM_CONFIGURATION_2 0x0003
102 #define FM_SYSTEM_CONFIGURATION_3 0x0004
103 #define FM_TEST_1 0x0005
104 #define FM_TEST_2 0x0006
105 #define FM_BOOT_CONFIGURATION 0x0007
106 #define FM_STATUS_RSSI 0x0008
107 #define FM_READ_CHANNEL 0x0009
108 #define FM_RDS_A 0x000A
109 #define FM_RDS_B 0x000B
110 #define FM_RDS_C 0x000C
111 #define FM_RDS_D 0x000D
112 
118 #define FM_SOFTMUTE_MASK 0x7FFF
119 #define FM_SOFTMUTE_ENABLE 0x0000
120 #define FM_SOFTMUTE_DISABLE 0x8000
121 
122 #define FM_MUTE_MASK 0xBFFF
123 #define FM_MUTE_ENABLE 0x0000
124 #define FM_MUTE_DISABLE 0x4000
125 
126 #define FM_STEREO_MASK 0xDFFF
127 #define FM_STEREO 0x0000
128 #define FM_FORCE_MONO 0x2000
129 
130 #define FM_RDS_MODE_MASK 0xF7FF
131 #define FM_RDS_MODE_STANDARD 0x0000
132 #define FM_RDS_MODE_VERBOSE 0x0800
133 
134 #define FM_SEEK_MODE_MASK 0xFBFF
135 #define FM_SEEK_MODE_WRAP 0x0000
136 #define FM_SEEK_MODE_STOP 0x0400
137 
138 #define FM_SEEK_DIRECTION_MASK 0xFDFF
139 #define FM_SEEK_DIRECTION_DOWN 0x0000
140 #define FM_SEEK_DIRECTION_UP 0x0200
141 
142 #define FM_SEEK_MASK 0xFEFF
143 #define FM_SEEK_DISABLE 0x0000
144 #define FM_SEEK_ENABLE 0x0100
145 
146 #define FM_POWERUP_DISABLE_MASK 0xFFBF
147 #define FM_POWERUP_DISABLE_LOW 0x0000
148 #define FM_POWERUP_DISABLE_HIGH 0x0040
149 
150 #define FM_POWERUP_ENABLE_MASK 0xFFFE
151 #define FM_POWERUP_ENABLE_LOW 0x0000
152 #define FM_POWERUP_ENABLE_HIGH 0x0001
153 
159 #define FM_TUNE_MASK 0x7FFF
160 #define FM_TUNE_DISABLE 0x0000
161 #define FM_TUNE_ENABLE 0x8000
162 
168 #define FM_RDS_INTERRUPT_MASK 0x7FFF
169 #define FM_RDS_INTERRUPT_DISABLE 0x0000
170 #define FM_RDS_INTERRUPT_ENABLE 0x8000
171 
172 #define FM_SEEK_TUNE_COMPLETE_INTERRUPT_MASK 0xBFFF
173 #define FM_SEEK_TUNE_COMPLETE_INTERRUPT_DISABLE 0x0000
174 #define FM_SEEK_TUNE_COMPLETE_INTERRUPT_ENABLE 0x4000
175 
176 #define FM_RDS_MASK 0xEFFF
177 #define FM_RDS_DISABLE 0x0000
178 #define FM_RDS_ENABLE 0x1000
179 
180 #define FM_DE_EMPHASIS_MASK 0xF7FF
181 #define FM_DE_EMPHASIS_USA 0x0000
182 #define FM_DE_EMPHASIS_EUROPE_AUSTRALIA_JAPAN 0x0800
183 
184 #define FM_AGC_MASK 0xFBFF
185 #define FM_AGC_ENABLE 0x0000
186 #define FM_AGC_DISABLE 0x0400
187 
188 #define FM_STEREO_MONO_BLEND_LEVEL_MASK 0xFF3F
189 #define FM_STEREO_MONO_BLEND_LEVEL_31_49_RSSI 0x0000
190 #define FM_STEREO_MONO_BLEND_LEVEL_37_55_RSSI 0x0040
191 #define FM_STEREO_MONO_BLEND_LEVEL_19_37_RSSI 0x0080
192 #define FM_STEREO_MONO_BLEND_LEVEL_25_43_RSSI 0x00C0
193 
194 #define FM_GPIO3_MASK 0xFFCF
195 #define FM_GPIO3_HIGH_IMPENDANCE 0x0000
196 #define FM_GPIO3_MONO_STEREO_INDICATOR 0x0001
197 #define FM_GPIO3_LOW 0x0002
198 #define FM_GPIO3_HIGH 0x0003
199 
200 #define FM_GPIO2_MASK 0xFFF3
201 #define FM_GPIO2_HIGH_IMPEDANCE 0x0000
202 #define FM_GPIO2_STC_RDS_INTERRUPT 0x0004
203 #define FM_GPIO2_LOW 0x0008
204 #define FM_GPIO2_HIGH 0x000C
205 
206 #define FM_GPIO1_MASK 0xFFFC
207 #define FM_GPIO1_HIGH_IMPEDANCE 0x0000
208 #define FM_GPIO1_RESERVED 0x0001
209 #define FM_GPIO1_LOW 0x0002
210 #define FM_GPIO1_HIGH 0x0003
211 
217 #define FM_BAND_MASK 0xFF3F
218 #define FM_BAND_USA_EUROPE_87P5_108_MHZ 0x0000
219 #define FM_BAND_JAPAN_WIDE_76_108_MHZ 0x0040
220 #define FM_BAND_JAPAN_76_90_MHZ 0x0080
221 #define FM_BAND_RESERVED 0x00C0
222 
223 #define FM_CHANNEL_SPACING_MASK 0xFFCF
224 #define FM_CHANNEL_SPACING_USA_AUSTRALIA_200_KHZ 0x0000
225 #define FM_CHANNEL_SPACING_EUROPE_JAPAN_100_KHZ 0x0010
226 #define FM_CHANNEL_SPACING_50_KHZ 0x0020
227 
233 #define FM_SOFTMUTE_ATTACK_RECOVER_RATE_MASK 0x3FFF
234 #define FM_SOFTMUTE_ATTACK_RECOVER_RATE_FASTEST 0x0000
235 #define FM_SOFTMUTE_ATTACK_RECOVER_RATE_FAST 0x4000
236 #define FM_SOFTMUTE_ATTACK_RECOVER_RATE_SLOW 0x8000
237 #define FM_SOFTMUTE_ATTACK_RECOVER_RATE_SLOWEST 0xC000
238 
239 #define FM_SOFTMUTE_ATTENUATION_MASK 0xCFFF
240 #define FM_SOFTMUTE_ATTENUATION_16_DB 0x0000
241 #define FM_SOFTMUTE_ATTENUATION_14_DB 0x1000
242 #define FM_SOFTMUTE_ATTENUATION_12_DB 0x2000
243 #define FM_SOFTMUTE_ATTENUATION_10_DB 0x3000
244 
245 #define FM_EXTENDED_VOLUME_RANGE_MASK 0xFEFF
246 #define FM_EXTENDED_VOLUME_RANGE_DISABLED 0x0000
247 #define FM_EXTENDED_VOLUME_RANGE_ENABLED 0x0100
248 
254 #define FM_CRYSTAL_OSCYLATOR_MASK 0x7FFF
255 #define FM_CRYSTAL_OSCYLATOR_DISABLE 0x0000
256 #define FM_CRYSTAL_OSCYLATOR_ENABLE 0x8000
257 
258 #define FM_AUDIO_HIGH_Z_MASK 0xBFFF
259 #define FM_AUDIO_HIGH_Z_DISABLE 0x0000
260 #define FM_AUDIO_HIGH_Z_ENABLE 0x4000
261 
267 #define FM_RDS_READY_MASK 0x8000
268 #define FM_SEEK_TUNE_COMPLETE_MASK 0x4000
269 #define FM_SEEK_FAIL_BAND_LIMIT_MASK 0x2000
270 #define FM_AFC_RAIL_MASK 0x1000
271 #define FM_RDS_SYNCHRONIZED_MASK 0x0800
272 #define FM_STEREO_MONO_INDICATOR_MASK 0x0100
273  // End group macro
276 // --------------------------------------------------------------- PUBLIC TYPES
285 typedef struct
286 {
287  // Output pins
288 
289  digital_out_t rst;
290  digital_out_t sen;
291 
292  // Input pins
293 
294  digital_in_t gp2;
295  digital_in_t gp1;
296 
297  // Modules
298 
299  i2c_master_t i2c;
300 
301  // ctx variable
302 
303  uint8_t slave_address;
304 
305 } fm_t;
306 
310 typedef struct
311 {
312  // Communication gpio pins
313 
314  pin_name_t scl;
315  pin_name_t sda;
316 
317  // Additional gpio pins
318 
319  pin_name_t gp2;
320  pin_name_t rst;
321  pin_name_t sen;
322  pin_name_t gp1;
323 
324  // static variable
325 
326  uint32_t i2c_speed;
327  uint8_t i2c_address;
328 
329 } fm_cfg_t;
330  // End types group
332 // ----------------------------------------------- PUBLIC FUNCTION DECLARATIONS
333 
339 #ifdef __cplusplus
340 extern "C"{
341 #endif
342 
351 void fm_cfg_setup ( fm_cfg_t *cfg );
352 
362 
370 void fm_default_cfg ( fm_t *ctx );
371 
381 void fm_generic_write ( fm_t *ctx, uint16_t *reg_buf );
382 
394 void fm_generic_read ( fm_t *ctx, uint16_t *reg_buf );
395 
409 void fm_set_bits ( uint16_t *register_buffer, uint16_t register_address, uint16_t bits_mask, uint16_t bits_value );
410 
422 uint8_t fm_set_seek_threshold ( fm_t *ctx, uint16_t seek_threshold );
423 
436 uint8_t fm_set_volume ( fm_t *ctx, uint8_t volume_level );
437 
449 uint8_t fm_set_snr_threshold ( fm_t *ctx, uint8_t snr_threshold );
450 
462 uint8_t fm_set_seek_impulse_detection_threshold ( fm_t *ctx, uint8_t impulse_detection_threshold );
463 
476 uint8_t fm_get_errors_block_a ( fm_t *ctx );
477 
487 
500 uint8_t fm_get_errors_block_b ( fm_t *ctx );
501 
514 uint8_t fm_get_errors_block_c ( fm_t *ctx );
515 
528 uint8_t fm_get_errors_block_d ( fm_t *ctx );
529 
539 
550 void fm_power_up ( fm_t *ctx );
551 
560 void fm_basic_settings ( fm_t *ctx );
561 
569 void fm_power_down ( fm_t *ctx );
570 
579 uint16_t fm_get_channel ( fm_t *ctx );
580 
589 void fm_tune_channel ( fm_t *ctx, uint16_t channel );
590 
602 uint8_t fm_tune ( fm_t *ctx, float channel_frequency );
603 
613 void fm_end_tune ( fm_t *ctx );
614 
623 void fm_seek ( fm_t *ctx );
624 
635 void fm_end_seek ( fm_t *ctx );
636 
647 uint8_t fm_volume_up ( fm_t *ctx );
648 
659 uint8_t fm_volume_down ( fm_t *ctx );
660 
668 void fm_mute_enable ( fm_t *ctx );
669 
677 void fm_mute_disable ( fm_t *ctx );
678 
687 uint8_t fm_fine_tune_up ( fm_t *ctx);
688 
696 uint8_t fm_fine_tune_down ( fm_t *ctx );
697 
706 uint8_t fm_get_int_pin ( fm_t *ctx );
707 
715 uint8_t fm_get_an_pin ( fm_t *ctx );
716 
717 #ifdef __cplusplus
718 }
719 #endif
720 #endif // _FM_H_
721  // End public_function group
724 
725 // ------------------------------------------------------------------------- END
fm_set_volume
uint8_t fm_set_volume(fm_t *ctx, uint8_t volume_level)
Setting volume value.
fm_cfg_t::gp2
pin_name_t gp2
Definition: fm.h:319
fm_power_up
void fm_power_up(fm_t *ctx)
Powering up device.
fm_set_seek_threshold
uint8_t fm_set_seek_threshold(fm_t *ctx, uint16_t seek_threshold)
Setting seek threshold value.
fm_cfg_t::sda
pin_name_t sda
Definition: fm.h:315
fm_fine_tune_up
uint8_t fm_fine_tune_up(fm_t *ctx)
Fine tunning.
fm_cfg_t::i2c_speed
uint32_t i2c_speed
Definition: fm.h:326
fm_basic_settings
void fm_basic_settings(fm_t *ctx)
Setting basic settings.
fm_t::rst
digital_out_t rst
Definition: fm.h:289
fm_mute_disable
void fm_mute_disable(fm_t *ctx)
Disable mute.
fm_end_tune
void fm_end_tune(fm_t *ctx)
End tunning.
fm_t::gp2
digital_in_t gp2
Definition: fm.h:294
fm_get_errors_block_d
uint8_t fm_get_errors_block_d(fm_t *ctx)
Reading number of errors to be corrected.
fm_seek
void fm_seek(fm_t *ctx)
Start seeking radio station.
fm_tune
uint8_t fm_tune(fm_t *ctx, float channel_frequency)
Tunning radio station.
fm_cfg_t::i2c_address
uint8_t i2c_address
Definition: fm.h:327
fm_cfg_t
Click configuration structure definition.
Definition: fm.h:311
fm_get_errors_block_b
uint8_t fm_get_errors_block_b(fm_t *ctx)
Reading number of errors to be corrected.
fm_init
FM_RETVAL fm_init(fm_t *ctx, fm_cfg_t *cfg)
Initialization function.
fm_cfg_setup
void fm_cfg_setup(fm_cfg_t *cfg)
Config Object Initialization function.
fm_get_channel
uint16_t fm_get_channel(fm_t *ctx)
Reading CHANNEL bits.
fm_cfg_t::sen
pin_name_t sen
Definition: fm.h:321
fm_set_seek_impulse_detection_threshold
uint8_t fm_set_seek_impulse_detection_threshold(fm_t *ctx, uint8_t impulse_detection_threshold)
Setting seek impulse detection threshold value.
fm_get_channel_frequency
float fm_get_channel_frequency(fm_t *ctx)
Calculating current channel frequency.
fm_t::i2c
i2c_master_t i2c
Definition: fm.h:299
fm_end_seek
void fm_end_seek(fm_t *ctx)
End seeking.
fm_cfg_t::gp1
pin_name_t gp1
Definition: fm.h:322
FM_RETVAL
#define FM_RETVAL
Definition: fm.h:79
fm_get_int_pin
uint8_t fm_get_int_pin(fm_t *ctx)
Checking INT pin status.
fm_set_bits
void fm_set_bits(uint16_t *register_buffer, uint16_t register_address, uint16_t bits_mask, uint16_t bits_value)
Setting bits in specific register on a specific bit location.
fm_volume_down
uint8_t fm_volume_down(fm_t *ctx)
Decreasing volume level.
fm_get_received_signal_strength_indicator
uint8_t fm_get_received_signal_strength_indicator(fm_t *ctx)
Reading recived strength indicator.
fm_fine_tune_down
uint8_t fm_fine_tune_down(fm_t *ctx)
Fine tunning.
fm_t::sen
digital_out_t sen
Definition: fm.h:290
fm_mute_enable
void fm_mute_enable(fm_t *ctx)
Enable mute.
fm_get_errors_block_a
uint8_t fm_get_errors_block_a(fm_t *ctx)
Reading number of errors to be corrected.
fm_generic_read
void fm_generic_read(fm_t *ctx, uint16_t *reg_buf)
Reading all registers.
fm_cfg_t::scl
pin_name_t scl
Definition: fm.h:314
fm_default_cfg
void fm_default_cfg(fm_t *ctx)
Click Default Configuration function.
fm_t::gp1
digital_in_t gp1
Definition: fm.h:295
fm_volume_up
uint8_t fm_volume_up(fm_t *ctx)
Increasing volume level.
fm_t::slave_address
uint8_t slave_address
Definition: fm.h:303
fm_generic_write
void fm_generic_write(fm_t *ctx, uint16_t *reg_buf)
Generic write function.
fm_power_down
void fm_power_down(fm_t *ctx)
Powering down device.
fm_set_snr_threshold
uint8_t fm_set_snr_threshold(fm_t *ctx, uint8_t snr_threshold)
Setting seek SNR threshold value.
fm_get_an_pin
uint8_t fm_get_an_pin(fm_t *ctx)
Checking AN pin status.
fm_tune_channel
void fm_tune_channel(fm_t *ctx, uint16_t channel)
Setting CHANNEL bits.
fm_get_errors_block_c
uint8_t fm_get_errors_block_c(fm_t *ctx)
Reading number of errors to be corrected.
fm_cfg_t::rst
pin_name_t rst
Definition: fm.h:320
fm_t
Click ctx object definition.
Definition: fm.h:286