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


von Mel (Gast)


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)


Lesenswert?


von Mel (Gast)


Lesenswert?

Hey,

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

von Mel (Gast)


Lesenswert?

Hmm sonst keiner ne Idee:/?

von Mel (Gast)


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)


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)


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)


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)


Lesenswert?

Perfekt, vielen Dank für die Hilfe:)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.