예제 #1
0
파일: lis3dh.c 프로젝트: g-vidal/upm
int
lis3dh_read_regs(const lis3dh_context dev, uint8_t reg, uint8_t* buffer, int len)
{
    assert(dev != NULL);

    if (dev->spi) {
        // Needed for read with address autoincrement
        reg |= 0xC0;

        uint8_t sbuf[len + 1];
        memset((char*) sbuf, 0, len + 1);
        sbuf[0] = reg;

        _csOn(dev);
        if (mraa_spi_transfer_buf(dev->spi, sbuf, sbuf, len + 1)) {
            _csOff(dev);
            printf("%s: mraa_spi_transfer_buf() failed\n", __FUNCTION__);
            return -1;
        }
        _csOff(dev);

        // Now copy it into user buffer
        for (int i = 0; i < len; i++) {
            buffer[i] = sbuf[i + 1];
        }
    } else {
        // Needed for read with address autoincrement
        reg |= 0x80;
        if (mraa_i2c_read_bytes_data(dev->i2c, reg, buffer, len) != len) {
            return -1;
        }
    }

    return len;
}
예제 #2
0
파일: bno055.c 프로젝트: chihchun/upm
upm_result_t bno055_read_regs(const bno055_context dev, uint8_t reg,
                              uint8_t *buffer, size_t len)
{
    assert(dev != NULL);

    if (mraa_i2c_read_bytes_data(dev->i2c, reg, buffer, len) < 0)
    {
        printf("%s: mraa_i2c_read_bytes() failed\n",
               __FUNCTION__);
        return UPM_ERROR_OPERATION_FAILED;
    }

    return UPM_SUCCESS;
}
예제 #3
0
파일: mpu.c 프로젝트: Liwsh/Robot
void getangle()
{
	mraa_i2c_read_bytes_data(i2c,MPU6050_RA_ACCEL_XOUT_H,buffer,14);
		 ax = (((int16_t)buffer[0]) << 8) | buffer[1];
		 ay = (((int16_t)buffer[2]) << 8) | buffer[3];
		 az = (((int16_t)buffer[4]) << 8) | buffer[5];
		 gx = (((int16_t)buffer[8]) << 8) | buffer[9];
		 gy = (((int16_t)buffer[10]) << 8) | buffer[11];
		 gz = (((int16_t)buffer[12]) << 8) | buffer[13];
//    angleAx=atan2(ax,az)*180/PI;//计算与x轴夹角
//    gyroGy=-gy/131.00;//计算角速度
    angleAx=atan2(ay,az)*180/PI;//计算与y轴夹角
    gyroGy=-gx/131.00;//
    yijielvbo(angleAx,gyroGy);//一阶滤波
    erjielvbo(angleAx,gyroGy);//二阶滤波
    kalman_Filter(angleAx,gyroGy);   //卡尔曼滤波
}
예제 #4
0
파일: kx122.c 프로젝트: g-vidal/upm
static upm_result_t kx122_read_registers(const kx122_context dev, uint8_t reg, uint8_t *buffer, uint len)
{
  if(dev->using_spi){
    reg |= SPI_READ;

    uint8_t spi_data_buffer[len + 1];
    spi_data_buffer[0] = reg;

    kx122_chip_select_on(dev);

    if(mraa_spi_transfer_buf(dev->spi,spi_data_buffer,spi_data_buffer,
    (sizeof(spi_data_buffer) / sizeof(uint8_t))) != MRAA_SUCCESS){
      printf("%s: mraa_spi_transfer_buf() failed.\n", __FUNCTION__);

      kx122_chip_select_off(dev);
      return UPM_ERROR_OPERATION_FAILED;
    }

    for (size_t i = 0; i < len; i++) {
      buffer[i] = spi_data_buffer[i + 1];
    }

    kx122_chip_select_off(dev);
    return UPM_SUCCESS;
  }
  else{
      uint8_t data_buffer[len];
      if(mraa_i2c_read_bytes_data(dev->i2c,reg,data_buffer,len) != (int)len){
        return UPM_ERROR_OPERATION_FAILED;
      }
      else{
        for(size_t i = 0; i < len; i++){
          buffer[i] = data_buffer[i];
        }
        return UPM_SUCCESS;
      }
  }
}
int  edison_i2c_read(unsigned char slave_addr,
                    unsigned char reg_addr,
                    unsigned char length,
                    unsigned char *data)
{

	int ret = mraa_i2c_read_bytes_data(/*mraa_i2c_context*/ i2c, /*uint8_t command*/reg_addr, /*uint8_t* data*/ data, /*int length*/ length);

	if (ret == length){
		return 0;
	}
	else if (ret == -1){
    	fprintf(stderr, "MRAA i2c bus read bytes operation failed.");
		return -1;
	}
	else if (ret > 0 || ret < length){
		fprintf(stderr, "MRAA i2c the length of bus bytes were read is not equal to which was needed.");
		return -1;
	}
	else{
		fprintf(stderr, "MRAA i2c bus read bytes length error.");
				return -1;
	}

	/*
	unsigned long start, cur;
    if (!i2c.enabled)
        return -1;
    if (!length)
        return 0;

    // Populate struct.
    i2c.state = STATE_READING;
    i2c.slave_reg = reg_addr;
    i2c.slave_reg_written = 0;
    i2c.data = data;
    i2c.length = length;

    I2CSA = slave_addr;
    CTL1 |= UCTR | UCTXSTT;

    msp430_get_clock_ms(&start);
    while (i2c.state != STATE_WAITING) {
        __bis_SR_register(LPM0_bits + GIE);
        msp430_get_clock_ms(&cur);
        if (cur >= (start + I2C_TIMEOUT_MS)) {
            CTL1 |= UCTXSTP;
            i2c.state = STATE_WAITING;
            msp430_i2c_disable();
            msp430_delay_ms(1);
            CLEAR_SCL();
            CLEAR_SDA();
            msp430_delay_ms(1);
            SET_SCL();
            SET_SDA();
            msp430_i2c_enable();
            return -1;
        }
    }
    return 0;
    */
}
예제 #6
0
/**
 * Fast call for multiple bytes read from LSM9DS0 Accelerometer / Magnetometer
 *
 */
void lsm_xm_read_bytes(unsigned char reg, unsigned char *buf, int len) {
	mraa_i2c_address(i2c, LSM_ADDRESS_XM);
	if(mraa_i2c_read_bytes_data(i2c, reg|0x80, buf, len) == -1) {
		printf("read multiple bytes from LSM9DS0 XM failed...\n");
	}
}
예제 #7
0
파일: i2c.hpp 프로젝트: 8devices/mraa
 /**
  * Read length bytes from the bus into *data pointer starting from
  * an i2c register
  *
  * @param reg Register to read from
  * @param data pointer to the byte array to read data in to
  * @param length max number of bytes to read
  * @return length passed to the function or -1
  */
 int
 readBytesReg(uint8_t reg, uint8_t* data, int length)
 {
     return mraa_i2c_read_bytes_data(m_i2c, reg, data, length);
 }