Compare commits

...

10 Commits

Author SHA1 Message Date
Ilya Epifanov
e509c36df9 cargo fix --edition-idioms 2019-01-20 23:14:24 +01:00
Ilya Epifanov
d431678011 2018 edition 2019-01-20 23:13:40 +01:00
Ilya Epifanov
bf425b8b6c taking an i2c bus by value 2019-01-20 23:11:13 +01:00
Ilya Epifanov
ec33c2de17 0.1.5 release 2018-03-19 13:39:26 +01:00
Ilya Epifanov
ba20217b63 updated docs 2018-03-19 13:39:11 +01:00
Ilya Epifanov
6d56a07fd4 fixed cargo categories 2018-03-19 13:22:41 +01:00
Ilya Epifanov
771fe86bd9 added links to docs.rs, crates.io and ci to the readme 2018-03-19 13:12:21 +01:00
Ilya Epifanov
fd5a6e6373 0.1.4 release 2018-03-19 12:59:45 +01:00
Ilya Epifanov
8d7eee8842 added docs 2018-03-19 12:08:14 +01:00
Ilya Epifanov
429a530b65 added copyright notice and MIT license as a fallback 2018-03-02 21:07:49 +01:00
6 changed files with 148 additions and 22 deletions

View File

@ -1,11 +1,19 @@
[package]
name = "si5351"
version = "0.1.2"
categories = ["embedded-hal-driver", "ham-radio", "clock", "pll" ]
version = "0.2.0"
keywords = ["embedded", "no-std", "embedded-hal-driver", "clock", "ham-radio"]
categories = ["embedded", "no-std"]
authors = ["Ilya Epifanov <elijah.epifanov@gmail.com>"]
description = "A platform agnostic driver for the Si5351 clock generator"
license = "MIT OR Apache-2.0"
exclude = [".travis.yml", ".gitignore"]
repository = "https://github.com/ilya-epifanov/si5351"
edition = "2018"
[badges.travis-ci]
branch = "master"
repository = "jamwaffles/ssd1306"
[dependencies]
embedded-hal = "0.1"
embedded-hal = "0.2.2"
bitflags = "1.0"

View File

@ -186,7 +186,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Copyright 2018 Ilya Epifanov
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.

25
LICENSE-MIT Normal file
View File

@ -0,0 +1,25 @@
Copyright (c) 2018 Ilya Epifanov
Permission is hereby granted, free of charge, to any
person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the
Software without restriction, including without
limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software
is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice
shall be included in all copies or substantial portions
of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

View File

