From 39687aa7c7b138d2a1ce2551f2400bade3b1a6fb Mon Sep 17 00:00:00 2001 From: James McKenzie Date: Sun, 2 Aug 2015 23:30:06 +0100 Subject: fis --- app/i2c.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 app/i2c.c (limited to 'app/i2c.c') diff --git a/app/i2c.c b/app/i2c.c new file mode 100644 index 0000000..89249d0 --- /dev/null +++ b/app/i2c.c @@ -0,0 +1,132 @@ +#include "project.h" + + +#define GPIO_SCL GPIOB +#define GPIO_SDA GPIOB +#define SCL GPIO13 +#define SDA GPIO14 + +#define I2C_BB_DELAY do { delay_us(1); } while (0) + +int +i2c_bb (int scl, int sda) +{ + if (scl) + gpio_set (GPIO_SCL, SCL); + else + gpio_clear (GPIO_SCL, SCL); + if (sda) + gpio_set (GPIO_SDA, SDA); + else + gpio_clear (GPIO_SDA, SDA); + + return ! !(gpio_get (GPIO_SDA, SDA) & SDA); + +} + + +void +i2c_bb_start (void) +{ + i2c_bb (1, 1); + I2C_BB_DELAY; + i2c_bb (1, 0); + I2C_BB_DELAY; + i2c_bb (0, 0); + I2C_BB_DELAY; +} + + +void +i2c_bb_stop (void) +{ + i2c_bb (0, 0); + I2C_BB_DELAY; + i2c_bb (1, 0); + I2C_BB_DELAY; + i2c_bb (1, 1); + I2C_BB_DELAY; +} + +int +i2c_bb_send_data (uint8_t v) +{ + int c; + + + for (c = 0x80; c; c >>= 1) + { + i2c_bb (0, c & v); + I2C_BB_DELAY; + i2c_bb (1, c & v); + I2C_BB_DELAY; + i2c_bb (0, c & v); + I2C_BB_DELAY; + } + + i2c_bb (0, 1); + I2C_BB_DELAY; + i2c_bb (1, 1); + I2C_BB_DELAY; + c = i2c_bb (1, 1); + i2c_bb (0, 1); + + return c; +} + + +int +i2c_bb_start_transaction (uint8_t a, int wnr) +{ + int ret; + + i2c_bb_start (); + ret = i2c_bb_send_data (a << 1 | ! !(wnr)); + + + return ret; +} + +#if 0 +void +i2c_bb_scan (void) +{ + int i, r; + + return; + i2cp_reset (); + + printf ("Probing bus\r\n"); + for (i = 0; i < 128; ++i) + { + while (i2cp_lock ()); + i2cp_start (); + i2cp_abort_start (); + i2cp_stop (); + i2cp_abort_stop (); + r = i2cp_start_transaction (i, I2C_WRITE); + i2cp_stop (); + i2cp_unlock (); + if (!r) + printf ("Found device at address 0x%x\r\n", i); + usart1_drain (); + } + printf ("Done\r\n"); + i2cp_reset (); + +} +#endif + +void +i2c_bb_init (void) +{ + gpio_set_mode (GPIO_SCL, GPIO_MODE_OUTPUT_50_MHZ, + GPIO_CNF_OUTPUT_OPENDRAIN, SCL); + gpio_set_mode (GPIO_SDA, GPIO_MODE_OUTPUT_50_MHZ, + GPIO_CNF_OUTPUT_OPENDRAIN, SDA); + + i2c_bb_start (); + i2c_bb_stop (); + + +} -- cgit v1.2.3