BusPirate und ADXL345

Verkabelung

Um den ADXL345 im SPI-Modus mit dem BusPirate zu verbinden benötigt ihr folgende Verbindungen:

GND - GND
+3V3 - VCC
CS - CS (eigentlich !CS)
MISO - SDO
MOSI - SDA
CLK - SCL

Bus-Pirate Einstellungen

Bitte verbindet euch mit eurem BusPirate mit eurer bevorzugten Serial Terminal Software.
Die Einstellungen für den SPI-Modus könnt ihr hier ablesen:

HiZ>m
1. HiZ
2. 1-WIRE
3. UART
4. I2C
5. SPI
6. 2WIRE
7. 3WIRE
8. LCD
x. exit(without change)

(1)>5
Set speed:
 1. 30KHz
 2. 125KHz
 3. 250KHz
 4. 1MHz

(1)>1
Clock polarity:
 1. Idle low *default
 2. Idle high

(1)>2
Output clock edge:
 1. Idle to active
 2. Active to idle *default

(2)>1
Input sample phase:
 1. Middle *default
 2. End

(1)>1
CS:
 1. CS
 2. /CS *default

(2)>2
Select output type:
 1. Open drain (H=Hi-Z, L=GND)
 2. Normal (H=3.3V, L=GND)

(1)>2

Standardmäßig ist der ADXL345 nach dem Start im 4-wire SPI Modus. Wenn !CS jedoch noch euch auf VDD I/O gezogen wird hingegen im I2C Modus.

In meinem Fall (also mit der obigen Verkabelung) musste ich noch die Spannungsversorgung aktivieren um den ADXL345 mit 3,3V zu versorgen.

SPI>W

Auslesen der (Mess-) Daten

Allgemeiner Zugriff auf die Register

Sowohl beim Lese- als auch beim Schreibzugriff muss zuerst CS (ChipSelect) aktiviert, also CS auf LOW (in diesem Chip ist CS negiert!) gezogen werden. Dies geschieht im BusPirate mit dem Kommando

[

Es folgen zwei Bits für den Modus
Bit 1 (R/!W) gibt an ob es sich um einen Lesezugriff handelt (1) oder einen Schreibzugriff (0)
Bit 2 (MB) zeigt an ob wir lediglich ein Byte auslesen möchten (0) oder mehrere, d.h. bis wir CS wieder deaktiviert wird (1)
Danach folgen sechs Bits für die Adresse die zu lesen oder zu schreiben ist, und ggf. die zu schreibenden Daten bzw. ein Lesebefehl (r).

Schließlich wird die Kommunikation wieder beendet mit dem Deaktivieren des CS

]

Um nun z.B. die Device-ID auszulesen geht man wie folgt vor:

SPI>[0b10000000 r]
/CS ENABLED
WRITE: 0x80 
READ: 0xE5 
/CS DISABLED

Die Device-ID ist im 6-Bit langen Register 0x00 oder Hexadezimal 0b00_0000 hinterlegt. Dazu kommt eine 1 an der ersten Position der vollen 8 Bit und der 0 für den Einzel-Byte-Zugriff.
Daraus wird also 0b1000_0000 + 0b0000_0000 = 0b1000_0000.

Echte Messwerte

Um mit dem Messsungen zu beginnen, bitte noch das Measurement-Bit im Register 0x2D setzen. Dadurch wird dem ADXL345 signalisiert dass er jetzt bitte aus seinem Standby-Modus erwachen und mit den Messungen beginnen soll.

SPI>[0x2D 0x08]

Die X/Y/Z-Werte könnt ihr dann aus den Registern 0x32 bis 0x37 auslesen. Natürlich muss bei der Adresse wieder 0x80 für den Lesezugriff addiert werden (das entspricht dem setzen des ersten, höchsten Bits):

SPI>[0xb2 r]
/CS ENABLED
WRITE: 178 
READ: 222
/CS DISABLED

Jeder Achse stehen zwei Bytes für die Messwerte zur Verfügung, also jeweils 16 Bit. Um nun sowohl das erste als auch das zweite Byte der X-Achse auszulesen muss das MB (Multiple-Byte-Bit) direkt nach dem R/!W-Bit gesetzt sein. Es werden dann nacheinander alle aufeinanderfolgenden Bytes ausgelesen, solange ein Taktsignal ankommt:

    R MB X1&X2
[0b 1 1  110010 rr]

natürlich ist der eigentliche Befehl ohne die Leerzeichen in der Adresse einzutippen ;)

[0b11110010 rr]

Wir könnten auch gleich noch die nächsten Bytes (bzw Register) auslesen indem wir einfach noch mehr Lesebefehle anhängen, die Adresse 0b110010 ist lediglich die Startadresse. Nach den zwei Registern für die X-Werte kommen direkt die Werte für die Y- und schließlich die Z-Werte.

Wichtig ist, dass die Antwort im Zweierkomplement ist!

Beispiel:

SPI>[0b11110010 rr]
WRITE: 0xF2
READ: 0x00
READ: 0xFE
/CS DISABLED

Bedeutet also dass das LSB (least significant byte, also das hintere Byte) der X-Achse den Wert 0x00, und das MSB den Wert 0xFE hat.
Zusammengesetzt ergibt sich also 0xFE00. Umgerechnet (man beachte das Zweierkomplement!) ergibt sich der dezimale Wert 512.
Dazu ist dieser Umrechner sehr praktisch: http://manderc.com/concepts/umrechner/index.php

Viel Spaß beim Experimentieren!