Exemplo n.º 1
0
/**
 *  @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;
}
Exemplo n.º 2
0
/**
 *  @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;
}
Exemplo n.º 3
0
/// \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);
}
Exemplo n.º 4
0
/**
 *  @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;
}
Exemplo n.º 5
0
/// \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]);
}
Exemplo n.º 6
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]));
}