#radio #fm #receiver #embedded-hal-driver #turner

no-std si4703

Si4703和Si4702 FM收音机转换器(接收器)的跨平台Rust驱动程序

1个不稳定版本

0.1.0 2019年12月3日

2135嵌入式开发

26 每月下载量

MIT/Apache

70KB
1.5K SLoC

Rust Si4703 FM收音机转换器(接收器)驱动程序

crates.io Docs Build Status Coverage Status

这是一个使用embedded-hal特性和I2C为Si4703和Si4702 FM收音机转换器(接收器)提供的跨平台Rust驱动程序。

此驱动程序允许您

  • 启用/禁用设备。见:enable()
  • 静音/取消静音。见:mute()
  • 配置搜索。见:configure_seek()
  • 带/不带STC中断搜索。见:seek_with_stc_int_pin()
  • 带/不带STC中断调整频率。见:tune_with_stc_int_pin()
  • 设置音量。见:set_volume()
  • 设置波段。见:set_band()
  • 设置频道间隔。见:set_channel_spacing()
  • 设置GPIO1、GPIO2和GPIO3的功能/状态。见:set_gpio1()
  • 启用/禁用软静音。见:enable_softmute()
  • 启用/禁用自动增益控制。见:enable_auto_gain_control()
  • 启用/禁用振荡器。见:enable_oscillator()
  • 启用/禁用STC中断。见:enable_stc_interrupts()
  • 启用/禁用音频高阻。见:enable_audio_high_z()
  • 设置去加重。参见:set_deemphasis()
  • 设置立体声到单声道的混合级别。参见:set_stereo_to_mono_blend_level()
  • 设置立体声/单声道输出模式。参见:set_output_mode()
  • 读取输出模式。参见:output_mode()
  • 读取通道。参见:channel()
  • 读取设备ID。参见:device_id()
  • 读取芯片ID。参见:chip_id()
  • 通过多种方法重置并选择I2C通信。参见:reset_and_select_i2c_method1()
  • RDS/RBDS(仅适用于Si4703)
    • 启用/禁用RDS。参见:enable_rds()
    • 启用/禁用RDS中断。参见:enable_rds_interrupts()
    • 读取是否准备好新的RDS组。参见:rds_ready()
    • 读取RDS是否已同步。参见:rds_synchronized()
    • 读取RDS数据。参见:rds_data()
    • 从RDS数据解码RDS无线电文本。参见:get_rds_radio_text()
    • 使用RDS数据填充字符数组以解码RDS无线电文本。参见:fill_with_rds_radio_text()

介绍性博客文章

设备

Si4702/03-C19扩展了Silicon Laboratories Si4700/Si4701 FM调谐器系列,并通过小型尺寸和板面积、最小组件数量、灵活的可编程性和卓越的、经过验证的性能,进一步提高了将FM收音机接收功能添加到移动设备的简便性和吸引力。

设备提供了显著的编程能力,并通过简化的编程接口和成熟的功能,满足全球FM听众的主观需求和变化的FM广播环境。

Si4703-C集成了用于欧洲无线电数据系统(RDS)和美国无线电广播数据系统(RBDS)的数字处理器,包括所有必需的符号解码、块同步、错误检测和错误纠正功能。

RDS允许显示如电台标识和歌曲名称等数据。Si4703-C提供详细的RDS视图和标准视图,允许采用者选择性地选择RDS状态、数据和块错误的粒度。

数据表

更多文档

用法

要使用此驱动程序,导入此crate和embedded_hal实现,然后实例化适当的设备。

在以下示例中,将创建Si4703设备的实例。可以使用方法创建Si4702设备的实例:Si4703::new_si4702(...)

请在此存储库中找到使用硬件的额外示例: driver-examples

use embedded_hal::blocking::delay::DelayMs;
use linux_embedded_hal::{Delay, I2cdev, Pin};
use nb::block;
use si4703::{
    reset_and_select_i2c_method1, ChannelSpacing, DeEmphasis, SeekDirection, SeekMode, Si4703,
    Volume,
};

fn main() {
    let mut delay = Delay {};
    {
        // Reset and communication protocol selection must be done beforehand
        let mut sda = Pin::new(2);
        let mut rst = Pin::new(17);
        reset_and_select_i2c_method1(&mut rst, &mut sda, &mut delay).unwrap();
    }
    let dev = I2cdev::new("/dev/i2c-1").unwrap();
    let mut radio = Si4703::new(dev);
    radio.enable_oscillator().unwrap();
    // Wait for the oscillator to stabilize
    delay.delay_ms(500_u16);
    radio.enable().unwrap();
    // Wait for powerup
    delay.delay_ms(110_u16);

    radio.set_volume(Volume::Dbfsm28).unwrap();
    radio.set_deemphasis(DeEmphasis::Us50).unwrap();
    radio.set_channel_spacing(ChannelSpacing::Khz100).unwrap();
    radio.unmute().unwrap();

    let stc_int = Pin::new(27);
    // Seek using STC interrupt pin
    block!(radio.seek_with_stc_int_pin(SeekMode::Wrap, SeekDirection::Up, &stc_int)).unwrap();
    let channel = radio.channel().unwrap_or(-1.0);
    println!("Found channel at {:1} MHz", channel);
}

支持

有关问题、问题、功能请求和其他更改,请在该 GitHub 项目中提交 问题

许可

以下任一许可下授权:

任您选择。

贡献

除非您明确说明,否则您提交的任何贡献,只要它有意包含在您的工作中,根据 Apache-2.0 许可证的定义,都应双重许可,不附加任何额外条款或条件。

依赖关系

~480KB