RFM98 (in FSK Modus) - FIFO Problem (sendet nichts)

Gast #6288779
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
}
#6289604
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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.