From fb71edfb6bc0702aa2ee1cc73d0822bbc37674ad Mon Sep 17 00:00:00 2001 From: fishsoupisgood Date: Sun, 24 Jan 2021 09:23:12 +0000 Subject: working-ish sensor --- humidity_sensors/app/i2c_bb.c | 157 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 humidity_sensors/app/i2c_bb.c (limited to 'humidity_sensors/app/i2c_bb.c') diff --git a/humidity_sensors/app/i2c_bb.c b/humidity_sensors/app/i2c_bb.c new file mode 100644 index 0000000..7d0d807 --- /dev/null +++ b/humidity_sensors/app/i2c_bb.c @@ -0,0 +1,157 @@ +#include "project.h" + + +#define SCL ((u8) 1 <<4) +#define SDA ((u8) 1 <<5) +#define BANK GPIOB + + +static u8 +set (u8 sda, u8 scl) +{ + u8 ret; + + if (sda) + GPIO_WriteHigh (BANK, SDA); + else + GPIO_WriteLow (BANK, SDA); + + if (scl) + GPIO_WriteHigh (BANK, SCL); + else + GPIO_WriteLow (BANK, SCL); + + delay (4); + //delay_us (10); + ret = (GPIO_ReadInputData (BANK) & SDA) ? 1 : 0; + + return ret; +} + + + + +u8 +i2cb_send (u8 wot) +{ + u8 i; + + for (i = 0; i < 8; ++i) { + set (wot & 0x80, 0); + set (wot & 0x80, 1); + set (wot & 0x80, 0); + wot <<= 1; + } + + set (1, 0); + i = set (1, 1); + set (1, 0); + + return i; +} + +u8 +i2cb_send_addr (u8 addr, u8 rnw) +{ + return i2cb_send (addr << 1 | rnw); +} + +int +i2cb_send_data (u8 d) +{ + return i2cb_send (d); +} + +u8 +i2cb_read (u8 ack) +{ + u8 i, wot = 0; + + for (i = 0; i < 8; ++i) { + wot <<= 1; + set (1, 0); + wot |= set (1, 1); + set (1, 0); + } + + set (ack, 0); + set (ack, 1); + set (ack, 0); + return wot; +} + + +void +i2cb_start (void) +{ + set (1, 1); + set (0, 1); + set (0, 0); +} + +void +i2cb_stop (void) +{ + set (0, 0); + set (0, 1); + set (1, 1); +} + + +int +i2cb_start_transaction (u8 a, u8 rnw) +{ + i2cb_start(); + return i2cb_send_addr (a, rnw); + +} + + +void +i2cb_reset (void) +{ + i2cb_start(); + i2cb_stop(); + i2cb_start(); + i2cb_stop(); +} + + + +#if 0 +void +i2cb_scan (void) +{ + u8 r; + u16 i; + + i2cb_reset(); + + for (i = 0; i < 128; ++i) { + i2cb_start(); + i2cb_stop(); + i2cb_start(); + r = i2cb_send ((i << 1) | I2C_WRITE); + i2cb_stop(); + + if (!r) + printf ("target found at %02x\n", i); + + } + + i2cb_reset(); + +} +#endif + +void +i2cb_init (void) +{ + GPIO_Init (BANK, SDA, GPIO_MODE_OUT_OD_HIZ_SLOW); + GPIO_Init (BANK, SCL, GPIO_MODE_OUT_OD_HIZ_SLOW); + + set (1, 1); + set (0, 1); + set (1, 0); + set (1, 1); +} -- cgit v1.2.3