Forum: Mikrocontroller und Digitale Elektronik RFM12 über SPI auslesen?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Mel (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Nabend zusammen,

Ich hab schon viel gegoogelt und auch hier schon einige Threads 
durchgeschaut, ich komme aber leider auf keine Lösung. Ich bin grade 
dabei eine Ansteuerung für ein RFM12 Funkmodul zu programmieren und 
möchte, sobald ich ein Register über SPI beschreibe, auch auslesen was 
wirklich reingeschrieben wurde. Das sollte doch meines Verständnisses 
nach möglich sein, indem ich die ersten 8 Bit über SPI übertrage, dann 
das SPDR auslese, dann die anderen 8 Bit übertrage und dann wieder das 
SPDR auslese oder nicht?
Ich vernwede momentan folgenden Code:
1
unsigned int rfm12_write_command(unsigned int data)
2
{
3
    unsigned int daten = 0;
4
    PORT_SPI &= ~(1<<PIN_SS);
5
    SPDR = (data>>8);
6
    while(!(SPSR & (1<<SPIF)));
7
    daten = SPDR<<8;
8
    SPDR = (data & 0x00FF);
9
    while(!(SPSR & (1<<SPIF)));
10
    daten |= (SPDR & 0x00FF);
11
    PORT_SPI |= (1<<PIN_SS);
12
    _delay_ms(1);
13
    return daten;
14
}
15
16
void Init_SPI()
17
{
18
  DDR_SPI  = (1<<PIN_SCK) | (1<<PIN_MOSI) | (1<<PIN_SS);
19
  DDR_SPI &= ~(1<<PIN_MISO);
20
  PORT_SPI |= (1<<PIN_SS);
21
  
22
  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1) | (1<<SPR0);        //SPI Enable und SPI als Master
23
  SPSR = (1<<SPI2X);
24
    
25
  _delay_ms(1);
26
}

Das ganze lasse ich mir über UART ausgeben, ich bekomme aber immer nur 
0xFFFF als Registerinhalt zurück. Fällt da jemandem ein Fehler bei der 
SPI Übertragung auf oder ähnliches?

Vielen Dank schonmal,

Liebe Grüße

von L. P. (lpg)


Bewertung
0 lesenswert
nicht lesenswert

von Mel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hey,

Da habe ich schon sogut wie alle Links angeschaut, aber leider nichts 
hilfreiches gefunden.

von Mel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hmm sonst keiner ne Idee:/?

von Mel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Sorry für den Doppelpost aber vielleicht kurz zum Verständnis für mich: 
Wenn ich die ersten 8 Bits übertragen habe, also der Code
1
SPDR = (data>>8);
2
while(!(SPSR & (1<<SPIF)));

ausgeführt wurde, müsste der Inhalt den ich gesendet habe doch auch 
wieder im SPDR Register drinstehen oder nicht? Also mit SCK von High auf 
Low werden die Daten über MOSI gesendet und mit SCK von Low auf High 
werden die Daten von MISO wieder ins SPDR geshiftet oder habe ich das 
falsch verstanden?

von c-hater (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Mel schrieb:

> Sorry für den Doppelpost aber vielleicht kurz zum Verständnis für
> mich:
> Wenn ich die ersten 8 Bits übertragen habe, also der Code
> SPDR = (data>>8);
> while(!(SPSR & (1<<SPIF)));
>
> ausgeführt wurde, müsste der Inhalt den ich gesendet habe doch auch
> wieder im SPDR Register drinstehen oder nicht?

Eher nicht. Das wäre nur dann der Fall, wenn du MOSI und MISO des µC 
direkt miteinander verbunden hast.

In jedem anderen Fall steht das im Register, was das angesprochene Gerät 
zurückgesendet hat. Beim RFM12 gibt es aber nur ein einziges Kommando, 
nämlich das Status-Kommando, welches schon im ersten Byte sinnvolle 
Daten zurückliefert.

Mehr noch: es gibt überhaupt insgesamt nur zwei Kommandos, bei denen 
etwas sinnvolles zurückgeliefert wird, neben dem bereits erwähnten 
Status-Kommando ist das nur noch das Read-Kommando. Bei dem wird 
allerdings erst ab dem zweiten Byte was zurückgeliefert, nämlich das 
zuletzt empfangene Byte, sofern eins empfangen wurde natürlich nur.

> Also mit SCK von High auf
> Low werden die Daten über MOSI gesendet und mit SCK von Low auf High
> werden die Daten von MISO wieder ins SPDR geshiftet oder habe ich das
> falsch verstanden?

Das hast du völlig falsch verstanden.

von Mel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ohh ok vielen Dank schonmal für die Hilfe:)
Das heißt wenn ich vom RFM12 die Register beschreibe kann ich nicht 
wirklich überprüfen ob der Inhalt richtig reingeschrieben wurde, ich 
kann nur das Statusregister auslesen?

von c-hater (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Mel schrieb:

> Das heißt wenn ich vom RFM12 die Register beschreibe kann ich nicht
> wirklich überprüfen ob der Inhalt richtig reingeschrieben wurde, ich
> kann nur das Statusregister auslesen?

Genauso ist das.

von Mel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Perfekt, vielen Dank für die Hilfe:)

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]
  • [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.