Forum: Mikrocontroller und Digitale Elektronik RFM98 (in FSK Modus) - FIFO Problem (sendet nichts)


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Andreas (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich habe einen Atmega88 mit einem RFM98 Chip per SPI verbunden.
Die Beschaltung müsste funktionieren, da ich die gesetzten Bits wieder 
auslesen und vergleichen kann.

Derzeit arbeite ich gerade daran, dass das Modul sendet. Was mir 
offensichtlich noch nicht gelungen ist.

Ich bin mir nicht sicher, ob rfm98_init() richtig umgesetzt worden ist.
Wenn ich das FIFO auslesen möchte erhalte ich immer den Wert 0x00. (Egal 
mit was ich es vorher gefüttert habe. 
(usart_write_char(rfm98_read(0x00));)

Die StatusRegister sind auch immer alle auf 0x00 gesetzt.
usart_write_char(rfm98_read(0x3e));
usart_write_char(rfm98_read(0x3f));

Kann mir jemand erklären, was ich falsch mache?
1
void rfm98_init(void)
2
{
3
    //SPI master init
4
  DDRB = (1<<SDO) | (1<<SCK) | (1<<CS) | (1<<RESET); // Set MOSI and SCK output
5
  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0);
6
  SPSR|=(1<<SPI2X);
7
8
    //Reset rfm
9
    PORTB &= ~ (1<<RESET);  
10
    _delay_ms(1);
11
    PORTB |= (1<<RESET);
12
    _delay_ms(5);
13
14
    //set sleep mode for setting
15
    rfm98_write(0x01, 0x00);
16
    // Wait for setup mode
17
    _delay_ms(100);
18
    if(rfm98_read(0x01) != 0x00) {
19
      usart_write_str("!sleep: ");
20
      usart_write_char(rfm98_read(0x01));
21
      usart_write_char(0x10);
22
    }
23
24
    //RegOpMode (0x01) set mode FSTx
25
    rfm98_write(0x01, 0x40); // FSK, high freq mod, FSTx mode
26
    // Wait for setup mode
27
    _delay_ms(100);
28
    if(rfm98_read(0x01) != 0x40) {
29
      usart_write_str("!FSTx: ");
30
      usart_write_char(rfm98_read(0x01));
31
      usart_write_char(0x50);
32
    }
33
34
    //set BitRate: RegBitrateMsb and RegBitrateLsb
35
    rfm98_write(0x02, 0x01);
36
    rfm98_write(0x03, 0x16);
37
38
    //RegSyncConfig 
39
    rfm98_write(0x27,0x18); 
40
41
    //RegFrfLsb | set frequence | Frf = Fstep x Frf(23;0) | Fstep = Fxosc/2^19
42
    uint32_t frf = (434.5 * 1000000.0) / FSTEP;
43
    rfm98_write(0x06, (frf >> 16) & 0xff);
44
    rfm98_write(0x07, (frf >> 8) & 0xff);
45
    rfm98_write(0x08, frf & 0xff);
46
}
1
void rfm98_sendpacket(unsigned char *data, unsigned char size)
2
{  
3
  unsigned char i;
4
5
  if (size>64) size=64;
6
  
7
  // clear RegFifo
8
  rfm98_write(0x00, 0x00);    // clear Fifo
9
  
10
    //RegPacketConf1
11
    rfm98_write(0x30, 0x00);
12
    //RegPacketConf2
13
    rfm98_write(0x31, 0x02);
14
    //RegPayloadLength
15
    rfm98_write(0x32, size);
16
17
    //RegFifoThresh (TxStartCondition)
18
    rfm98_write(0x35, 0x01);
19
    if(rfm98_read(0x35) != 0x01) {
20
      usart_write_str("!TxStCond: ");
21
      usart_write_char(rfm98_read(0x35));
22
      usart_write_char(0x01);
23
    }
24
25
    //till here working!
26
27
    //RegOpMode (0x01) set mode Tx 
28
    rfm98_write(0x01, 0x60); 
29
    // Wait for setup mode
30
    _delay_ms(100);
31
    if(rfm98_read(0x01) != 0x60) {
32
      usart_write_str("!Tx: ");
33
      usart_write_char(rfm98_read(0x01));
34
      usart_write_char(0x60);
35
    } 
36
37
  for (i = 0; i<size; i++)
38
  {   
39
    rfm98_write(0x00, *data++); //fifo
40
        //usart_write_char(rfm98_read(0x00));
41
  }
42
    
43
    usart_write_char(rfm98_read(0x3e));
44
    usart_write_char(rfm98_read(0x3f));
45
46
   
47
}

von Christian S. (roehrenvorheizer)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

es scheint beim RFM98 genauso zu funktionieren wie beim RFM69.
Ich habe noch nie probiert, Bytes ins Fifo zu schreiben, um genau diese 
wieder zu lesen.

Normalerweise löst man das Senden aus, entweder indem man so viele Bytes 
ins Fifo schreibt, bis der Schwellwert zum automatischen Senden 
überschritten wird, oder man füllt das Fifo nach Belieben und schaltet 
auf Senden um. Danach kann man das Flag "packet sent" abfragen.
Lesen aus dem Fifo kann man dann, wenn etwas empfangen wurde, nachdem 
das Synchronwort erkannt wurde und das entsprechende "data ready" oder 
ähnlich Flag 1 wird.

MfG

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]
  • [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.