Forum: Mikrocontroller und Digitale Elektronik Problem mit RFM12 über SPI an Raspberry Pi


von Christian (Gast)


Lesenswert?

Hallo zusammen,

ich möchte gerne einen RFM12 direkt ohne Mikrocontroller an einen 
Raspberry Pi anschließen. Leider meldet sich der RFM12 nicht zurück, 
wenn ich den Status abfrage. Ich benuzte dazu die übliche C-Lib 
(http://www.airspayce.com/mikem/bcm2835/)

Der selbe RFM12 funktioniert an einem AVR und anscheinend auch am 
Raspberry, denn wenn ich das mit dem rfm12b-linux Kernelmodul und den 
Beispielen probiere (https://github.com/gkaindl/rfm12b-linux), wird 
zumindest ein anderer Status zurückgeliefert, als wenn ich keinen RFM12 
angeschlossen habe.

Um den Fehler jetzt möglichst einzugrenzen, habe ich es jetzt mal per 
BitBanging auch mit der o.a. Lib versucht. Der unten stehende Code 
sollte immer wieder den Status abfragen und ausgeben. Ich bekomme leider 
nur Nullen.

Was mach ich falsch?

Vielen Dank



[c]
#include <bcm2835.h>
#include <stdio.h>

#define SDI RPI_GPIO_P1_19
#define SDO RPI_GPIO_P1_21
#define SCK RPI_GPIO_P1_23
#define NSEL RPI_GPIO_P1_26



int main(int argc, char **argv)
{

    if (!bcm2835_init())
      return 1;

    bcm2835_gpio_fsel(SDI, BCM2835_GPIO_FSEL_OUTP);
    bcm2835_gpio_fsel(SDO, BCM2835_GPIO_FSEL_INPT);
    bcm2835_gpio_fsel(SCK, BCM2835_GPIO_FSEL_OUTP);
    bcm2835_gpio_fsel(NSEL, BCM2835_GPIO_FSEL_OUTP);

    uint8_t i;
    while (1)
    {
      bcm2835_gpio_write(SDI, LOW);
      bcm2835_gpio_write(SCK, LOW);
      bcm2835_gpio_write(NSEL, HIGH);
      delay(500);
      bcm2835_gpio_write(NSEL, LOW);
      delay(500);
      for(i=0;i<16;i++)
      {
        bcm2835_gpio_write(SCK, HIGH);
        usleep(100);
        if(bcm2835_gpio_lev(SDO))
          printf("1");
        else
          printf("0");
        fflush(stdout);
        bcm2835_gpio_write(SCK, LOW);
        usleep(100);
      }
    }

    return 0;
}
[\c]

von Christian (Gast)


Lesenswert?

Mhh, irgendwie klappt die Formatierung des C-Codes nicht. Was hab ich 
denn da schon wieder falsch gemacht?

von Peter K. (peterka2000)


Lesenswert?

Christian schrieb:
> Mhh, irgendwie klappt die Formatierung des C-Codes nicht. Was hab ich
> denn da schon wieder falsch gemacht?
[/c] und nicht [\c]

von Christian (Gast)


Lesenswert?

Peter K. schrieb:
> [/c] und nicht [\c]
Danke, leider kann ich das als Gast nicht mehr ändern. Vielleicht sollte 
ich mich doch endlich mal anmelden.

von c-hater (Gast)


Lesenswert?

Christian schrieb:

> ich möchte gerne einen RFM12 direkt ohne Mikrocontroller an einen
> Raspberry Pi anschließen. Leider meldet sich der RFM12 nicht zurück,
> wenn ich den Status abfrage.

Das machst du woran genau fest? Oder anders ausgedrückt: Was erwartest 
du, was er melden sollte? Ja, das sollte man schon wissen, bevor man 
ihn etwas fragt!

Davon abgesehen: Der RFM12 ist ziemlich zickig bezüglich seines 
PowerOn-Verhaltens. Geht nSEL zu früh nach dem PowerOn auf Low (oder ist 
gar bei PowerOn bereits auf Low), dann kommt nur Mist bei der 
Statusabfrage und daran ändert sich auch nichts mehr bis zum nächsten 
Powercycle. Also dafür sorgen, daß er bei PowerOn (des RFM12!) auf nSEL 
sicher High sieht und sich daran auch in den nächsten 100ms (oder 
waren's 1000? Hab's vergessen) nix mehr ändert.

Und noch einen: Du benutzt doch hoffentlich eine 3,3V-Version des RFM12, 
oder?

> Ich bekomme leider
> nur Nullen.

Das wäre fast korrektes Verhalten! Nur bei der allerersten Statusabfrage 
solltest du genau ein Bit der 16 (nämlich das als zweites gelesene) auf 
High sehen, alle folgenden Abfragen sollten immer für alle Bits Low 
liefern.

Jedenfalls so lange, bis du den RFM12 mal irgendwas sinnvolles machen 
lassen hast, also ein anderes Kommando ausgeführt hast als die 
Statusabfrage.

Sehr praktisch zum reinen Prüfen der Funktionsfähigkeit der 
SPI-Kommunikation ist deshalb der externe Interrupt des RFM12. Der ist 
standardmäßig nach dem PowerOn aktiv. Nachdem der nInt-Eingang des RFM12 
mal kurz auf Low gezogen wurde, sollte also auch im Statuswort ein Bit 
gesetzt sein (nämlich das als fünftes gelesene) und das immer für genau 
eine Statusabfrage.

Ja, es lohnt sich, Datenblätter zu lesen. Hättest du das getan, hättest 
du das alles auch allein wissen können...

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.