ITG3205 проблема получения данных.

gppsoft
Offline
Зарегистрирован: 13.10.2014

Парни. Не могу понять как получить данные с этого гироскопа. Я не использую 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 
 
все время вот эти числа :(
 
 
 
gppsoft
Offline
Зарегистрирован: 13.10.2014

Пробовал и так:

void ITG3205::getXdata(int *gx, int *gy, int *gz, int *gt){
	
	uint8_t i = 0;
	uint8_t buff[8];

	i2c->startTransmit(GYRO_ADDR);
	i2c->write(0x1B);
	i2c->startTransmit(GYRO_ADDR);
	for(i=0; i<8; i++) {
		if(i==8-1)
			buff[i] = i2c->readNAck();
		else
			buff[i] = i2c->readNAck();
	}
	i2c->stopTransmit();

	*gx = ((buff[2] << 8) | buff[3]);
	*gy= ((buff[4] << 8) | buff[5]);
	*gz = ((buff[6] << 8) | buff[7]);
	*gt = (buff[0] << 8) | buff[1]; 

}

Теперь другое число во всех переменных.

26728.00000 26728.00000 26728.00000 26728.00000 
26728.00000 26728.00000 26728.00000 26728.00000 
26728.00000 26728.00000 26728.00000 26728.00000 
26728.00000 26728.00000 26728.00000 26728.00000 
26728.00000 26728.00000 26728.00000 26728.00000 
26728.00000 26728.00000 26728.00000 26728.00000 
26728.00000 26728.00000 26728.00000 26728.00000 
26728.00000 26728.00000 26728.00000 26728.00000 
26728.00000 26728.00000 26728.00000 26728.00000 
26728.00000 26728.00000 26728.00000 26728.00000