aboutsummaryrefslogtreecommitdiff
path: root/examples/rp235x/src/bin/i2c_blocking.rs
diff options
context:
space:
mode:
Diffstat (limited to 'examples/rp235x/src/bin/i2c_blocking.rs')
-rw-r--r--examples/rp235x/src/bin/i2c_blocking.rs74
1 files changed, 74 insertions, 0 deletions
diff --git a/examples/rp235x/src/bin/i2c_blocking.rs b/examples/rp235x/src/bin/i2c_blocking.rs
new file mode 100644
index 000000000..c9c8a2760
--- /dev/null
+++ b/examples/rp235x/src/bin/i2c_blocking.rs
@@ -0,0 +1,74 @@
1//! This example shows how to communicate using i2c with external chips.
2//!
3//! Example written for the [`MCP23017 16-Bit I2C I/O Expander with Serial Interface`] chip.
4//! (https://www.microchip.com/en-us/product/mcp23017)
5
6#![no_std]
7#![no_main]
8
9use defmt::*;
10use embassy_executor::Spawner;
11use embassy_rp::i2c::{self, Config};
12use embassy_time::Timer;
13use embedded_hal_1::i2c::I2c;
14use {defmt_rtt as _, panic_probe as _};
15
16#[allow(dead_code)]
17mod mcp23017 {
18 pub const ADDR: u8 = 0x20; // default addr
19
20 pub const IODIRA: u8 = 0x00;
21 pub const IPOLA: u8 = 0x02;
22 pub const GPINTENA: u8 = 0x04;
23 pub const DEFVALA: u8 = 0x06;
24 pub const INTCONA: u8 = 0x08;
25 pub const IOCONA: u8 = 0x0A;
26 pub const GPPUA: u8 = 0x0C;
27 pub const INTFA: u8 = 0x0E;
28 pub const INTCAPA: u8 = 0x10;
29 pub const GPIOA: u8 = 0x12;
30 pub const OLATA: u8 = 0x14;
31 pub const IODIRB: u8 = 0x01;
32 pub const IPOLB: u8 = 0x03;
33 pub const GPINTENB: u8 = 0x05;
34 pub const DEFVALB: u8 = 0x07;
35 pub const INTCONB: u8 = 0x09;
36 pub const IOCONB: u8 = 0x0B;
37 pub const GPPUB: u8 = 0x0D;
38 pub const INTFB: u8 = 0x0F;
39 pub const INTCAPB: u8 = 0x11;
40 pub const GPIOB: u8 = 0x13;
41 pub const OLATB: u8 = 0x15;
42}
43
44#[embassy_executor::main]
45async fn main(_spawner: Spawner) {
46 let p = embassy_rp::init(Default::default());
47
48 let sda = p.PIN_14;
49 let scl = p.PIN_15;
50
51 info!("set up i2c ");
52 let mut i2c = i2c::I2c::new_blocking(p.I2C1, scl, sda, Config::default());
53
54 use mcp23017::*;
55
56 info!("init mcp23017 config for IxpandO");
57 // init - a outputs, b inputs
58 i2c.write(ADDR, &[IODIRA, 0x00]).unwrap();
59 i2c.write(ADDR, &[IODIRB, 0xff]).unwrap();
60 i2c.write(ADDR, &[GPPUB, 0xff]).unwrap(); // pullups
61
62 let mut val = 0xaa;
63 loop {
64 let mut portb = [0];
65
66 i2c.write(mcp23017::ADDR, &[GPIOA, val]).unwrap();
67 i2c.write_read(mcp23017::ADDR, &[GPIOB], &mut portb).unwrap();
68
69 info!("portb = {:02x}", portb[0]);
70 val = !val;
71
72 Timer::after_secs(1).await;
73 }
74}