/** * @brief used to read multiple bytes of data from the memory. * This should be sent by I2C. * * @param sl_handle Unused, pass as NULL * @param slaveAddr I2C slave address of device. * @param memAddr The location in the memory to read from. * @param length Length of burst data. * @param data Pointer to block of data. * * @return Zero if successful; an error code otherwise */ inv_error_t inv_serial_read_mem( void *sl_handle, unsigned char slaveAddr, unsigned short memAddr, unsigned short length, unsigned char *data ) { inv_error_t result; unsigned char tmpAddr; unsigned char memAddress[1]; uint_fast16_t bytesRead = 0; if (memAddr & 0xFF + length > MPU_MEM_BANK_SIZE) { //_SerialDebug("inv_serial_read_mem: memory read length (%d B) " //"extends beyond its limits (%d) " //"if started at location %d\n", //length, MPU_MEM_BANK_SIZE, memAddr & 0xFF); return INV_ERROR_INVALID_PARAMETER; } /* Write bank - first time only */ tmpAddr = MPUREG_BANK_SEL; memAddress[0] = memAddr >> 8; result = i2c_readfrom((uint16_t)slaveAddr, (uint8_t)tmpAddr, memAddress, 1 ); while (bytesRead < length) { unsigned short thisLen = MIN(SERIAL_MAX_TRANSFER_SIZE, length-bytesRead); /* Write address */ tmpAddr = MPUREG_MEM_START_ADDR; memAddress[0] = memAddr+bytesRead; // valid because we don't allow going // beyond the MPU_MEM_BANK_SIZE boundary result = i2c_writeto((uint16_t)slaveAddr,(uint8_t)tmpAddr, memAddress, 1); /* Read actual data */ result = i2c_readfrom(slaveAddr, MPUREG_MEM_R_W, &data[bytesRead], thisLen); bytesRead += thisLen; } return result; }
/** * @brief used to read multiple bytes of data from registers. * This should be sent by I2C. * * @param sl_handle Unused, pass as NULL * @param slaveAddr I2C slave address of device. * @param registerAddr Register address to read. * @param length Length of burst of data. * @param data Pointer to block of data. * * @return Zero if successful; an error code otherwise */ inv_error_t inv_serial_read( void *sl_handle, unsigned char slaveAddr, unsigned char registerAddr, unsigned short length, unsigned char *data ) { inv_error_t result; if (slaveAddr == 0x68 && (registerAddr==MPUREG_FIFO_R_W || registerAddr==MPUREG_MEM_R_W)) { return INV_ERROR_INVALID_PARAMETER; } result = i2c_readfrom(slaveAddr, registerAddr, data, length); return INV_SUCCESS; }
/// \method filtered_xyz() /// Get a 3-tuple of filtered x, y and z values. STATIC mp_obj_t pyb_accel_filtered_xyz(mp_obj_t self_in) { pyb_accel_obj_t *self = self_in; memmove(self->buf, self->buf + NUM_AXIS, NUM_AXIS * (FILT_DEPTH - 1) * sizeof(int16_t)); uint8_t data[NUM_AXIS] = { MMA_REG_X }; i2c_writeto(I2C1, MMA_ADDR, data, 1, false); i2c_readfrom(I2C1, MMA_ADDR, data, 3, true); mp_obj_t tuple[NUM_AXIS]; for (int i = 0; i < NUM_AXIS; i++) { self->buf[NUM_AXIS * (FILT_DEPTH - 1) + i] = MMA_AXIS_SIGNED_VALUE(data[i]); int32_t val = 0; for (int j = 0; j < FILT_DEPTH; j++) { val += self->buf[i + NUM_AXIS * j]; } tuple[i] = mp_obj_new_int(val); } return mp_obj_new_tuple(3, tuple); }
/** * @brief used to read multiple bytes of data from the fifo. * This should be sent by I2C. * * @param sl_handle Unused, pass as NULL * @param slaveAddr I2C slave address of device. * @param length Number of bytes to read from fifo. * @param data Pointer to write fifo data. * * @return Zero if successful; an error code otherwise */ inv_error_t inv_serial_read_fifo( void *sl_handle, unsigned char slaveAddr, unsigned short length, unsigned char *data ) { uint16_t bytesRead = 0; inv_error_t result; if (length>FIFO_HW_SIZE) { //_SerialDebug("inv_serial_read_fifo: " // "maximum fifo read length is %d\n", FIFO_HW_SIZE); return INV_ERROR_INVALID_PARAMETER; } while (bytesRead < length) { unsigned short thisLen = MIN(SERIAL_MAX_TRANSFER_SIZE, length-bytesRead); result = i2c_readfrom(slaveAddr, MPUREG_FIFO_R_W, data, thisLen); bytesRead += thisLen; } return INV_SUCCESS; }
/// \method tilt() /// Get the tilt register. STATIC mp_obj_t pyb_accel_tilt(mp_obj_t self_in) { uint8_t data[1] = { MMA_REG_TILT }; i2c_writeto(I2C1, MMA_ADDR, data, 1, false); i2c_readfrom(I2C1, MMA_ADDR, data, 1, true); return mp_obj_new_int(data[0]); }
STATIC mp_obj_t read_axis(int axis) { uint8_t data[1] = { axis }; i2c_writeto(I2C1, MMA_ADDR, data, 1, false); i2c_readfrom(I2C1, MMA_ADDR, data, 1, true); return mp_obj_new_int(MMA_AXIS_SIGNED_VALUE(data[0])); }