RFM12 über SPI auslesen?

Gast #3458870
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
Gast #3461465
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?
Gast #3461541
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.
Gast #3461582
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren