uint8_t PortI2C::write(uint8_t data) const { sclLo(); for (uint8_t mask = 0x80; mask != 0; mask >>= 1) { sdaOut(data & mask); sclHi(); sclLo(); } sdaOut(1); sclHi(); uint8_t ack = ! sdaIn(); sclLo(); return ack; }
uint8_t i2c_write(uint8_t data) { sclLo(); for (uint8_t mask = 0x80; mask != 0; mask >>= 1) { sdaOut(data & mask); sclHi(); sclLo(); } sdaOut(1); sclHi(); uint8_t ack = ! sdaIn(); sclLo(); return ack; }
PortI2C::PortI2C (uint8_t num, uint8_t rate) : Port (num), uswait (rate) { sdaOut(1); mode2(OUTPUT); sclHi(); }
uint8_t PortI2C::read(uint8_t last) const { uint8_t data = 0; for (uint8_t mask = 0x80; mask != 0; mask >>= 1) { sclHi(); if (sdaIn()) data |= mask; sclLo(); } sdaOut(last); sclHi(); sclLo(); if (last) stop(); sdaOut(1); return data; }
uint8_t i2c_read(uint8_t last) { uint8_t data = 0; for (uint8_t mask = 0x80; mask != 0; mask >>= 1) { sclHi(); if (sdaIn()) data |= mask; sclLo(); } sdaOut(last); sclHi(); sclLo(); if (last) i2c_stop(); sdaOut(1); return data; }
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 i2cStop(uint8_t instance){ i2cDelay(instance); sdaLo(instance); i2cDelay(instance); sclHi(instance); i2cDelay(instance); sdaHi(instance); }
static void i2cStart(uint8_t instance){ sdaHi(instance); sclHi(instance); i2cDelay(instance); sdaLo(instance); i2cDelay(instance); sclLo(instance); i2cDelay(instance); }
void SHT1x::startCommand() { // Command start sequence sdaHi(); sclLo(); delayTimer.uDelay(COM_DELAY); sclHi(); delayTimer.uDelay(COM_DELAY); sdaLo(); delayTimer.uDelay(COM_DELAY); sclLo(); delayTimer.uDelay(COM_DELAY); sclHi(); delayTimer.uDelay(COM_DELAY); sdaHi(); delayTimer.uDelay(COM_DELAY); sclLo(); }
static char i2cBitRx(uint8_t instance){ char ret; sdaHi(instance); i2cDelay(instance); sclHi(instance); i2cDelay(instance); ret = sdaRd(instance); sclLo(instance); return ret; }
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; }
void PortI2C::stop() const { sdaOut(0); sclHi(); sdaOut(1); }
uint8_t PortI2C::start(uint8_t addr) const { sclLo(); sclHi(); sdaOut(0); return write(addr); }
void SHT1x::sclPulse() { sclHi(); delayTimer.uDelay(COM_DELAY); sclLo(); }
void i2c_stop() { sdaOut(0); sclHi(); sdaOut(1); }
void i2c_init () { sdaOut(1); bitWrite(SDA_RD,SDA_PIN,1); bitWrite(SCL_RD,SCL_PIN,1); sclHi(); }