Hallo zusammen, nun hat sich doch ein Problem aufgetan - der I2C.
Ich habe aus Atmels ASF die TWI-Integration.
Das Protokoll des MPU6050 ist mir klar, steht ja im Datenblatt
Start-Bedingung - Adresse - Write bit - ACK vom MPU - Register-Adresse - ACK vom MPU
Start-Bedingung - Adresse - Readbit - ACK vom MPU - Byte vom MPU - NACK vom Master - Stop Bedingung.
Nun habe ich einige male die TWI-Docs von Atmel "durchgeblättert", aber so wie es mit schein stehen mir nur die
twi_master_write() und twi_master_read() - funktionen zur verfügung.
Von den ATMegas kenne ich Fleurys lib, mit Mauellem senden von Start/Stop/(N)ACK/etc.
Wie genau das die Lib von Atmel macht, konnte ich nicht herausfinden :-/
Ich habe es nun wie folgt umgesetzt (davon ausgehen, dass Atmel das schon richtig macht):
Code:
uint8_t data_received[10];
void mpu6050_readByte(uint8_t regAddr) {
usart_serial_write_packet(USART_DEBUG, "START-Read\n", strlen("START-Read\n"));
uint8_t *data = regAddr;
twi_package_t packet_write = {
.chip = MPU6050_ADDR, // TWI slave bus address
.buffer = data, // transfer data source buffer
.length = 1 // transfer data size (bytes)
};
while (twi_master_write(&TWIE, &packet_write) != TWI_SUCCESS);
delay_ms(10);
//request register
twi_package_t packet_read = {
.chip = MPU6050_ADDR, // TWI slave bus address
.buffer = data_received, // transfer data destination buffer
.length = 1 // transfer data size (bytes)
};
// Perform a multi-byte read access then check the result.
if(twi_master_read(&TWIE, &packet_read) == TWI_SUCCESS){
usart_serial_write_packet(USART_DEBUG, "TWI-Read OK\n", strlen("TWI-Read OK\n"));
}
}
Nach diesem Beispiel:
http://asf.atmel.com/docs/3.3.0/xmeg...uickstart.html
Wenn ich so nun das WHO_AM_I-Register-Auslese
Code:
while(1)
{
mpu6050_readByte(MPU6050_RA_WHO_AM_I);
test = data_received[0];
char itmp[10];
itoa(test, itmp, 10);
usart_serial_write_packet(USART_DEBUG, itmp, strlen(itmp));
usart_serial_putchar(USART_DEBUG, '\n');}
Bekomme ich eine 205 (0xCD) und nicht 104 (0x68 ) als Antwort.
Für GYRO_XOUT_L/H, ACCEL_XOUT_L/H und TEMP_OUT_L/H bekomme ich immer 255 zurück.
Ich habe am MPU6050 noch keine Initialisierung durchgeführt. So wie ich das sehe, ist es auch nicht unbedingt notwendig.
Hab ihr mir eventuell hierzu ein paar tpps? Eventuell eine andere TWI-Lib, oder muss ich doch bestimmte Initialisierungen machen?
Vielen Dank!
Lesezeichen