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


von Andreas (Gast)


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)


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

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.