#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); }