static void i2cStop(uint8_t instance){ i2cDelay(instance); sdaLo(instance); i2cDelay(instance); sclHi(instance); i2cDelay(instance); sdaHi(instance); }
static void i2cBitTx(uint8_t instance, char bit){ if(bit) sdaHi(instance); else sdaLo(instance); i2cDelay(instance); sclHi(instance); i2cDelay(instance); sclLo(instance); }
static void i2cStart(uint8_t instance){ sdaHi(instance); sclHi(instance); i2cDelay(instance); sdaLo(instance); i2cDelay(instance); sclLo(instance); i2cDelay(instance); }
void SoftI2C::stop() { pinMode(_dataPin, OUTPUT); digitalWrite(_dataPin, LOW); digitalWrite(_clockPin, HIGH); i2cDelay(); digitalWrite(_dataPin, HIGH); i2cDelay(); started = false; inWrite = false; }
bool SoftI2C::readBit() { pinMode(_dataPin, INPUT); digitalWrite(_dataPin, HIGH); digitalWrite(_clockPin, HIGH); bool bit = digitalRead(_dataPin); i2cDelay(); digitalWrite(_clockPin, LOW); i2cDelay(); return bit; }
static char i2cBitRx(uint8_t instance){ char ret; sdaHi(instance); i2cDelay(instance); sclHi(instance); i2cDelay(instance); ret = sdaRd(instance); sclLo(instance); return ret; }
void SoftI2C::writeBit(bool bit) { pinMode(_dataPin, OUTPUT); if (bit) digitalWrite(_dataPin, HIGH); else digitalWrite(_dataPin, LOW); i2cDelay(); digitalWrite(_clockPin, HIGH); i2cDelay(); digitalWrite(_clockPin, LOW); i2cDelay(); }
void SoftI2C::start() { pinMode(_dataPin, OUTPUT); if (started) { // Already started, so send a restart condition. digitalWrite(_dataPin, HIGH); digitalWrite(_clockPin, HIGH); i2cDelay(); } digitalWrite(_dataPin, LOW); i2cDelay(); digitalWrite(_clockPin, LOW); i2cDelay(); started = true; acked = true; }
uint8_t i2cInit(uint8_t instance, uint32_t clock){ uint8_t i; if(instance >= I2C_NUM_INSTANCES) return I2C_ERR_INVAL; gpioSetFun(pins[instance][0], GPIO_FUNC_GPIO); gpioSetFun(pins[instance][1], GPIO_FUNC_GPIO); gpioSetPullup(pins[instance][0], 1); gpioSetPullup(pins[instance][1], 1); gpioSetDir(pins[instance][0], 0); gpioSetDir(pins[instance][1], 0); gpioSetVal(pins[instance][0], 0); gpioSetVal(pins[instance][1], 0); sdaHi(instance); sclHi(instance); delayTicks[instance] = (TICKS_PER_MS * 1000) / (8 * clock * 2); i2cDelay(instance); i2cDelay(instance); for (i = 0; i < 100; i++) // Try to reset the bus i2cBitTx(instance, 1); i2cStop(instance); #if !I2C_BITBANG PMC_EnablePeripheral(instance ? ID_TWI1 : ID_TWI0); gpioSetFun(pins[instance][0], GPIO_FUNC_A); gpioSetFun(pins[instance][1], GPIO_FUNC_A); TWI_ConfigureMaster(instance ? TWI1 : TWI0, clock, BOARD_MCK); #if I2C_INT_PDC NVIC_EnableIRQ(instance ? TWI1_IRQn : TWI0_IRQn); if (instance) TWI1->TWI_IDR = 0x00F77; else TWI0->TWI_IDR = 0x00F77; #endif #endif return I2C_ALL_OK; }