예제 #1
0
/**
 * Read PCF8574 \a pcf bit status.
 * \return the pins status or EOF on errors.
 */
int pcf8574_get(Pcf8574 *pcf)
{
	if (!i2c_start_r(PCF8574ID | ((pcf->addr << 1) & 0xF7)))
		return EOF;

	int data = i2c_get(false);
	i2c_stop();
	return data;
}
예제 #2
0
파일: mma8451.c 프로젝트: develersrl/bertos
INLINE int read_reg(AccMMA *mma, uint8_t addr)
{
	i2c_start_w(mma->i2c, mma->dev_addr,  1, I2C_NOSTOP);
	i2c_putc(mma->i2c, addr);
	i2c_start_r(mma->i2c, mma->dev_addr, 1, I2C_STOP);

	uint8_t data = i2c_getc(mma->i2c);
	//LOG_INFO("%.2x\n", data);

	if (i2c_error(mma->i2c))
	{
		LOG_ERR("Errore!\n");
		return -1;
	}

	return data;
}
예제 #3
0
파일: mma8451.c 프로젝트: develersrl/bertos
int mma8451_readData(AccMMA *mma, AccData *data)
{
	ASSERT(data);
	memset(data, 0, sizeof(AccData));

	LOG_INFO("wait data\n");
	event_wait(&data_ready_ev);

	if (data_event_flag)
	{
		data_event_flag = false;
		data->data_status = read_reg(mma, MMA8451_REG_STATUS);
		i2c_start_w(mma->i2c, mma->dev_addr,  1, I2C_NOSTOP);
		i2c_putc(mma->i2c, MMA8451_REG_OUT_X_MSB);
		i2c_start_r(mma->i2c, mma->dev_addr, 6, I2C_STOP);

		memset(buf, 0, sizeof(buf));
		i2c_read(mma->i2c, buf, sizeof(buf));

		if (i2c_error(mma->i2c))
		{
			LOG_ERR("Errore!\n");
			return -1;
		}
		else
		{
			data->x = (int16_t)((buf[0] << 8) | buf[1]) >> 2;
			data->y = (int16_t)((buf[2] << 8) | buf[3]) >> 2;
			data->z = (int16_t)((buf[4] << 8) | buf[5]) >> 2;
		}
	}

	if (acc_event_flag)
	{
		acc_event_flag = false;
		data->ff_status = read_reg(mma,  MMA8451_REG_FF_MT_SRC);
		data->pl_status = read_reg(mma,  MMA8451_REG_PL_STATUS);
		data->tap_status = read_reg(mma, MMA8451_REG_PULSE_SRC);
	}

	return 0;
}