Ahoj,
pracoval někdo s tímto kompasem? Zkouším komunikaci a pořád vyčítám XH = 0XFF.
přitom zapisuju při inicializaci 0x70.
Inicializace:
void iniKOMPAS() {
I2c2_start;
I2C2_write(0x3c); // write mode
I2C2_write(0x00); // set pointer to CRA
I2C2_write(0x70); // write 0x70 to CRA
I2c2_stop();
delay_ms(100);
I2c2_start();
I2C2_write(0x3c); // write mode
I2C2_write(0x01); //set pointer to CRB
I2C2_write(0xA0); //set gain=5
I2c2_stop();
delay_ms(100);
I2c2_start();
I2C2_write(0x3c); // write mode
I2C2_write(0x02); //set pointer to measurement mode
I2C2_write(0x00); //
I2c2_stop();
delay_ms(100);
}
přečtení registru 0x00
I2c2_start();
I2C2_Write(0x3d);
I2C2_Write(0x00); // listed in example, but causes hanging
//I2C2_Restart();
XH = I2C2_Read(1);
I2c2_stop();
delay_ms(100);
Radius
June 2, 2016, 10:40pm
#2
Pracoval. Ověřil sis, že Ti HW a I2C chodí tím, že by sis přečetl ID_REG A-C ? Jestli Ti to chodí, pak bys měl číst taky STATUS registr který říká kdy jsou platná data. A pak XH je na adrese 0x03 a mě se zdá, že to čteš z adresy 0x00.
[size=150]Ověřoval jsem si že mi komunikace chodí právě tím že jsem vyčítal právě reg. A který je na adrese 0x00.
Ale už jsem to vyřešil.
Špatně jsem zadával instrukci při vyčítání.
správně to je tedy takto s časovým zpožděním:[/size]
[size=20]I2C2_Start(); //Start komunikace
I2C2_Write(0x3C); // zápis
I2C2_Write(0x03); // adresa
delay_ms(20); // zpoždění na převod na výstupu
I2C2_Restart(); // restart I2C
I2C2_Write(0x03D); // čtení
XH=I2C2_Read(0); // vyčítání registrů
XL=I2C2_Read(0);
ZH=I2C2_Read(0);
ZL=I2C2_Read(0);
YH=I2C2_Read(0);
YL=I2C2_Read(1);
i2c2_stop(); // stop komunikace[/size]
Radius
June 3, 2016, 3:10pm
#4
ID_REG_A je na jiné adrese, ale pokud Ti to chodí, není co řešit…
JJ já vím že adresa je jinde. Ale mě jde o vyčítání hodnot velikosti mag. pole. Jen ještě mi připadá že když vazmeme například osu X
tak na adrese 0x03 je byte nemšího významu a na adrese 0x04 je byte většího významu. Dle manuálu by to ale mělo být naopak. Tak nevím?