1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-04-10 02:02:21 +02:00

Reading gyro registers directly working.

This commit is contained in:
James Cotton 2011-08-13 08:33:46 -05:00
parent e7990f5d43
commit 13e5f4123a
3 changed files with 39 additions and 62 deletions

View File

@ -481,19 +481,24 @@ int main()
//if(PIOS_BMA180_Test() != 0) //if(PIOS_BMA180_Test() != 0)
// panic(2); // panic(2);
if(PIOS_HMC5883_Test() != 0) //if(PIOS_HMC5883_Test() != 0)
panic(3); // panic(3);
if(PIOS_BMP085_Test() != 0) //if(PIOS_BMP085_Test() != 0)
panic(4); // panic(4);
while(1) { uint32_t count = 500;
gyro_error = PIOS_IMU3000_ReadFifo((uint8_t *) gyro, sizeof(gyro)); while(count--) {
if(PIOS_HMC5883_NewDataAvailable()) gyro_error = PIOS_IMU3000_ReadGyros(gyro);
PIOS_HMC5883_ReadMag(mag); // if(PIOS_HMC5883_NewDataAvailable())
pressure = PIOS_BMP085_GetPressure(); // PIOS_HMC5883_ReadMag(mag);
PIOS_DELAY_WaitmS(5); // pressure = PIOS_BMP085_GetPressure();
PIOS_DELAY_WaitmS(50);
} }
if(PIOS_IMU3000_Test() != 0)
panic(1);
pressure++; pressure++;
gyro[0]++; gyro[0]++;
mag[0]++; mag[0]++;

View File

@ -742,11 +742,11 @@ void PIOS_Board_Init(void) {
if (PIOS_SPI_Init(&pios_spi_accel_id, &pios_spi_accel_cfg)) { if (PIOS_SPI_Init(&pios_spi_accel_id, &pios_spi_accel_cfg)) {
PIOS_DEBUG_Assert(0); PIOS_DEBUG_Assert(0);
} }
PIOS_BMA180_Attach(pios_spi_accel_id); /*PIOS_BMA180_Attach(pios_spi_accel_id);
PIOS_BMA180_Init(&pios_bma180_cfg); PIOS_BMA180_Init(&pios_bma180_cfg);*/
PIOS_IMU3000_Init(&pios_imu3000_cfg); PIOS_IMU3000_Init(&pios_imu3000_cfg);
PIOS_HMC5883_Init(&pios_hmc5883_cfg); /*PIOS_HMC5883_Init(&pios_hmc5883_cfg);
PIOS_BMP085_Init(&pios_bmp085_cfg); PIOS_BMP085_Init(&pios_bmp085_cfg);*/
/* Set up the SPI interface to the OP board */ /* Set up the SPI interface to the OP board */

View File

@ -148,60 +148,30 @@ int32_t PIOS_IMU3000_ReadID()
* \return number of bytes transferred if operation was successful * \return number of bytes transferred if operation was successful
* \return -1 if error during I2C transfer * \return -1 if error during I2C transfer
*/ */
uint32_t imu_read = 0;
int32_t PIOS_IMU3000_ReadFifo(uint8_t * buffer, uint16_t len) int32_t PIOS_IMU3000_ReadFifo(uint8_t * buffer, uint16_t len)
{ {
uint16_t fifo_level; uint16_t fifo_level;
int8_t retval1, retval2;
uint8_t addr_buffer[] = {
0x3A, // Get the number of bytes in the fifo
}; retval1 = PIOS_IMU3000_Read(PIOS_IMU3000_FIFO_CNT_MSB, (uint8_t *) &fifo_level, sizeof(fifo_level));
if(retval1 != 0)
return -1;
const struct pios_i2c_txn txn_list[] = {
{
.info = __func__,
.addr = PIOS_IMU3000_I2C_ADDR,
.rw = PIOS_I2C_TXN_WRITE,
.len = sizeof(addr_buffer),
.buf = addr_buffer,
}
,
{
.info = __func__,
.addr = PIOS_IMU3000_I2C_ADDR,
.rw = PIOS_I2C_TXN_READ,
.len = 2,
.buf = (uint8_t *) &fifo_level,
}
};
// Get the number of bytes in the fifo
PIOS_I2C_Transfer(PIOS_I2C_GYRO_ADAPTER, txn_list, NELEMENTS(txn_list));
addr_buffer[0] = 0x3C;
if(len > fifo_level) if(len > fifo_level)
len = fifo_level; len = fifo_level;
len &= 0x01f8; // only read chunks of 8 bytes (includes footer) len -= (len % 10); // only read chunks of 10 bytes (includes footer and temperature measurement)
// No bytes available to transfer
if(len == 0)
return 0;
imu_read += len;
const struct pios_i2c_txn txn_list2[] = { retval2 = PIOS_IMU3000_Read(PIOS_IMU3000_FIFO_REG, (uint8_t *) &buffer, len);
{ return (retval2 < 0) ? -1 : len;
.info = __func__,
.addr = PIOS_IMU3000_I2C_ADDR,
.rw = PIOS_I2C_TXN_WRITE,
.len = sizeof(addr_buffer),
.buf = addr_buffer,
}
,
{
.info = __func__,
.addr = PIOS_IMU3000_I2C_ADDR,
.rw = PIOS_I2C_TXN_READ,
.len = len,
.buf = buffer,
}
};
return PIOS_I2C_Transfer(PIOS_I2C_GYRO_ADAPTER, txn_list2, NELEMENTS(txn_list)) ? len : -1;
} }
/** /**
@ -290,8 +260,10 @@ uint8_t PIOS_IMU3000_Test(void)
/** /**
* @brief IRQ Handler * @brief IRQ Handler
*/ */
uint32_t imu3000_irq = 0;
void PIOS_IMU3000_IRQHandler(void) void PIOS_IMU3000_IRQHandler(void)
{ {
imu3000_irq++;
} }
/** /**