#![no_main]
#![no_std]
extern crate panic_semihosting;
use core::pin::Pin;
use cortex_m::{asm, interrupt};
use cortex_m_rt::entry;
use stm32f7xx_hal::{
dma::{self, DMA},
pac,
prelude::*,
spi::{self, Spi},
};
#[entry]
fn main() -> ! {
let p = pac::Peripherals::take().unwrap();
let mut rcc = p.RCC.constrain();
let clocks = rcc.cfgr.freeze();
let dma = DMA::new(p.DMA1);
let gpiob = p.GPIOB.split();
let gpioc = p.GPIOC.split();
let mut green = gpiob.pb0.into_push_pull_output();
let mut red = gpiob.pb14.into_push_pull_output();
let mut ncs = gpioc.pc9.into_push_pull_output();
let sck = gpioc.pc10.into_alternate();
let miso = gpioc.pc11.into_alternate();
let mosi = gpioc.pc12.into_alternate();
let mut rx_stream = dma.streams.stream0;
let mut tx_stream = dma.streams.stream5;
let dma = dma.handle.enable(&mut rcc.ahb1);
ncs.set_high();
let mut spi = Spi::new(p.SPI3, (sck, miso, mosi)).enable(
spi::Mode {
polarity: spi::Polarity::IdleHigh,
phase: spi::Phase::CaptureOnSecondTransition,
},
250.kHz(),
&clocks,
&mut rcc.apb1,
);
static mut BUFFER: [u8; 2] = [0; 2];
let mut buffer = unsafe { Pin::new(&mut BUFFER) };
loop {
buffer[0] = 0x75 | 0x80;
let mut transfer = spi.transfer_all(buffer, &dma, &dma, rx_stream, tx_stream);
ncs.set_low();
let res = interrupt::free(|_| {
transfer.enable_interrupts(
&dma,
&dma,
dma::Interrupts {
transfer_complete: true,
transfer_error: true,
direct_mode_error: true,
..dma::Interrupts::default()
},
);
let transfer = transfer.start(&dma, &dma);
asm::wfi();
transfer.wait(&dma, &dma).unwrap()
});
ncs.set_high();
buffer = res.buffer;
spi = res.target;
rx_stream = res.rx_stream;
tx_stream = res.tx_stream;
if buffer[1] == 0x71 {
green.set_high();
red.set_low();
} else {
red.set_high();
green.set_low();
}
}
}