diff options
| author | Raul Alimbekov <[email protected]> | 2025-12-16 09:05:22 +0300 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-12-16 09:05:22 +0300 |
| commit | c9a04b4b732b7a3b696eb8223664c1a7942b1875 (patch) | |
| tree | 6dbe5c02e66eed8d8762f13f95afd24f8db2b38c /embassy-rp/src/pio_programs/onewire.rs | |
| parent | cde24a3ef1117653ba5ed4184102b33f745782fb (diff) | |
| parent | 5ae6e060ec1c90561719aabdc29d5b6e7b8b0a82 (diff) | |
Merge branch 'main' into main
Diffstat (limited to 'embassy-rp/src/pio_programs/onewire.rs')
| -rw-r--r-- | embassy-rp/src/pio_programs/onewire.rs | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/embassy-rp/src/pio_programs/onewire.rs b/embassy-rp/src/pio_programs/onewire.rs index 980d0fe5f..3adab3b79 100644 --- a/embassy-rp/src/pio_programs/onewire.rs +++ b/embassy-rp/src/pio_programs/onewire.rs | |||
| @@ -1,11 +1,11 @@ | |||
| 1 | //! OneWire pio driver | 1 | //! OneWire pio driver |
| 2 | 2 | ||
| 3 | use crate::Peri; | ||
| 3 | use crate::clocks::clk_sys_freq; | 4 | use crate::clocks::clk_sys_freq; |
| 4 | use crate::gpio::Level; | 5 | use crate::gpio::Level; |
| 5 | use crate::pio::{ | 6 | use crate::pio::{ |
| 6 | Common, Config, Direction, Instance, LoadedProgram, PioPin, ShiftConfig, ShiftDirection, StateMachine, | 7 | Common, Config, Direction, Instance, LoadedProgram, PioPin, ShiftConfig, ShiftDirection, StateMachine, |
| 7 | }; | 8 | }; |
| 8 | use crate::Peri; | ||
| 9 | 9 | ||
| 10 | /// This struct represents a onewire driver program | 10 | /// This struct represents a onewire driver program |
| 11 | pub struct PioOneWireProgram<'a, PIO: Instance> { | 11 | pub struct PioOneWireProgram<'a, PIO: Instance> { |
| @@ -163,7 +163,11 @@ impl<'d, PIO: Instance, const SM: usize> PioOneWire<'d, PIO, SM> { | |||
| 163 | 163 | ||
| 164 | /// Write bytes to the onewire bus | 164 | /// Write bytes to the onewire bus |
| 165 | pub async fn write_bytes(&mut self, data: &[u8]) { | 165 | pub async fn write_bytes(&mut self, data: &[u8]) { |
| 166 | unsafe { self.sm.set_y(u32::MAX as u32) }; | 166 | unsafe { |
| 167 | self.sm.set_enable(false); | ||
| 168 | self.sm.set_y(u32::MAX as u32); | ||
| 169 | self.sm.set_enable(true); | ||
| 170 | } | ||
| 167 | let (rx, tx) = self.sm.rx_tx(); | 171 | let (rx, tx) = self.sm.rx_tx(); |
| 168 | for b in data { | 172 | for b in data { |
| 169 | tx.wait_push(*b as u32).await; | 173 | tx.wait_push(*b as u32).await; |
| @@ -175,7 +179,11 @@ impl<'d, PIO: Instance, const SM: usize> PioOneWire<'d, PIO, SM> { | |||
| 175 | 179 | ||
| 176 | /// Write bytes to the onewire bus, then apply a strong pullup | 180 | /// Write bytes to the onewire bus, then apply a strong pullup |
| 177 | pub async fn write_bytes_pullup(&mut self, data: &[u8], pullup_time: embassy_time::Duration) { | 181 | pub async fn write_bytes_pullup(&mut self, data: &[u8], pullup_time: embassy_time::Duration) { |
| 178 | unsafe { self.sm.set_y(data.len() as u32 * 8 - 1) }; | 182 | unsafe { |
| 183 | self.sm.set_enable(false); | ||
| 184 | self.sm.set_y(data.len() as u32 * 8 - 1); | ||
| 185 | self.sm.set_enable(true); | ||
| 186 | }; | ||
| 179 | let (rx, tx) = self.sm.rx_tx(); | 187 | let (rx, tx) = self.sm.rx_tx(); |
| 180 | for b in data { | 188 | for b in data { |
| 181 | tx.wait_push(*b as u32).await; | 189 | tx.wait_push(*b as u32).await; |
| @@ -195,7 +203,11 @@ impl<'d, PIO: Instance, const SM: usize> PioOneWire<'d, PIO, SM> { | |||
| 195 | 203 | ||
| 196 | /// Read bytes from the onewire bus | 204 | /// Read bytes from the onewire bus |
| 197 | pub async fn read_bytes(&mut self, data: &mut [u8]) { | 205 | pub async fn read_bytes(&mut self, data: &mut [u8]) { |
| 198 | unsafe { self.sm.set_y(u32::MAX as u32) }; | 206 | unsafe { |
| 207 | self.sm.set_enable(false); | ||
| 208 | self.sm.set_y(u32::MAX as u32); | ||
| 209 | self.sm.set_enable(true); | ||
| 210 | }; | ||
| 199 | let (rx, tx) = self.sm.rx_tx(); | 211 | let (rx, tx) = self.sm.rx_tx(); |
| 200 | for b in data { | 212 | for b in data { |
| 201 | // Write all 1's so that we can read what the device responds | 213 | // Write all 1's so that we can read what the device responds |
| @@ -321,11 +333,7 @@ impl PioOneWireSearch { | |||
| 321 | 333 | ||
| 322 | /// Search for the next address on the bus | 334 | /// Search for the next address on the bus |
| 323 | pub async fn next<PIO: Instance, const SM: usize>(&mut self, pio: &mut PioOneWire<'_, PIO, SM>) -> Option<u64> { | 335 | pub async fn next<PIO: Instance, const SM: usize>(&mut self, pio: &mut PioOneWire<'_, PIO, SM>) -> Option<u64> { |
| 324 | if self.finished { | 336 | if self.finished { None } else { pio.search(self).await } |
| 325 | None | ||
| 326 | } else { | ||
| 327 | pio.search(self).await | ||
| 328 | } | ||
| 329 | } | 337 | } |
| 330 | 338 | ||
| 331 | /// Is finished when all devices have been found | 339 | /// Is finished when all devices have been found |
