aboutsummaryrefslogtreecommitdiff
path: root/embassy-nrf/src/radio/ieee802154.rs
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-nrf/src/radio/ieee802154.rs')
-rw-r--r--embassy-nrf/src/radio/ieee802154.rs21
1 files changed, 19 insertions, 2 deletions
diff --git a/embassy-nrf/src/radio/ieee802154.rs b/embassy-nrf/src/radio/ieee802154.rs
index 62af03a5a..54b463343 100644
--- a/embassy-nrf/src/radio/ieee802154.rs
+++ b/embassy-nrf/src/radio/ieee802154.rs
@@ -1,18 +1,18 @@
1//! IEEE 802.15.4 radio driver 1//! IEEE 802.15.4 radio driver
2 2
3use core::marker::PhantomData; 3use core::marker::PhantomData;
4use core::sync::atomic::{compiler_fence, Ordering}; 4use core::sync::atomic::{Ordering, compiler_fence};
5use core::task::Poll; 5use core::task::Poll;
6 6
7use embassy_hal_internal::drop::OnDrop; 7use embassy_hal_internal::drop::OnDrop;
8 8
9use super::{Error, InterruptHandler, TxPower}; 9use super::{Error, InterruptHandler, TxPower};
10use crate::Peri;
10use crate::interrupt::typelevel::Interrupt; 11use crate::interrupt::typelevel::Interrupt;
11use crate::interrupt::{self}; 12use crate::interrupt::{self};
12use crate::pac::radio::vals; 13use crate::pac::radio::vals;
13pub use crate::pac::radio::vals::State as RadioState; 14pub use crate::pac::radio::vals::State as RadioState;
14use crate::radio::Instance; 15use crate::radio::Instance;
15use crate::Peri;
16 16
17/// Default (IEEE compliant) Start of Frame Delimiter 17/// Default (IEEE compliant) Start of Frame Delimiter
18pub const DEFAULT_SFD: u8 = 0xA7; 18pub const DEFAULT_SFD: u8 = 0xA7;
@@ -52,6 +52,7 @@ impl<'d> Radio<'d> {
52 // Disable and enable to reset peripheral 52 // Disable and enable to reset peripheral
53 r.power().write(|w| w.set_power(false)); 53 r.power().write(|w| w.set_power(false));
54 r.power().write(|w| w.set_power(true)); 54 r.power().write(|w| w.set_power(true));
55 errata::post_power();
55 56
56 // Enable 802.15.4 mode 57 // Enable 802.15.4 mode
57 r.mode().write(|w| w.set_mode(vals::Mode::IEEE802154_250KBIT)); 58 r.mode().write(|w| w.set_mode(vals::Mode::IEEE802154_250KBIT));
@@ -541,3 +542,19 @@ fn dma_start_fence() {
541fn dma_end_fence() { 542fn dma_end_fence() {
542 compiler_fence(Ordering::Acquire); 543 compiler_fence(Ordering::Acquire);
543} 544}
545
546mod errata {
547 pub fn post_power() {
548 // Workaround for anomaly 158
549 #[cfg(feature = "_nrf5340-net")]
550 for i in 0..32 {
551 let info = crate::pac::FICR.trimcnf(i);
552 let addr = info.addr().read();
553 if addr & 0xFFFF_F000 == crate::pac::RADIO.as_ptr() as u32 {
554 unsafe {
555 (addr as *mut u32).write_volatile(info.data().read());
556 }
557 }
558 }
559 }
560}