/** * Send byte to sensor * * @param data Byte to send * @return True when successful, false otherwise */ bool SHT1x::sendByte(uint8_t data) { // We should not be interrupted when talking to sensor taskENTER_CRITICAL(); // Send command data for(int i = 0; i < 8; ++i) { if(data & 0b10000000) sdaHi(); else sdaLo(); data <<= 1; delayTimer.uDelay(COM_DELAY); sclPulse(); } // Read acknowledge sdaHi(); delayTimer.mDelay(5); uint8_t ack = sdaRead(); sclPulse(); taskEXIT_CRITICAL(); return !ack; }
uint8_t SHT1x::receiveByte() { // We should not be interrupted when talking to sensor taskENTER_CRITICAL(); // Receive data uint8_t data = 0; for(int i = 0; i < 8; ++i) { data <<= 1; if(sdaRead()) data |= 1; sclPulse(); delayTimer.uDelay(COM_DELAY); } // Acknowledge received data sdaLo(); delayTimer.uDelay(COM_DELAY); sclPulse(); sdaHi(); delayTimer.uDelay(COM_DELAY); taskEXIT_CRITICAL(); 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(); }
void SHT1x::init() { // Initialize GPIO RCC_AHB1PeriphClockCmd(properties.gpioClk, ENABLE); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = properties.sclPin | properties.sdaPin; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(properties.gpio, &GPIO_InitStruct); sclLo(); sdaHi(); }
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; }