Skip to content

Commit 5f02350

Browse files
committed
Add method for starting I2C transfer
1 parent 39f4ea6 commit 5f02350

File tree

1 file changed

+25
-26
lines changed

1 file changed

+25
-26
lines changed

src/i2c.rs

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,13 @@ use crate::hal::blocking::i2c::{Read, Write, WriteRead};
77
use crate::gpio::gpioa::{PA10, PA9};
88
use crate::gpio::gpiob::{PB6, PB7};
99
use crate::gpio::{AltMode, OpenDrain, Output};
10-
use crate::pac::{i2c1::RegisterBlock, I2C1};
10+
use crate::pac::{
11+
i2c1::{
12+
RegisterBlock,
13+
cr2::RD_WRNW,
14+
},
15+
I2C1,
16+
};
1117
use crate::rcc::Rcc;
1218
use crate::time::Hertz;
1319
use cast::u8;
@@ -131,6 +137,22 @@ where
131137
(self.i2c, self.sda, self.scl)
132138
}
133139

140+
fn start_transfer(&mut self, addr: u8, len: usize, direction: RD_WRNW) {
141+
self.i2c.cr2.write(|w|
142+
w
143+
// Start transfer
144+
.start().set_bit()
145+
// Set number of bytes to transfer
146+
.nbytes().bits(len as u8)
147+
// Set address to transfer to/from
148+
.sadd().bits((addr << 1) as u16)
149+
// Set transfer direction
150+
.rd_wrn().variant(direction)
151+
// End transfer once all bytes have been written
152+
.autoend().set_bit()
153+
);
154+
}
155+
134156
fn send_byte(&self, byte: u8) -> Result<(), Error> {
135157
// Wait until we're ready for sending
136158
while self.i2c.isr.read().txe().bit_is_clear() {}
@@ -186,18 +208,7 @@ where
186208
fn write(&mut self, addr: u8, bytes: &[u8]) -> Result<(), Self::Error> {
187209
while self.i2c.isr.read().busy().is_busy() {}
188210

189-
self.i2c.cr2.write(|w| {
190-
w.start()
191-
.set_bit()
192-
.nbytes()
193-
.bits(bytes.len() as u8)
194-
.sadd()
195-
.bits((addr << 1) as u16)
196-
.rd_wrn()
197-
.clear_bit()
198-
.autoend()
199-
.set_bit()
200-
});
211+
self.start_transfer(addr, bytes.len(), RD_WRNW::WRITE);
201212

202213
// Send bytes
203214
for c in bytes {
@@ -217,19 +228,7 @@ where
217228
fn read(&mut self, addr: u8, buffer: &mut [u8]) -> Result<(), Self::Error> {
218229
while self.i2c.isr.read().busy().is_busy() {}
219230

220-
self.i2c.cr2.write(|w| {
221-
w.start()
222-
.set_bit()
223-
.nbytes()
224-
.bits(buffer.len() as u8)
225-
.sadd()
226-
.bits((addr << 1) as u16)
227-
// Request read transfer
228-
.rd_wrn()
229-
.read()
230-
.autoend()
231-
.set_bit()
232-
});
231+
self.start_transfer(addr, buffer.len(), RD_WRNW::READ);
233232

234233
// Receive bytes into buffer
235234
for c in buffer {

0 commit comments

Comments
 (0)