mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit Accelerometer LIS3LV02DQ über SPI an ARM7


Autor: Stefan M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche nun schon ein paar Tage den oben genannten Sensor zur 
Kommunikation mit meinem ARM7 über SPI zu bewegen, vielleicht kann mir 
ja hier jemand sagen was ich dabei falsch mache. Die Threads die es zu 
diesem Thema gibt habe ich schon durch, kann dort aber keine Antwort für 
das Problem finden.

Folgendes Problem habe ich:

Wenn ich den Sensor anschließe, kann ich ohne Probleme das WHO_AM_I 
Register auslesen und bekomme auch den richtigen Wert (0x3A) zurück.

Sobald ich aber versuche den LIS3LV02DQ aus dem Powerdown zustand zu 
hohlen, indem ich in das Register CTRL_REG1 den Wert 0x47 oder 0x87 
schreibe, bekomme nur noch falsche Werte vom Sensor zurück. Dies 
passiert bei allen Registern die ich auslesen will.
Konkret schickt mir der LIS3LV02DQ entweder den Wert 0x07, oder das 
Dummy Byte welches ich zum lesen des Wertes geschickt habe zurück. 
Dieser Wert ändert sich auch nicht mehr bis ich den Sensor ausstecke und 
wieder einstecke (also die Spannung vom LIS3LV02DQ nehme und er neu 
bootet).

Konfiguriert habe ich die SPI des ARMS als Master, mit CPHA=1 und 
CPOL=1, MSB first. Die Schnittstelle läuft mit 1 MHz, hab aber auch 
schon niedrigere Werte probiert.

Der ARM7 ist ein LPC2129 /01 von NXP.

Das meine Senderoutine funktioniert, habe ich verifiziert indem ich mir 
mit nem Speicher Oszi die Kommunikation angeschaut habe.

Hier mal ein Ausschnitt der relevanten Teile meines Codes:

#define ACC_SENS_WRITE_MS0  0x00
#define ACC_SENS_WRITE_MS1  0x40

#define ACC_SENS_READ_MS0  0x80
#define ACC_SENS_READ_MS1  0xC0

#define ACC_SENS_WHO_AM_I  0x0F
#define ACC_SENS_STATUS_REG 0x27

#define ACC_SENS_CTRL_REG1 0x20
#define ACC_SENS_CTRL_REG2 0x21
#define ACC_SENS_CTRL_REG3 0x22

#define ACC_SENS_OUTX_L 0x28
#define ACC_SENS_OUTX_H 0x29

#define ACC_SENS_OUTY_L 0x2A
#define ACC_SENS_OUTY_H 0x2B

#define ACC_SENS_OUTZ_L 0x2C
#define ACC_SENS_OUTZ_H 0x2D


void vInitAccSensor(void)
{
  UINT8 u8cfg = 0;
  portENTER_CRITICAL();

  u8cfg = 0x87;
    
  SPI0_Enable(1);       //CS auf low
  SPI0_ByteTransmit( ACC_SENS_WRITE_MS0 | ACC_SENS_CTRL_REG1);
  vTaskDelay(1);
  u8cfg = SPI0_ByteTransmit(u8cfg);  //device on, data-rate 40Hz, no selftest, X,Y,Z enabled
  SPI0_Disable(1);      //CS auf high

  portEXIT_CRITICAL()    
}

UINT8 u8AccSensWhoAmI()
{
   UINT8 u8out;   

  portENTER_CRITICAL();

  SPI0_Enable(1);
  SPI0_ByteTransmit(ACC_SENS_READ_MS0 | ACC_SENS_WHO_AM_I);
  u8out = SPI0_ByteTransmit(0x00);
  SPI0_Disable(1);
        
  portEXIT_CRITICAL();  

  return u8out;
}

UINT8 SPI0_ByteTransmit(UINT8 u8Data)
  {
     S0SPDR = u8Data;        // write cData to the spi transmission register
     while (!(S0SPSR & 0x80));       // wait for transfer completed
    return S0SPDR;           // Return the status written back in the send/receive buffer
  }


Ich hoff irgendjemand hat ne Idee warum das bei mir nicht so will wie es 
soll.

Gruß

Stefan

Autor: Stefan M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
push

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich kenne mich mit ARM nicht aus, aber ich habe mit einem LPC936 
(8051er) in C mal den LIS3LV02DL erfolgreich angesteuert und ausgelesen. 
Ich glaube mich zu erinnern, dass der DL und der DQ die gleiche Syntax 
haben.

Was mir an deinem Code auffällt ist, dass du in deiner Senderoutine 
SPI0_ByteTransmit() das Transmit Flag zwar auswertest, aber nicht mehr 
löschst. Wird das Flag dann in deiner Hauptroutine wieder gelöscht?

Ansonsten sieht die Ansteuerung des Sensors in deinen Routinen 
eigentlich korrekt aus. Vieleicht hilft es dir ja etwas, wenn du dir mal 
meinen Code dazu anschaust unter [1] und [2]. Ich initialisiere mit 
0xC7, was aber laut Datenblatt identisch zu 0x87 und 0x47 sein sollte.

Ciao,
     Rainer

[1]
https://quakeman.homelinux.net/viewvc/uVision/trun...

[2]
https://quakeman.homelinux.net/viewvc/uVision/trun...

Autor: Stefan M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal vielen Dank für deine Antwort.

Zur Senderoutine, das Flag muss nicht von Hand gelöscht werden, laut 
Datenblatt wird das Flag gelöscht, wenn man das S0SPSR Register und 
anschließend das Datenregister S0SPDR ausliest. Dies ist ja bei mir der 
Fall. Ausserdem weis ich ja das Daten gesendet werden und ich auch 
wieder Daten zurück bekomme, da ich das ganze mit einem Oszilloskop 
gemessen habe. Auf den Leitungen ist alles so wie erwartet, mit der 
Ausnahme das ich einfach nicht die richtigen Daten zurück bekomme.

Um den Sensor aus dem Powerdown Zustand zu bekommen sehe ich das genau 
so wie du, die beiden Bits dürfen einfach nicht 00 sein. (Ich hab aber 
auch schon die anderen Varianten 0xC7, 0x47 und 0x87 durchprobiert, 
gleiches Ergebnis...)

Mitlerweile bin ich aber der Meinung das mit dem Beschleunigungssensor 
irgendwas faul ist, da der Pegel der SDO Leitung nicht stimmt. Er müsste 
eigentlich laut Datenblatt mindestens 0,8*VDD sein, also in meinem Fall 
mit VDD = 3,1 V ca 2,5 V. Ich messe aber nur einen Pegel von ca 1,8 V.

Ich werd mal schaun ob sich noch ein weiterer Sensor auftreiben lässt, 
da ich nicht der erste bin der sich an genau diesem Sensor versucht hat 
und ich nicht genau weiß was damit vor mir alles angestellt wurde.

Gruß Stefan

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.