www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RFM12 SDO ist "immer" low (keine daten?)


Autor: Claudio H. (hedie)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich möchte gerne etwas mit den RFM12 Modulen machen.

Dazu habe ich ein modul zusammen mit einem Attiny2313 auf einen kleinen 
testprint gelötet.

Das SPI hab ich selbst programmiert:
unsigned int SPI(unsigned int uiData)
{
  unsigned char   ucCount = 0;
  unsigned int   uiReceive = 0;
  nSEL_0;
  _delay_ms(1);
  while(ucCount != 16)
  {
    ucCount++;
    if((uiData & 0x8000) > 0)  SDI_1
    else             SDI_0;
    SCK_1;
    _delay_ms(1);
    //uiReceive = (uiReceive | SDO); //Hier befindet sich noch ein fehler
    if(ucCount != 16) uiReceive = uiReceive << 1;
    SCK_0;
    _delay_ms(1);
    uiData = uiData << 1;
  }
  nSEL_1;
  _delay_ms(1);
  return uiReceive;
}

Das Problem ist nun, ich kann problemlos mit dem Modul kommunizieren, 
also es versteht was ich ihm sage.
Das sehe ich daran, das sich die Frequenz am CLK ausgang ändern wenn ich 
die entsprechenden Befehle sende.

Wenn ich jedoch das Status Register auslesen möchte, also 0x0000 sende, 
so bekomme ich nichts zurück ausser direkt nach einem Reset des boards.

Nach einem Reset sehen die Signale wie im Bild1 aus
Wen ich 0x0000 ein zweites mal sende, dan sehen die Signale so aus wie 
in
Bild2

Zur testweisen initialisierung sende ich lediglich zu beginn

SPI(0x80E7);
SPI(0xC0C0);

Ich habe an der Leitung SDO einen PullUp widerstand angebracht!

P.S. Die Programmoberfläche ghört zu meinem eigenen LogicAnalyzer 
(OpenLogic) Baupläne und Infos unter www.endasmedia.ch

Danke schonmal

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da liegen Interrupte im RFM an, die Du nicht behandelt hast. Reine 
Vermutung.

Autor: Claudio H. (hedie)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Travel Rec. schrieb:
> Da liegen Interrupte im RFM an, die Du nicht behandelt hast. Reine
> Vermutung.

Danke für deine Antwort :)

Ich habe inzwischen einiges umgestellt...

Zu testzwecken habe ich das Beidpielprogramm aus diesem Thread 
Beitrag "Beispielprogramm für RFM12 433MHz Funk-Module" mal zur hilfe verwendet.

Ich habe die initialisierung, power on etc kopiert ausser die Frequenz 
einstellung. Diese habe ich auf meine 868MHz angepasst.

Doch leider empfange ich absolut nichts!!!
Hat irgendwer eine idee weshalb?

Im anhang findet sich die Logische Analyse :)
Also die Signale nach einem Tasterdruck
Ich habe die Signale mit OpenLogic aufgenommen. Programm ist mit dabei
Keine Installation notwendig!

Hier mein C Code

Das E_ bedeutet das es die Pins des Externen Moduls sind!
SDI_1 ist eingeschaltet und SDI_0 Ausgeschaltet
unsigned int SPI_External(unsigned int uiData)
{
  unsigned char   ucCount = 0;
  unsigned int   uiReceive = 0;
  E_nSEL_0;
  while(ucCount != 16)
  {
    ucCount++;
    if((uiData & 0x8000) > 0)  E_SDI_1
    else             E_SDI_0;
    E_SCK_1;
    _delay_us(10);
    //uiReceive = (uiReceive | SDO);
    if(ucCount != 16) uiReceive = uiReceive << 1;
    E_SCK_0;
    _delay_us(10);
    uiData = uiData << 1;
  }
  E_nSEL_1;
  while(!E_SDO);  //Auf externes Modul Warten
  return uiReceive;
}

