www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit Funkmodul RFM12 von Hope


Autor: Christian Julius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich komme zwar aus der PIC Welt aber vielleicht kann mir ja jemand 
helfen, C ist ja überall ähnlich.

Ich habe mir von Hope ein paar Samples des RFM12 Transceiver schicken 
lassen. Der mitgelieferte Code entsprach wenig meinen Vorstellungen von 
sauberer Programmierung, daher meine eigenen Zeilen geschrieben. Ich 
möchte zunächst den Sender ansteuern und zwar über das Datenregister, 
FSK liegt über 10k auf Plus, benutzt werden nur nIRQ und die SPI 
Leitungen. Leider reden die Module nicht, dass sich etwas tut sieht man 
ja nur auf dem Oszi, wenn man zB den Clock Out umstellt. Nach endloser 
Fehlersuche merkte ich zunächst, dass man die SPI mit CKE=1 betreiben 
muss (SDO valid before SCK, Sample bei steigender Flanke). Konfigurieren 
lässt es sich jetzt erst einmal hoffe ich.

Jetzt der Pferdefuss: Schickt man Daten in das TX Register soll nach 
Datenblatt die SDO leitung zappeln, wenn ein neues Byte geladen werden 
kann und invers dazu nIRQ. SDO zeigt auf dem Oszi nur kleine Peaks, nIRQ 
bleibt artig High und verändert sich gar nicht. Habe mit verschiedenen 
Baudraten gespielt, alternativ Pausen beim Senden eingefügt, nichts! ich 
dreh noch ab, denn den Fehler finde ich einfach nicht. EL Bit ist auch 
gesetzt.

Was kann es denn noch sein?







// TX: Datenbyte raussenden  (1=warten, 0=sofort senden (nur erstes Byte))
void RF_SendByte(byte data)
{
    SSPSTAT_CKE = 1;
  ChipSelect(devRFM,1);
//  while (SDI);
  SPIRF(0xB8);
  SPIRF(data);
  ChipSelect(devRFM,0);
  delay_us(200);
}  

// >>>>> TXRX: Initialisierung des Moduls <<<<
//
//   BR = 344827/(R+1)/(1+cs*7) [baud]   cs=1 => 8 cs=0 => 1
//
//   600  => cs=1 R=0x48 (C8)
//   1200 => cs=1 R=0x24 (A4)
//   2400 => cs=1 R=0x12 (92)
//   4800 => cs=0 R=0x48
//   9600 => cs=0 R=0x1a
//  19200 => cs=0 R=0x12 
//  38400 => cs=0 R=0x06

void RF_Init()
{

  // Befehle werden erkannt und funktionieren  

  RF_CMD(0x80D7);  //EL,EF,12.0pF
  RF_CMD(0xA640);  //A140=430.8MHz
  RF_CMD(0xC647);  //4,8kbps
  RF_CMD(0x94A0);  //VDI,FAST,134kHz,0dBm,-103dBm
  RF_CMD(0xC2AC);  //AL,!ml,DIG,DQD4
  RF_CMD(0xCA81);  //FIFO8,SYNC,!ff,DR
  RF_CMD(0xC4F7);  //@PWR,autotune: -10kHz...+7,5kHz,!st,!fi,OE,EN
  RF_CMD(0x9850);  //!mp,9810=30kHz,MAX OUT
  RF_CMD(0xE000);  //NOT USE
  RF_CMD(0xC800);  //NOT USE
  RF_CMD(0xC000);  //kein WDT, kein Batteriewächter
  
  RF_CMD(0x8209);  //!er,!ebb,!ET,ES,EX,!eb,!ew,!DC (in Bereitschaft gehen)
  delay_ms(6);
}  


// >>>> TX: Senden einer Bytefolge + Checksumme <<<<<
// <2 x 0xAA>, <Anzahl Bytes>, <Bytes>... <Bytes>, <Checksumme>, < Dummy>

void RFTX_Send(byte* data, int16 size)
{
  byte check;
  int16 i;

  RF_CMD(0x8239);      // TX on
  delay_us(200);

  RF_SendByte(0xAA);    // Präambel ins Latch, lockt die PLL
  RF_SendByte(0xAA);
  RF_SendByte(0xAA);
  RF_SendByte(0x2D);    // FIFO Schlüssel 2DD4 (öffnet das Tor)
  RF_SendByte(0xD4);

  RF_Sendbyte(size+1);  // Anzahl folgender Bytes senden (incl Checksumme)

  check = 0;
  for (i=0; i<size; i++)  // Datensatz senden
  {
    RF_SendByte(*data);
    check += *(data++);
  }

  RF_Sendbyte(check);    // Checksumme
  RF_SendByte(0xAA);    // Dummy, nachschieben als Pipelineputzer
      
  RF_CMD(0x8209);      // TX off
}


  

Autor: Christian Julius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, vergessen, die SPI Routine... zur Erklärung oben: ChipSelect ist 
eine Routine, die über einen 8 aus 3 Decoder (74HC138) arbeitet, ich 
habe 6 unterschiedliche Slaves (3 x uC´, RTC, MMC usw) an einem SPI Bus. 
Getestet und arbeitet einwandfrei.

byte SPIRF(byte data)
{
  byte rec;

    // Solange SPI beschäftigt ist hämmere ihr die Daten ein bis frei wird   

  LED_AKTIV = 1;
  do {
        SSPCON1_WCOL = 0;
        SSPBUF = data;      // Sende Register beschreiben
    } while (SSPCON1_WCOL);

  // Datentransfer läuft, jetzt warten bis Byte vom Slave reingekommen
    while (!SSPSTAT_BF);
  rec = SSPBUF;
  
  LED_AKTIV = 0;
    return(rec);
}  


  

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.