ITG3205 проблема получения данных.
- Войдите на сайт для отправки комментариев
Вс, 24/04/2016 - 04:41
Парни. Не могу понять как получить данные с этого гироскопа. Я не использую arduino библиотеки и пишу в AVRStudio. Проблема в том, что у меня не считываются данные. Не могу понять почему. Вот в этом примере все все работает. Не могу понять в чем разница. Помогите разобраться пожалуйста.
I2C:
void I2C::init(){ TWBR = (uint8_t)TWBR_val; } bool I2C::startTransmit(uint8_t address) { // reset TWI control register TWCR = 0; // transmit START condition TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); // wait for end of transmission while( !(TWCR & (1<<TWINT)) ); // check if the start condition was successfully transmitted if((TWSR & 0xF8) != TW_START){ return false; } // load slave address into data register TWDR = address; // start transmission of address TWCR = (1<<TWINT) | (1<<TWEN); // wait for end of transmission while( !(TWCR & (1<<TWINT)) ); // check if the device has acknowledged the READ / WRITE mode uint8_t twst = TW_STATUS & 0xF8; if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return false; return true; } void I2C::startTransmitWait(uint8_t address) { uint8_t twst; while ( 1 ) { // send START condition TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); // wait until transmission completed while(!(TWCR & (1<<TWINT))); // check value of TWI Status Register. Mask prescaler bits. twst = TW_STATUS & 0xF8; if ( (twst != TW_START) && (twst != TW_REP_START)) continue; // send device address TWDR = address; TWCR = (1<<TWINT) | (1<<TWEN); // wail until transmission completed while(!(TWCR & (1<<TWINT))); // check value of TWI Status Register. Mask prescaler bits. twst = TW_STATUS & 0xF8; if ( (twst == TW_MT_SLA_NACK )||(twst ==TW_MR_DATA_NACK) ) { /* device busy, send stop condition to terminate write operation */ TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); // wait until stop condition is executed and bus released while(TWCR & (1<<TWSTO)); continue; } //if( twst != TW_MT_SLA_ACK) return 1; break; } }/* i2c_start_wait */ void I2C::stopTransmit() { /* send stop condition */ TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); // wait until stop condition is executed and bus released while(TWCR & (1<<TWSTO)); } bool I2C::write(uint8_t data) { // load data into data register TWDR = data; // start transmission of data TWCR = (1<<TWINT) | (1<<TWEN); // wait for end of transmission while( !(TWCR & (1<<TWINT)) ); if( (TWSR & 0xF8) != TW_MT_DATA_ACK ){ return false; } return true; } uint8_t I2C::readAck() { // start TWI module and acknowledge data after reception TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA); // wait for end of transmission while( !(TWCR & (1<<TWINT)) ); // return received data from TWDR return TWDR; } uint8_t I2C::readNAck() { // start receiving without acknowledging reception TWCR = (1<<TWINT) | (1<<TWEN); // wait for end of transmission while( !(TWCR & (1<<TWINT)) ); // return received data from TWDR return TWDR; }
ITG32025:
#include "ITG3205.h" void ITG3205::init(I2C *i2c, UART *uart){ this->i2c=i2c; this->uart=uart; uart->writeLn("Init ITG3205"); i2c->startTransmit(GYRO_ADDR); i2c->write(G_PWR_MGM); i2c->write(0x00); i2c->stopTransmit(); i2c->startTransmit(GYRO_ADDR); i2c->write(G_SMPLRT_DIV); i2c->write(0x07); i2c->stopTransmit(); i2c->startTransmit(GYRO_ADDR); i2c->write(G_DLPF_FS); i2c->write(0x1E); i2c->stopTransmit(); i2c->startTransmit(GYRO_ADDR); i2c->write(G_INT_CFG); i2c->write(0x00); i2c->stopTransmit(); } void ITG3205::getXdata(uint8_t *lowByte, uint8_t *hightByte){ //========Получение младшего байта X==== i2c->startTransmit(GYRO_ADDR); i2c->write(GYRO_XOUT_L); i2c->stopTransmit(); i2c->startTransmit(GYRO_ADDR); *lowByte = i2c->readAck(); i2c->stopTransmit(); //====================================== //========Получение старшего байта X==== i2c->startTransmit(GYRO_ADDR); i2c->write(GYRO_XOUT_H); i2c->stopTransmit(); i2c->startTransmit(GYRO_ADDR); *hightByte = i2c->readAck(); i2c->stopTransmit(); //====================================== }
Где-то в коде:
uint8_t xLow; uint8_t xHight; itg3205.getXdata(&xLow,&xHight); dtostrf(xLow, 3, 5, itmp); uart.write(itmp); uart.write(' '); dtostrf(xHight, 3, 5, itmp); uart.write(itmp); uart.write(' '); uart.write("\r\n"); _delay_ms(50);
Результат:
104.00000 104.00000
104.00000 104.00000
104.00000 104.00000
104.00000 104.00000
все время вот эти числа :(
Пробовал и так:
Теперь другое число во всех переменных.