/** * 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; }
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; }
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; }