unsigned int SPI_OnBoard(unsigned int uiData)
{
  unsigned char   ucCount = 0;
  unsigned int   uiReceive = 0;
  nSEL_0;
  while(ucCount != 16)
  {
    ucCount++;
    if((uiData & 0x8000) > 0)  SDI_1
    else             SDI_0;
    SCK_1;
    _delay_us(10);
    //uiReceive = (uiReceive | SDO);
    if(ucCount != 16) uiReceive = uiReceive << 1;
    SCK_0;
    _delay_us(10);
    uiData = uiData << 1;
  }
  nSEL_1;
  while(!SDO);  //Auf OnBoard Modul Warten
  return uiReceive;
}


int main( void )
{
  //RFM OnBoard
  DDRD = (1 << DDD4) | (1 << DDD5) ;                 //Ausgänge bestimmen
  DDRB = (1 << DDB0) | (1 << DDB2) | (1 << DDB3) ;         //Ausgänge bestimmen
  DDRB &= ~( 1 << DDB4 );                      //Eingang bestimmen
  DDRB &= ~( 1 << DDB1 );                      //Eingang bestimmen

  //////RFM External
  DDRD &= ~( 1 << DDD1 );                      //Eingang bestimmen
  DDRD = (1 << DDD2) | (1 << DDD3) | (1 << DDD0) ;         //Ausgänge bestimmen

  nSEL_1;
  SDI_0;
  SCK_0;
  E_nSEL_1;
  E_SDI_0;
  E_SCK_0;

  _delay_ms(50);

  SPI_OnBoard(0xC0E0);  //Clock einstellungen (Ausgang)
  SPI_OnBoard(0x80E7);  //FIFO Aktivieren
  SPI_OnBoard(0xC2AB);  //Daten Filter
  SPI_OnBoard(0xCA81);  //FIFO Modus
  SPI_OnBoard(0xE000);  //Disable Wakeuptimer
  SPI_OnBoard(0xC800);  //Disable low Duty Cycle
  SPI_OnBoard(0xC4F7);  //AFC Einstellungen: autotuning: -10kHz...+7,5kHz
  SPI_OnBoard(0xA680);  //Frequenz auf: 868.32MHz
  SPI_OnBoard(0x908C);  //200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
  SPI_OnBoard(0xC623);  //Datenrate: 9.54kbps
  SPI_OnBoard(0x9870);  //1mW Ausgangangsleistung, 120kHz Frequenzshift

  SPI_External(0xC0E0);  //Clock einstellungen (Ausgang)
  SPI_External(0x80E7);  //FIFO Aktivieren
  SPI_External(0xC2AB);  //Daten Filter
  SPI_External(0xCA81);  //FIFO Modus
  SPI_External(0xE000);  //Disable Wakeuptimer
  SPI_External(0xC800);  //Disable low Duty Cycle
  SPI_External(0xC4F7);  //AFC Einstellungen: autotuning: -10kHz...+7,5kHz
  SPI_External(0xA680);  //Frequenz auf: 868.32MHz
  SPI_External(0x908C);  //200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
  SPI_External(0xC623);  //Datenrate: 9.54kbps
  SPI_External(0x9870);  //1mW Ausgangangsleistung, 120kHz Frequenzshift


  while(1)
  {
    while(!taster);
    LED_gn_1;
    SPI_External(0x0000);  //Status Register auslesen
    SPI_OnBoard(0x0000);  //Status Register auslesen

    SPI_OnBoard(0x82C8);  //Rx Einschalten
    SPI_OnBoard(0xCA81);  //FIFO Modus setzen
    SPI_OnBoard(0xCA83);  //FIFO Aktivieren

    SPI_External(0x8238);  //TX Enable
    SPI_External(0xB8AA);  //Senden wie im Beispiel
    SPI_External(0xB8AA);  //Senden wie im Beispiel
    SPI_External(0xB8AA);  //Senden wie im Beispiel
    SPI_External(0xB82D);  //Senden wie im Beispiel
    SPI_External(0xB8D4);  //Senden wie im Beispiel

    SPI_External(0xB8AA);  //Eigentliche Daten Senden AA

    SPI_External(0x8208);  //Tx Deaktivieren

    SPI_OnBoard(0xB000);  //FIFO Auslesen
    SPI_OnBoard(0x8208);  //Rx Deaktivieren

    LED_gn_0;
    while(taster);
  }
}

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.