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 )
79#define FM_RETVAL uint8_t
80
81#define FM_OK 0x00
82#define FM_INIT_ERROR 0xFF
89#define DEFAULT_SLAVE_ADDRESS 0x10
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
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
159#define FM_TUNE_MASK 0x7FFF
160#define FM_TUNE_DISABLE 0x0000
161#define FM_TUNE_ENABLE 0x8000
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
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
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
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
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
275 // End group macro
276// --------------------------------------------------------------- PUBLIC TYPES
285typedef 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
304
305} fm_t;
306
310typedef 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
331 // End types group
332// ----------------------------------------------- PUBLIC FUNCTION DECLARATIONS
333
339#ifdef __cplusplus
340extern "C"{
341#endif
342
351void fm_cfg_setup ( fm_cfg_t *cfg );
352
362
370void fm_default_cfg ( fm_t *ctx );
371
381void fm_generic_write ( fm_t *ctx, uint16_t *reg_buf );
382
394void fm_generic_read ( fm_t *ctx, uint16_t *reg_buf );
395
409void fm_set_bits ( uint16_t *register_buffer, uint16_t register_address, uint16_t bits_mask, uint16_t bits_value );
410
422uint8_t fm_set_seek_threshold ( fm_t *ctx, uint16_t seek_threshold );
423
436uint8_t fm_set_volume ( fm_t *ctx, uint8_t volume_level );
437
449uint8_t fm_set_snr_threshold ( fm_t *ctx, uint8_t snr_threshold );
450
462uint8_t fm_set_seek_impulse_detection_threshold ( fm_t *ctx, uint8_t impulse_detection_threshold );
463
477
487
501
515
529
539
550void fm_power_up ( fm_t *ctx );
551
561
569void fm_power_down ( fm_t *ctx );
570
579uint16_t fm_get_channel ( fm_t *ctx );
580
589void fm_tune_channel ( fm_t *ctx, uint16_t channel );
590
602uint8_t fm_tune ( fm_t *ctx, float channel_frequency );
603
613void fm_end_tune ( fm_t *ctx );
614
623void fm_seek ( fm_t *ctx );
624
635void fm_end_seek ( fm_t *ctx );
636
647uint8_t fm_volume_up ( fm_t *ctx );
648
659uint8_t fm_volume_down ( fm_t *ctx );
660
668void fm_mute_enable ( fm_t *ctx );
669
677void fm_mute_disable ( fm_t *ctx );
678
687uint8_t fm_fine_tune_up ( fm_t *ctx);
688
696uint8_t fm_fine_tune_down ( fm_t *ctx );
697
706uint8_t fm_get_int_pin ( fm_t *ctx );
707
715uint8_t fm_get_an_pin ( fm_t *ctx );
716
717#ifdef __cplusplus
718}
719#endif
720#endif // _FM_H_
721
722 // End public_function group
724
725// ------------------------------------------------------------------------- END
#define FM_RETVAL
Definition fm.h:79
void fm_generic_write(fm_t *ctx, uint16_t *reg_buf)
Generic write function.
uint8_t fm_get_errors_block_c(fm_t *ctx)
Reading number of errors to be corrected.
uint8_t fm_volume_up(fm_t *ctx)
Increasing volume level.
uint8_t fm_get_errors_block_d(fm_t *ctx)
Reading number of errors to be corrected.
uint8_t fm_set_volume(fm_t *ctx, uint8_t volume_level)
Setting volume value.
void fm_mute_disable(fm_t *ctx)
Disable mute.
void fm_end_tune(fm_t *ctx)
End tunning.
void fm_power_up(fm_t *ctx)
Powering up device.
uint8_t fm_fine_tune_up(fm_t *ctx)
Fine tunning.
uint8_t fm_get_errors_block_b(fm_t *ctx)
Reading number of errors to be corrected.
uint8_t fm_volume_down(fm_t *ctx)
Decreasing volume level.
void fm_power_down(fm_t *ctx)
Powering down device.
uint16_t fm_get_channel(fm_t *ctx)
Reading CHANNEL bits.
void fm_basic_settings(fm_t *ctx)
Setting basic settings.
void fm_end_seek(fm_t *ctx)
End seeking.
uint8_t fm_set_seek_threshold(fm_t *ctx, uint16_t seek_threshold)
Setting seek threshold value.
float fm_get_channel_frequency(fm_t *ctx)
Calculating current channel frequency.
uint8_t fm_get_int_pin(fm_t *ctx)
Checking INT pin status.
FM_RETVAL fm_init(fm_t *ctx, fm_cfg_t *cfg)
Initialization function.
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.
void fm_mute_enable(fm_t *ctx)
Enable mute.
uint8_t fm_set_snr_threshold(fm_t *ctx, uint8_t snr_threshold)
Setting seek SNR threshold value.
void fm_tune_channel(fm_t *ctx, uint16_t channel)
Setting CHANNEL bits.
void fm_generic_read(fm_t *ctx, uint16_t *reg_buf)
Reading all registers.
uint8_t fm_fine_tune_down(fm_t *ctx)
Fine tunning.
void fm_seek(fm_t *ctx)
Start seeking radio station.
uint8_t fm_set_seek_impulse_detection_threshold(fm_t *ctx, uint8_t impulse_detection_threshold)
Setting seek impulse detection threshold value.
void fm_cfg_setup(fm_cfg_t *cfg)
Config Object Initialization function.
uint8_t fm_get_an_pin(fm_t *ctx)
Checking AN pin status.
void fm_default_cfg(fm_t *ctx)
Click Default Configuration function.
uint8_t fm_get_errors_block_a(fm_t *ctx)
Reading number of errors to be corrected.
uint8_t fm_tune(fm_t *ctx, float channel_frequency)
Tunning radio station.
uint8_t fm_get_received_signal_strength_indicator(fm_t *ctx)
Reading recived strength indicator.
Click configuration structure definition.
Definition fm.h:311
pin_name_t gp2
Definition fm.h:319
uint32_t i2c_speed
Definition fm.h:326
pin_name_t scl
Definition fm.h:314
pin_name_t gp1
Definition fm.h:322
pin_name_t sda
Definition fm.h:315
pin_name_t sen
Definition fm.h:321
pin_name_t rst
Definition fm.h:320
uint8_t i2c_address
Definition fm.h:327
Click ctx object definition.
Definition fm.h:286
digital_in_t gp1
Definition fm.h:295
digital_in_t gp2
Definition fm.h:294
digital_out_t sen
Definition fm.h:290
i2c_master_t i2c
Definition fm.h:299
digital_out_t rst
Definition fm.h:289
uint8_t slave_address
Definition fm.h:303