diff options
author | James McKenzie <git@madingley.org> | 2015-08-02 23:37:49 +0100 |
---|---|---|
committer | James McKenzie <git@madingley.org> | 2015-08-02 23:37:49 +0100 |
commit | ff7e2824011f787acd730ac788b06610c6e40132 (patch) | |
tree | 1e9ab49d2f1b5513e93f9df324e4fc72bfefc175 /app/i2c1.c | |
parent | 39687aa7c7b138d2a1ce2551f2400bade3b1a6fb (diff) | |
download | candlestick-ff7e2824011f787acd730ac788b06610c6e40132.tar.gz candlestick-ff7e2824011f787acd730ac788b06610c6e40132.tar.bz2 candlestick-ff7e2824011f787acd730ac788b06610c6e40132.zip |
fish
Diffstat (limited to 'app/i2c1.c')
-rw-r--r-- | app/i2c1.c | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/app/i2c1.c b/app/i2c1.c new file mode 100644 index 0000000..db60931 --- /dev/null +++ b/app/i2c1.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 +i2c1_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 +i2c1_bb_start (void) +{ + i2c1_bb (1, 1); + I2C_BB_DELAY; + i2c1_bb (1, 0); + I2C_BB_DELAY; + i2c1_bb (0, 0); + I2C_BB_DELAY; +} + + +void +i2c1_bb_stop (void) +{ + i2c1_bb (0, 0); + I2C_BB_DELAY; + i2c1_bb (1, 0); + I2C_BB_DELAY; + i2c1_bb (1, 1); + I2C_BB_DELAY; +} + +int +i2c1_bb_send_data (uint8_t v) +{ + int c; + + + for (c = 0x80; c; c >>= 1) + { + i2c1_bb (0, c & v); + I2C_BB_DELAY; + i2c1_bb (1, c & v); + I2C_BB_DELAY; + i2c1_bb (0, c & v); + I2C_BB_DELAY; + } + + i2c1_bb (0, 1); + I2C_BB_DELAY; + i2c1_bb (1, 1); + I2C_BB_DELAY; + c = i2c1_bb (1, 1); + i2c1_bb (0, 1); + + return c; +} + + +int +i2c1_bb_start_transaction (uint8_t a, int wnr) +{ + int ret; + + i2c1_bb_start (); + ret = i2c1_bb_send_data (a << 1 | ! !(wnr)); + + + return ret; +} + +#if 0 +void +i2c1_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 +i2c1_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); + + i2c1_bb_start (); + i2c1_bb_stop (); + + +} |