#include "project.h" #ifndef SLIM #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 (); } #endif