summaryrefslogtreecommitdiffstats
path: root/humidity_sensors/app/i2c_bb.c
diff options
context:
space:
mode:
Diffstat (limited to 'humidity_sensors/app/i2c_bb.c')
-rw-r--r--humidity_sensors/app/i2c_bb.c157
1 files changed, 157 insertions, 0 deletions
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);
+}