コード例 #1
0
ファイル: SHT1x.cpp プロジェクト: vladamatena/CDEECO
/**
 * 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;
}
コード例 #2
0
ファイル: SHT1x.cpp プロジェクト: vladamatena/CDEECO
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;
}
コード例 #3
0
static void i2cBitTx(uint8_t instance, char bit){

    if(bit) sdaHi(instance);
    else sdaLo(instance);
    i2cDelay(instance);
    sclHi(instance);
    i2cDelay(instance);
    sclLo(instance);
}
コード例 #4
0
static void i2cStop(uint8_t instance){

    i2cDelay(instance);
    sdaLo(instance);
    i2cDelay(instance);
    sclHi(instance);
    i2cDelay(instance);
    sdaHi(instance);
}
コード例 #5
0
static void i2cStart(uint8_t instance){

    sdaHi(instance);
    sclHi(instance);
    i2cDelay(instance);
    sdaLo(instance);
    i2cDelay(instance);
    sclLo(instance);
    i2cDelay(instance);
}
コード例 #6
0
ファイル: SHT1x.cpp プロジェクト: vladamatena/CDEECO
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();
}
コード例 #7
0
ファイル: SHT1x.cpp プロジェクト: vladamatena/CDEECO
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();
}
コード例 #8
0
static char i2cBitRx(uint8_t instance){

    char ret;

    sdaHi(instance);
    i2cDelay(instance);
    sclHi(instance);
    i2cDelay(instance);
    ret = sdaRd(instance);
    sclLo(instance);

    return ret;
}
コード例 #9
0
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;
}