aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32/src/i2c
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-stm32/src/i2c')
-rw-r--r--embassy-stm32/src/i2c/mod.rs2
-rw-r--r--embassy-stm32/src/i2c/v1.rs7
-rw-r--r--embassy-stm32/src/i2c/v2.rs8
3 files changed, 16 insertions, 1 deletions
diff --git a/embassy-stm32/src/i2c/mod.rs b/embassy-stm32/src/i2c/mod.rs
index ee60c3f44..0bf430ffc 100644
--- a/embassy-stm32/src/i2c/mod.rs
+++ b/embassy-stm32/src/i2c/mod.rs
@@ -226,7 +226,7 @@ impl<'d, M: Mode> I2c<'d, M, Master> {
226 } 226 }
227 227
228 fn enable_and_init(&mut self, config: Config) { 228 fn enable_and_init(&mut self, config: Config) {
229 self.info.rcc.enable_and_reset(); 229 self.info.rcc.enable_and_reset_without_stop();
230 self.init(config); 230 self.init(config);
231 } 231 }
232} 232}
diff --git a/embassy-stm32/src/i2c/v1.rs b/embassy-stm32/src/i2c/v1.rs
index 128a58db7..81a6d74c1 100644
--- a/embassy-stm32/src/i2c/v1.rs
+++ b/embassy-stm32/src/i2c/v1.rs
@@ -529,6 +529,7 @@ impl<'d, IM: MasterMode> I2c<'d, Async, IM> {
529 529
530 /// Write. 530 /// Write.
531 pub async fn write(&mut self, address: u8, write_buffer: &[u8]) -> Result<(), Error> { 531 pub async fn write(&mut self, address: u8, write_buffer: &[u8]) -> Result<(), Error> {
532 let _scoped_block_stop = self.info.rcc.block_stop();
532 self.write_frame(address, write_buffer, FrameOptions::FirstAndLastFrame) 533 self.write_frame(address, write_buffer, FrameOptions::FirstAndLastFrame)
533 .await?; 534 .await?;
534 535
@@ -537,6 +538,7 @@ impl<'d, IM: MasterMode> I2c<'d, Async, IM> {
537 538
538 /// Read. 539 /// Read.
539 pub async fn read(&mut self, address: u8, read_buffer: &mut [u8]) -> Result<(), Error> { 540 pub async fn read(&mut self, address: u8, read_buffer: &mut [u8]) -> Result<(), Error> {
541 let _scoped_block_stop = self.info.rcc.block_stop();
540 self.read_frame(address, read_buffer, FrameOptions::FirstAndLastFrame) 542 self.read_frame(address, read_buffer, FrameOptions::FirstAndLastFrame)
541 .await?; 543 .await?;
542 544
@@ -701,6 +703,7 @@ impl<'d, IM: MasterMode> I2c<'d, Async, IM> {
701 703
702 /// Write, restart, read. 704 /// Write, restart, read.
703 pub async fn write_read(&mut self, address: u8, write_buffer: &[u8], read_buffer: &mut [u8]) -> Result<(), Error> { 705 pub async fn write_read(&mut self, address: u8, write_buffer: &[u8], read_buffer: &mut [u8]) -> Result<(), Error> {
706 let _scoped_block_stop = self.info.rcc.block_stop();
704 // Check empty read buffer before starting transaction. Otherwise, we would not generate the 707 // Check empty read buffer before starting transaction. Otherwise, we would not generate the
705 // stop condition below. 708 // stop condition below.
706 if read_buffer.is_empty() { 709 if read_buffer.is_empty() {
@@ -719,6 +722,7 @@ impl<'d, IM: MasterMode> I2c<'d, Async, IM> {
719 /// 722 ///
720 /// [transaction contract]: embedded_hal_1::i2c::I2c::transaction 723 /// [transaction contract]: embedded_hal_1::i2c::I2c::transaction
721 pub async fn transaction(&mut self, address: u8, operations: &mut [Operation<'_>]) -> Result<(), Error> { 724 pub async fn transaction(&mut self, address: u8, operations: &mut [Operation<'_>]) -> Result<(), Error> {
725 let _scoped_block_stop = self.info.rcc.block_stop();
722 for (op, frame) in operation_frames(operations)? { 726 for (op, frame) in operation_frames(operations)? {
723 match op { 727 match op {
724 Operation::Read(read_buffer) => self.read_frame(address, read_buffer, frame).await?, 728 Operation::Read(read_buffer) => self.read_frame(address, read_buffer, frame).await?,
@@ -1357,6 +1361,7 @@ impl<'d> I2c<'d, Async, MultiMaster> {
1357 /// (Read/Write) and the matched address. This method will suspend until 1361 /// (Read/Write) and the matched address. This method will suspend until
1358 /// an address match occurs. 1362 /// an address match occurs.
1359 pub async fn listen(&mut self) -> Result<SlaveCommand, Error> { 1363 pub async fn listen(&mut self) -> Result<SlaveCommand, Error> {
1364 let _scoped_block_stop = self.info.rcc.block_stop();
1360 trace!("I2C slave: starting async listen for address match"); 1365 trace!("I2C slave: starting async listen for address match");
1361 let state = self.state; 1366 let state = self.state;
1362 let info = self.info; 1367 let info = self.info;
@@ -1421,6 +1426,7 @@ impl<'d> I2c<'d, Async, MultiMaster> {
1421 /// 1426 ///
1422 /// Returns the number of bytes stored in the buffer (not total received). 1427 /// Returns the number of bytes stored in the buffer (not total received).
1423 pub async fn respond_to_write(&mut self, buffer: &mut [u8]) -> Result<usize, Error> { 1428 pub async fn respond_to_write(&mut self, buffer: &mut [u8]) -> Result<usize, Error> {
1429 let _scoped_block_stop = self.info.rcc.block_stop();
1424 trace!("I2C slave: starting respond_to_write, buffer_len={}", buffer.len()); 1430 trace!("I2C slave: starting respond_to_write, buffer_len={}", buffer.len());
1425 1431
1426 if buffer.is_empty() { 1432 if buffer.is_empty() {
@@ -1454,6 +1460,7 @@ impl<'d> I2c<'d, Async, MultiMaster> {
1454 /// 1460 ///
1455 /// Returns the total number of bytes transmitted (data + padding). 1461 /// Returns the total number of bytes transmitted (data + padding).
1456 pub async fn respond_to_read(&mut self, data: &[u8]) -> Result<usize, Error> { 1462 pub async fn respond_to_read(&mut self, data: &[u8]) -> Result<usize, Error> {
1463 let _scoped_block_stop = self.info.rcc.block_stop();
1457 trace!("I2C slave: starting respond_to_read, data_len={}", data.len()); 1464 trace!("I2C slave: starting respond_to_read, data_len={}", data.len());
1458 1465
1459 if data.is_empty() { 1466 if data.is_empty() {
diff --git a/embassy-stm32/src/i2c/v2.rs b/embassy-stm32/src/i2c/v2.rs
index 7ad9978b1..32ce83d40 100644
--- a/embassy-stm32/src/i2c/v2.rs
+++ b/embassy-stm32/src/i2c/v2.rs
@@ -1075,6 +1075,7 @@ impl<'d, IM: MasterMode> I2c<'d, Async, IM> {
1075 1075
1076 /// Write. 1076 /// Write.
1077 pub async fn write(&mut self, address: u8, write: &[u8]) -> Result<(), Error> { 1077 pub async fn write(&mut self, address: u8, write: &[u8]) -> Result<(), Error> {
1078 let _scoped_block_stop = self.info.rcc.block_stop();
1078 let timeout = self.timeout(); 1079 let timeout = self.timeout();
1079 if write.is_empty() { 1080 if write.is_empty() {
1080 self.write_internal(address.into(), write, true, timeout) 1081 self.write_internal(address.into(), write, true, timeout)
@@ -1089,6 +1090,7 @@ impl<'d, IM: MasterMode> I2c<'d, Async, IM> {
1089 /// 1090 ///
1090 /// The buffers are concatenated in a single write transaction. 1091 /// The buffers are concatenated in a single write transaction.
1091 pub async fn write_vectored(&mut self, address: Address, write: &[&[u8]]) -> Result<(), Error> { 1092 pub async fn write_vectored(&mut self, address: Address, write: &[&[u8]]) -> Result<(), Error> {
1093 let _scoped_block_stop = self.info.rcc.block_stop();
1092 let timeout = self.timeout(); 1094 let timeout = self.timeout();
1093 1095
1094 if write.is_empty() { 1096 if write.is_empty() {
@@ -1120,6 +1122,7 @@ impl<'d, IM: MasterMode> I2c<'d, Async, IM> {
1120 1122
1121 /// Read. 1123 /// Read.
1122 pub async fn read(&mut self, address: u8, buffer: &mut [u8]) -> Result<(), Error> { 1124 pub async fn read(&mut self, address: u8, buffer: &mut [u8]) -> Result<(), Error> {
1125 let _scoped_block_stop = self.info.rcc.block_stop();
1123 let timeout = self.timeout(); 1126 let timeout = self.timeout();
1124 1127
1125 if buffer.is_empty() { 1128 if buffer.is_empty() {
@@ -1132,6 +1135,7 @@ impl<'d, IM: MasterMode> I2c<'d, Async, IM> {
1132 1135
1133 /// Write, restart, read. 1136 /// Write, restart, read.
1134 pub async fn write_read(&mut self, address: u8, write: &[u8], read: &mut [u8]) -> Result<(), Error> { 1137 pub async fn write_read(&mut self, address: u8, write: &[u8], read: &mut [u8]) -> Result<(), Error> {
1138 let _scoped_block_stop = self.info.rcc.block_stop();
1135 let timeout = self.timeout(); 1139 let timeout = self.timeout();
1136 1140
1137 if write.is_empty() { 1141 if write.is_empty() {
@@ -1157,6 +1161,7 @@ impl<'d, IM: MasterMode> I2c<'d, Async, IM> {
1157 /// 1161 ///
1158 /// [transaction contract]: embedded_hal_1::i2c::I2c::transaction 1162 /// [transaction contract]: embedded_hal_1::i2c::I2c::transaction
1159 pub async fn transaction(&mut self, addr: u8, operations: &mut [Operation<'_>]) -> Result<(), Error> { 1163 pub async fn transaction(&mut self, addr: u8, operations: &mut [Operation<'_>]) -> Result<(), Error> {
1164 let _scoped_block_stop = self.info.rcc.block_stop();
1160 if operations.is_empty() { 1165 if operations.is_empty() {
1161 return Err(Error::ZeroLengthTransfer); 1166 return Err(Error::ZeroLengthTransfer);
1162 } 1167 }
@@ -1677,6 +1682,7 @@ impl<'d, M: Mode> I2c<'d, M, MultiMaster> {
1677 /// 1682 ///
1678 /// The listen method is an asynchronous method but it does not require DMA to be asynchronous. 1683 /// The listen method is an asynchronous method but it does not require DMA to be asynchronous.
1679 pub async fn listen(&mut self) -> Result<SlaveCommand, Error> { 1684 pub async fn listen(&mut self) -> Result<SlaveCommand, Error> {
1685 let _scoped_block_stop = self.info.rcc.block_stop();
1680 let state = self.state; 1686 let state = self.state;
1681 self.info.regs.cr1().modify(|reg| { 1687 self.info.regs.cr1().modify(|reg| {
1682 reg.set_addrie(true); 1688 reg.set_addrie(true);
@@ -1733,12 +1739,14 @@ impl<'d> I2c<'d, Async, MultiMaster> {
1733 /// 1739 ///
1734 /// Returns the total number of bytes received. 1740 /// Returns the total number of bytes received.
1735 pub async fn respond_to_write(&mut self, buffer: &mut [u8]) -> Result<usize, Error> { 1741 pub async fn respond_to_write(&mut self, buffer: &mut [u8]) -> Result<usize, Error> {
1742 let _scoped_block_stop = self.info.rcc.block_stop();
1736 let timeout = self.timeout(); 1743 let timeout = self.timeout();
1737 timeout.with(self.read_dma_internal_slave(buffer, timeout)).await 1744 timeout.with(self.read_dma_internal_slave(buffer, timeout)).await
1738 } 1745 }
1739 1746
1740 /// Respond to a read request from an I2C master. 1747 /// Respond to a read request from an I2C master.
1741 pub async fn respond_to_read(&mut self, write: &[u8]) -> Result<SendStatus, Error> { 1748 pub async fn respond_to_read(&mut self, write: &[u8]) -> Result<SendStatus, Error> {
1749 let _scoped_block_stop = self.info.rcc.block_stop();
1742 let timeout = self.timeout(); 1750 let timeout = self.timeout();
1743 timeout.with(self.write_dma_internal_slave(write, timeout)).await 1751 timeout.with(self.write_dma_internal_slave(write, timeout)).await
1744 } 1752 }