diff options
| author | Henrik Alsér <[email protected]> | 2022-11-22 01:57:00 +0100 |
|---|---|---|
| committer | Henrik Alsér <[email protected]> | 2022-11-22 01:57:00 +0100 |
| commit | 633ffe46aea29bb4c8eec030cbfd6b93867fe79c (patch) | |
| tree | a98d6b8bfcb63a06ac56a353c581ebcb1eefcb63 /embassy-nrf/src/twis.rs | |
| parent | 43c1afb6a6b31a60f43b2faf8ca93bf5129e4d68 (diff) | |
config write, docs, add address_match_index
Diffstat (limited to 'embassy-nrf/src/twis.rs')
| -rw-r--r-- | embassy-nrf/src/twis.rs | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/embassy-nrf/src/twis.rs b/embassy-nrf/src/twis.rs index 769522877..b8cb2eeb8 100644 --- a/embassy-nrf/src/twis.rs +++ b/embassy-nrf/src/twis.rs | |||
| @@ -135,7 +135,7 @@ impl<'d, T: Instance> Twis<'d, T> { | |||
| 135 | 135 | ||
| 136 | // Set address | 136 | // Set address |
| 137 | r.address[0].write(|w| unsafe { w.address().bits(config.address0) }); | 137 | r.address[0].write(|w| unsafe { w.address().bits(config.address0) }); |
| 138 | r.config.modify(|_r, w| w.address0().enabled()); | 138 | r.config.write(|w| w.address0().enabled()); |
| 139 | if let Some(address1) = config.address1 { | 139 | if let Some(address1) = config.address1 { |
| 140 | r.address[1].write(|w| unsafe { w.address().bits(address1) }); | 140 | r.address[1].write(|w| unsafe { w.address().bits(address1) }); |
| 141 | r.config.modify(|_r, w| w.address1().enabled()); | 141 | r.config.modify(|_r, w| w.address1().enabled()); |
| @@ -248,6 +248,11 @@ impl<'d, T: Instance> Twis<'d, T> { | |||
| 248 | r.address[r.match_.read().bits() as usize].read().address().bits() | 248 | r.address[r.match_.read().bits() as usize].read().address().bits() |
| 249 | } | 249 | } |
| 250 | 250 | ||
| 251 | /// Returns the index of the address matched in the latest command. | ||
| 252 | pub fn address_match_index(&self) -> usize { | ||
| 253 | T::regs().match_.read().bits() as _ | ||
| 254 | } | ||
| 255 | |||
| 251 | /// Wait for read, write, stop or error | 256 | /// Wait for read, write, stop or error |
| 252 | fn blocking_listen_wait(&mut self) -> Result<Status, Error> { | 257 | fn blocking_listen_wait(&mut self) -> Result<Status, Error> { |
| 253 | let r = T::regs(); | 258 | let r = T::regs(); |
| @@ -588,10 +593,11 @@ impl<'d, T: Instance> Twis<'d, T> { | |||
| 588 | Ok(()) | 593 | Ok(()) |
| 589 | } | 594 | } |
| 590 | 595 | ||
| 591 | /// Listen for commands from an I2C master. | 596 | /// Wait for commands from an I2C master. |
| 592 | /// | 597 | /// `buffer` is provided in case master does a 'write' and is unused for 'read'. |
| 593 | /// The buffer must have a length of at most 255 bytes on the nRF52832 | 598 | /// The buffer must have a length of at most 255 bytes on the nRF52832 |
| 594 | /// and at most 65535 bytes on the nRF52840. | 599 | /// and at most 65535 bytes on the nRF52840. |
| 600 | /// To know which one of the addresses were matched, call `address_match` or `address_match_index` | ||
| 595 | pub fn blocking_listen(&mut self, buffer: &mut [u8]) -> Result<Command, Error> { | 601 | pub fn blocking_listen(&mut self, buffer: &mut [u8]) -> Result<Command, Error> { |
| 596 | self.setup_listen(buffer, false)?; | 602 | self.setup_listen(buffer, false)?; |
| 597 | let status = self.blocking_listen_wait()?; | 603 | let status = self.blocking_listen_wait()?; |
| @@ -620,10 +626,11 @@ impl<'d, T: Instance> Twis<'d, T> { | |||
| 620 | 626 | ||
| 621 | // =========================================== | 627 | // =========================================== |
| 622 | 628 | ||
| 623 | /// Listen for commands from an I2C master with timeout. | 629 | /// Wait for commands from an I2C master, with timeout. |
| 624 | /// | 630 | /// `buffer` is provided in case master does a 'write' and is unused for 'read'. |
| 625 | /// The buffer must have a length of at most 255 bytes on the nRF52832 | 631 | /// The buffer must have a length of at most 255 bytes on the nRF52832 |
| 626 | /// and at most 65535 bytes on the nRF52840. | 632 | /// and at most 65535 bytes on the nRF52840. |
| 633 | /// To know which one of the addresses were matched, call `address_match` or `address_match_index` | ||
| 627 | #[cfg(feature = "time")] | 634 | #[cfg(feature = "time")] |
| 628 | pub fn blocking_listen_timeout(&mut self, buffer: &mut [u8], timeout: Duration) -> Result<Command, Error> { | 635 | pub fn blocking_listen_timeout(&mut self, buffer: &mut [u8], timeout: Duration) -> Result<Command, Error> { |
| 629 | self.setup_listen(buffer, false)?; | 636 | self.setup_listen(buffer, false)?; |
| @@ -654,10 +661,11 @@ impl<'d, T: Instance> Twis<'d, T> { | |||
| 654 | 661 | ||
| 655 | // =========================================== | 662 | // =========================================== |
| 656 | 663 | ||
| 657 | /// Listen asynchronously for commands from an I2C master. | 664 | /// Wait asynchronously for commands from an I2C master. |
| 658 | /// | 665 | /// `buffer` is provided in case master does a 'write' and is unused for 'read'. |
| 659 | /// The buffer must have a length of at most 255 bytes on the nRF52832 | 666 | /// The buffer must have a length of at most 255 bytes on the nRF52832 |
| 660 | /// and at most 65535 bytes on the nRF52840. | 667 | /// and at most 65535 bytes on the nRF52840. |
| 668 | /// To know which one of the addresses were matched, call `address_match` or `address_match_index` | ||
| 661 | pub async fn listen(&mut self, buffer: &mut [u8]) -> Result<Command, Error> { | 669 | pub async fn listen(&mut self, buffer: &mut [u8]) -> Result<Command, Error> { |
| 662 | self.setup_listen(buffer, true)?; | 670 | self.setup_listen(buffer, true)?; |
| 663 | let status = self.async_listen_wait().await?; | 671 | let status = self.async_listen_wait().await?; |
