6个版本
0.3.1 | 2020年3月24日 |
---|---|
0.3.0 | 2020年3月24日 |
0.2.0 | 2018年12月30日 |
0.1.2 | 2018年12月19日 |
570 在 嵌入式开发 中
每月下载 42 次
用于 drogue-grove-uart-spi
34KB
451 行
sx127x_lora
适用于基于Semtech SX1276/77/78/79的板的平台无关驱动程序。它支持实现embedded-hal
特质的任何设备。设备通过SPI连接,并需要一个额外的GPIO引脚用于RESET。此分类适用于任何基于Semtech的板,包括
- Modtronix inAir4, inAir9, 和 inAir9B
- HopeRF RFM95W, RFM96W, 和 RFM98W
示例
Raspberry Pi基本发送
使用Raspberry Pi发送消息。此示例利用了linux_embedded_hal
包。
#![feature(extern_crate_item_prelude)]
extern crate sx127x_lora;
extern crate linux_embedded_hal as hal;
use hal::spidev::{self, SpidevOptions};
use hal::{Pin, Spidev};
use hal::sysfs_gpio::Direction;
use hal::Delay;
const LORA_CS_PIN: u64 = 8;
const LORA_RESET_PIN: u64 = 21;
const FREQUENCY: i64 = 915;
fn main(){
let mut spi = Spidev::open("/dev/spidev0.0").unwrap();
let options = SpidevOptions::new()
.bits_per_word(8)
.max_speed_hz(20_000)
.mode(spidev::SPI_MODE_0)
.build();
spi.configure(&options).unwrap();
let cs = Pin::new(LORA_CS_PIN);
cs.export().unwrap();
cs.set_direction(Direction::Out).unwrap();
let reset = Pin::new(LORA_RESET_PIN);
reset.export().unwrap();
reset.set_direction(Direction::Out).unwrap();
let mut lora = sx127x_lora::LoRa::new(
spi, cs, reset, FREQUENCY, Delay)
.expect("Failed to communicate with radio module!");
lora.set_tx_power(17,1); //Using PA_BOOST. See your board for correct pin.
let message = "Hello, world!";
let mut buffer = [0;255];
for (i,c) in message.chars().enumerate() {
buffer[i] = c as u8;
}
let transmit = lora.transmit_payload(buffer,message.len());
match transmit {
Ok(packet_size) => println!("Sent packet with size: {}", packet_size),
Err(()) => println!("Error"),
}
}
STM32F429阻塞接收
使用STM32F429使用阻塞poll_irq(timeout)
函数接收数据。它通过半主机将接收到的数据包打印出来。此示例利用了stm32f429_hal
,cortex_m
和panic_semihosting
包。
#![no_std]
#![no_main]
extern crate sx127x_lora;
extern crate stm32f429_hal as hal;
extern crate cortex_m;
extern crate panic_semihosting;
use sx127x_lora::MODE;
use cortex_m_semihosting::*;
use hal::gpio::GpioExt;
use hal::flash::FlashExt;
use hal::rcc::RccExt;
use hal::time::MegaHertz;
use hal::spi::Spi;
use hal::delay::Delay;
const FREQUENCY: i64 = 915;
#[entry]
fn main() -> !{
let cp = cortex_m::Peripherals::take().unwrap();
let p = hal::stm32f429::Peripherals::take().unwrap();
let mut rcc = p.RCC.constrain();
let mut flash = p.FLASH.constrain();
let clocks = rcc
.cfgr
.sysclk(MegaHertz(64))
.pclk1(MegaHertz(32))
.freeze(&mut flash.acr);
let mut gpioa = p.GPIOA.split(&mut rcc.ahb1);
let mut gpiod = p.GPIOD.split(&mut rcc.ahb1);
let mut gpiof = p.GPIOF.split(&mut rcc.ahb1);
let sck = gpioa.pa5.into_af5(&mut gpioa.moder, &mut gpioa.afrl);
let miso = gpioa.pa6.into_af5(&mut gpioa.moder, &mut gpioa.afrl);
let mosi = gpioa.pa7.into_af5(&mut gpioa.moder, &mut gpioa.afrl);
let reset = gpiof.pf13.into_push_pull_output(&mut gpiof.moder, &mut gpiof.otyper);
let cs = gpiod.pd14.into_push_pull_output(&mut gpiod.moder, &mut gpiod.otyper);
let spi = Spi::spi1(
p.SPI1,
(sck, miso, mosi),
MODE,
MegaHertz(8),
clocks,
&mut rcc.apb2,
);
let mut lora = sx127x_lora::LoRa::new(
spi, cs, reset, FREQUENCY,
Delay::new(cp.SYST, clocks)).unwrap();
loop {
let poll = lora.poll_irq(Some(30)); //30 Second timeout
match poll {
Ok(size) =>{
hprint!("with Payload: ");
let buffer = lora.read_packet(); // Received buffer. NOTE: 255 bytes are always returned
for i in 0..size{
hprint!("{}",buffer[i] as char).unwrap();
}
hprintln!();
},
Err(()) => hprintln!("Timeout").unwrap(),
}
}
}
中断
该包当前通过轮询无线电的IRQ寄存器来确定是否有新的数据包到达。如果将中断连接到模块的DIO_0引脚,这将更有效。一旦在embedded-hal
中提供中断支持,那么这将添加。可以通过使用read_packet()
函数在设备到设备的基础上实现此功能。
贡献
除非您明确声明,否则任何有意提交以供包括在您的工作中的贡献,根据Apache-2.0许可协议定义,将按上述方式双许可,不附加任何额外条款或条件。
依赖关系
~100KB