@ -1 +1,24 @@
# si5351
[![docs](https://docs.rs/si5351/badge.svg)](https://docs.rs/si5351)
[![crates.io](https://img.shields.io/crates/v/si5351.svg)](https://crates.io/crates/si5351)
[![ci](https://travis-ci.org/ilya-epifanov/si5351.svg)](https://travis-ci.org/ilya-epifanov/si5351)
## Documentation
On [docs.rs](https://docs.rs/si5351)
## License
Licensed under either of
* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
* MIT license ([LICENSE-MIT](LICENSE-MIT))
at your option.
### Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any
additional terms or conditions.

View File

@ -1,7 +0,0 @@
[dependencies.core]
stage = 0
[dependencies.compiler_builtins]
git = "https://github.com/rust-lang-nursery/compiler-builtins"
features = ["mem"]
stage = 1

View File

@ -1,14 +1,91 @@
/*
Copyright 2018 Ilya Epifanov
Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
http://opensource.org/licenses/MIT>, at your option. This file may not be
copied, modified, or distributed except according to those terms.
*/
/*!
A platform agnostic Rust driver for the [Si5351], based on the
[`embedded-hal`] traits.
## The Device
The Silicon Labs [Si5351] is an any-frequency CMOS clock generator.
The device has an I²C interface.
## Usage
Import this crate and an `embedded_hal` implementation:
```
extern crate stm32f103xx_hal as hal;
extern crate si5351;
```
Initialize I²C bus (differs between `embedded_hal` implementations):
```no_run
# extern crate stm32f103xx_hal as hal;
use hal::i2c::I2c;
type I2C = ...;
# fn main() {
let i2c: I2C = initialize_i2c();
# }
```
Then instantiate the device:
```no_run
# extern crate stm32f103xx_hal as hal;
# extern crate si5351;
use si5351;
use si5351::{Si5351, Si5351Device};
# fn main() {
let mut clock = Si5351Device<I2C>::new(i2c, false, 25_000_000);
clock.init(si5351::CrystalLoad::_10)?;
# }
```
Or, if you have an [Adafruit module], you can use shortcut functions to initializate it:
```no_run
# extern crate stm32f103xx_hal as hal;
# extern crate si5351;
use si5351;
use si5351::{Si5351, Si5351Device};
# fn main() {
let mut clock = Si5351Device<I2C>::new_adafruit_module(i2c);
clock.init_adafruit_module()?;
# }
```
And set frequency on one of the outputs:
```no_run
use si5351;
clock.set_frequency(si5351::PLL::A, si5351::ClockOutput::Clk0, 14_175_000)?;
```
[Si5351]: https://www.silabs.com/documents/public/data-sheets/Si5351-B.pdf
[`embedded-hal`]: https://github.com/japaric/embedded-hal
[Adafruit module]: https://www.adafruit.com/product/2045
*/
//#![deny(missing_docs)]
#![deny(warnings)]
#![feature(unsize)]
#![no_std]
#[macro_use]
extern crate bitflags;
extern crate embedded_hal as hal;
use embedded_hal as hal;
use core::mem;
use hal::blocking::i2c::{Write, WriteRead};
use crate::hal::blocking::i2c::{Write, WriteRead};
#[derive(Debug)]
pub enum Error {
@ -262,8 +339,8 @@ fn i2c_error<E>(_: E) -> Error {
}
/// Si5351 driver
pub struct Si5351Device<'a, I2C: 'a> {
i2c: &'a mut I2C,
pub struct Si5351Device<I2C> {
i2c: I2C,
address: u8,
xtal_freq: u32,
clk_enabled_mask: u8,
@ -271,7 +348,7 @@ pub struct Si5351Device<'a, I2C: 'a> {
ms_src_mask: u8,
}
pub trait Si5351<'a> {
pub trait Si5351 {
fn init_adafruit_module(&mut self) -> Result<(), Error>;
fn init(&mut self, xtal_load: CrystalLoad) -> Result<(), Error>;
fn read_device_status(&mut self) -> Result<DeviceStatusBits, Error>;
@ -292,12 +369,12 @@ pub trait Si5351<'a> {
fn select_clock_pll(&mut self, clocl: ClockOutput, pll: PLL);
}
impl<'a, I2C, E> Si5351Device<'a, I2C>
impl<I2C, E> Si5351Device<I2C>
where
I2C: WriteRead<Error=E> + Write<Error=E>,
{
/// Creates a new driver from a I2C peripheral
pub fn new(i2c: &'a mut I2C, address_bit: bool, xtal_freq: u32) -> Self {
pub fn new(i2c: I2C, address_bit: bool, xtal_freq: u32) -> Self {
let si5351 = Si5351Device {
i2c,
address: ADDRESS | if address_bit { 1 } else { 0 },
@ -310,7 +387,7 @@ impl<'a, I2C, E> Si5351Device<'a, I2C>
si5351
}
pub fn new_adafruit_module(i2c: &'a mut I2C) -> Self {
pub fn new_adafruit_module(i2c: I2C) -> Self {
Si5351Device::new(i2c, false, 25_000_000)
}
@ -387,7 +464,7 @@ impl<'a, I2C, E> Si5351Device<'a, I2C>
}
}
impl<'a, I2C, E> Si5351<'a> for Si5351Device<'a, I2C> where
impl<I2C, E> Si5351 for Si5351Device<I2C> where
I2C: WriteRead<Error=E> + Write<Error=E>
{
fn init_adafruit_module(&mut self) -> Result<(), Error> {