nrf: Add NFCT driver.
Co-Authored-By: turbocool3r <turbocool3r@gmail.com> Co-Authored-By: ferris <ferris@devdroplets.com>
This commit is contained in:
79
examples/nrf52840/src/bin/nfct.rs
Normal file
79
examples/nrf52840/src/bin/nfct.rs
Normal file
@@ -0,0 +1,79 @@
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
|
||||
use defmt::*;
|
||||
use embassy_executor::Spawner;
|
||||
use embassy_nrf::config::HfclkSource;
|
||||
use embassy_nrf::nfct::{Config as NfcConfig, NfcId, NfcT};
|
||||
use embassy_nrf::{bind_interrupts, nfct};
|
||||
use {defmt_rtt as _, embassy_nrf as _, panic_probe as _};
|
||||
|
||||
bind_interrupts!(struct Irqs {
|
||||
NFCT => nfct::InterruptHandler;
|
||||
});
|
||||
|
||||
#[embassy_executor::main]
|
||||
async fn main(_spawner: Spawner) {
|
||||
let mut config = embassy_nrf::config::Config::default();
|
||||
config.hfclk_source = HfclkSource::ExternalXtal;
|
||||
let p = embassy_nrf::init(config);
|
||||
|
||||
dbg!("Setting up...");
|
||||
let config = NfcConfig {
|
||||
nfcid1: NfcId::DoubleSize([0x04, 0x68, 0x95, 0x71, 0xFA, 0x5C, 0x64]),
|
||||
sdd_pat: nfct::SddPat::SDD00100,
|
||||
plat_conf: 0b0000,
|
||||
protocol: nfct::SelResProtocol::Type4A,
|
||||
};
|
||||
|
||||
let mut nfc = NfcT::new(p.NFCT, Irqs, &config);
|
||||
|
||||
let mut buf = [0u8; 256];
|
||||
|
||||
loop {
|
||||
info!("activating");
|
||||
nfc.activate().await;
|
||||
|
||||
loop {
|
||||
info!("rxing");
|
||||
let n = match nfc.receive(&mut buf).await {
|
||||
Ok(n) => n,
|
||||
Err(e) => {
|
||||
error!("rx error {}", e);
|
||||
break;
|
||||
}
|
||||
};
|
||||
let req = &buf[..n];
|
||||
info!("received frame {:02x}", req);
|
||||
|
||||
let mut deselect = false;
|
||||
let resp = match req {
|
||||
[0xe0, ..] => {
|
||||
info!("Got RATS, tx'ing ATS");
|
||||
&[0x06, 0x77, 0x77, 0x81, 0x02, 0x80][..]
|
||||
}
|
||||
[0xc2] => {
|
||||
info!("Got deselect!");
|
||||
deselect = true;
|
||||
&[0xc2]
|
||||
}
|
||||
_ => {
|
||||
info!("Got unknown command!");
|
||||
&[0xFF]
|
||||
}
|
||||
};
|
||||
|
||||
match nfc.transmit(resp).await {
|
||||
Ok(()) => {}
|
||||
Err(e) => {
|
||||
error!("tx error {}", e);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if deselect {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user