Frage zum ATmega16 und dem Beschleunigungssensor ADXL345 (SPI-Verbindung)

Gast #3666895
Lesenswert?
• ▲
▼
Hallo zusammen,

Ich bin dabei eine 4-wire SPI-Verbindung zwischen dem ATmega16 und dem 
Beschleunigungssensor ADXL345 aufzubauen. Dies funktioniert auch soweit. 
Nun wollte ich die Daten des ADXL345 am Stück auslesen. Also die erste 
Register Adresse senden (inkl. MB Bit -> Multiple byte) und danach alle 
6 Register nacheinander auslesen. (Code ganz unten)

Allerdings funktioniert dies nicht. Beim zweiten Aufruf von Receive 
bleibt das Programm hängen.
Jetzt also meine grundsätzliche Frage: Unterstützt der ATmega16 dies 
eigentlich oder muss ich jedes mal die richtige Adresse zuvor senden? 
Oder liegt der Fehler ganz wo anders?




SPI_MasterTransmit((0b11000000 | 0x32));//Bit 7 gesetzt: read; Bit 6 
gesetzt: multiple bytes read; 0x32 address of DataX0
for (int i = 0; i<6; i++)
{
xyzDATA[i] = SPI_MasterReceive();
}

Mit:
void SPI_MasterTransmit(char cData)
{
  SPDR = cData;
  while(!(SPSR & (1<<SPIF)))
    ;
}
char SPI_MasterReceive()
{
  while(!(SPSR & (1<<SPIF)))
    ;
  return SPDR;
}
Gast #3666946
Lesenswert?
• ▲
▼
holger schrieb:
> Natürlich bleibt das hängen. Der Slave sendet kein Clocksignal.
> Du hast SPI nicht verstanden.

Das Clocksignal kommt doch vom Master, also vom ATmega, oder nicht?
Was muss ich denn ändern, damit das funktioniert?
Könntest du mir bitte einen Denkanstoß geben? Danke!
Gast #3666959
Lesenswert?
• ▲
▼
Und wie funktioniert dann das Empfangen? Der Master sendet doch die 
Register-Adresse, also Takt vorhanden. Und dann ist kein Takt mehr da? 
Aber der Slave sendet doch die Antwort; das kann doch nicht ohne Takt 
geschehen?
Ich habe das so verstanden, dass der Takt gegeben ist, wenn SS vom 
ATmega auf low liegt? (habe ich jetzt oben nicht im Code drin, sorry, 
wird aber gemacht)
#3666963
Lesenswert?
• ▲
▼
Nein, ich glaube der SS hat nur als Slave eine richtige Funktion.
Jedenfalls sendet der Master beim Empfangen prinzipbedingt etwas (TX- 
und RX-Leitungen). Bei der Übertragung von einem Byte zum Slave erhält 
der Master ebenfalls ein Byte. Die Übertragung wird durch das 
Beschreiben des SPI-Datenregisters ausgelöst. Nach der Übertragung 
findet man dort das Empfangene Byte vom Slave.
Gast #3666971
Lesenswert?
• ▲
▼
Thomas W. schrieb:
> Nein, ich glaube der SS hat nur als Slave eine richtige Funktion.
> Jedenfalls sendet der Master beim Empfangen prinzipbedingt etwas (TX-
> und RX-Leitungen). Bei der Übertragung von einem Byte zum Slave erhält
> der Master ebenfalls ein Byte. Die Übertragung wird durch das
> Beschreiben des SPI-Datenregisters ausgelöst. Nach der Übertragung
> findet man dort das Empfangene Byte vom Slave.

OK. Danke! Und wenn ich nun die erste Adresse vom Master losschicke 
(1Byte), kann dieser auch nur ein Byte empfangen und ich muss wieder 
eine neue Adresse schicken? Der Slave (ADXL345) unterstützt nämlich das 
Auslesen von mehreren Registern nacheinander. Also erste Adresse senden 
und nacheinander alle Registerinhalte empfangen. Wenn ich dich jetzt 
richtig verstanden habe, geht dies nicht mit dem ATmega?
Gast #3666997
Lesenswert?
• ▲
▼
Hi

>Und wenn ich nun die erste Adresse vom Master losschicke
>(1Byte), kann dieser auch nur ein Byte empfangen und ich muss wieder
>eine neue Adresse schicken?

Nein. Nach der Adresse+Read schickst du ein oder mehrere Dummy-Bytes 
hinterher. Nach den ersten erhältst du den Inhalt des adressiertem 
Register Mit jedem Dummy-Byte bekommst du den Inhalt eines weiteren 
Registers.

MfG Spess
Gast #3667027
Lesenswert?
• ▲
▼
Also folgendermaßen:

SPI_MasterBegin();
SPI_MasterTransmit((0b11000000 | 0x2b));
xyzDATA[0] = SPI_MasterReceive();
for (int i = 1; i<6; i++)
{
  SPI_MasterTransmit(0xaa);  //Dummy Byte
  xyzDATA[i] = SPI_MasterReceive();
}
SPI_MasterEnd();

Er bleibt zwar nicht hängen, liest aber nicht die richtigen Werte. Was 
habe ich diesmal falsch gemacht?
#3667178
Lesenswert?
• ▲
▼
Andreas schrieb:
> SPI_MasterTransmit((0b11000000 | 0x2b));
> xyzDATA[0] = SPI_MasterReceive();

Es ist unwahrscheinlich, dass du die ersten Daten schon bekommst während 
du noch die Adresse sendest. Außerdem ist 0x2b vielleicht die falsche 
Adresse. Wenn dann so:
SPI_MasterBegin();
SPI_MasterTransmit((0b11000000 | 0x??));
for (int i = 0; i<6; i++)
{
  SPI_MasterTransmit(0xaa);  //Dummy Byte
  xyzDATA[i] = SPI_MasterReceive();
}
SPI_MasterEnd();
Gast #3667183
Lesenswert?
• ▲
▼
Andreas schrieb:
[...]
> Er bleibt zwar nicht hängen, liest aber nicht die richtigen Werte. Was
> habe ich diesmal falsch gemacht?

das, was du vorher auch schon falsch gemacht hast:

1. SPI nicht verstanden und
2. das datenblatt nicht gelesen oder nicht verstanden

das alles was du hier fragst steht im datenblatt (sowohl vom atmega als 
auch vom adxl345)
Gast #3667185
Lesenswert?
• ▲
▼
ich, nicht du schrieb:
> das, was du vorher auch schon falsch gemacht hast:
>
> 1. SPI nicht verstanden und
> 2. das datenblatt nicht gelesen oder nicht verstanden
>
> das alles was du hier fragst steht im datenblatt (sowohl vom atmega als
> auch vom adxl345)

Vielen Vielen Dank für deine sehr hilfreiche Antwort! Du hast mir die 
Augen geöffnet!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.