RFM70 - Ich erbitte Starthilfe

Gast #2790963
Lesenswert?

Hallo Zusammen,
ich versuche gerade eine Kommunikation zwischen zwei RFM70-Modulen 
aufzubauen.
Zu allem Übel bin ich gerade von Bascom auf C umgestiegen, was die Sache 
nicht nennenswert leichter macht.

Ich habe den Beispielcode und die Library von 
http://projects.web4clans.com/?p=90 genommen. Dieser Code ist für den 
Atmega32 konzipiert. Ich arbeite mit einem Atmega168.

Mein erstes Problem ist folgendes:
Im Beispielcode steht
1
    #include <inttypes.h>
2
    #include <avr/io.h>
3
    #include <avr/interrupt.h>
4
    #include <util/delay.h>
5
     
6
    #include "uart.h"
7
    #include "rfm70.h"
8
     
9
    #define UART_BAUD_RATE 9600
10
     
11
    int main()
12
    {
13
    uint8_t buffer[32];
14
     
15
    sei();
16
    uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
17
     
18
    DDRA |= (1<<PA4);
19
    _delay_ms(1000);
20
    uart_puts("System Ready\n");
21
    Begin();
22
     
23
    setMode(1);
24
    setChannel(8);
25
     
26
    while (1)
27
    {
28
    if (receivePayload(buffer))
29
    {
30
    uart_puts((char*)buffer);
31
    uart_puts("\n");
32
    }
33
    }
34
    }

Mit dieser Zeile
1
    DDRA |= (1<<PA4);
habe ich ein Problem, der Atmega168 hat ja keinen PortA und ich kann die 
Aufgabe hier noch nicht ganz nachvollziehen. Welchen Port müsste ich 
hier für den Atmega168 wählen? In der Library rfm70.c taucht dieser Port 
auch auf. Es ist jedoch keine Funktion dafür näher beschrieben.

Freundliche Grüße, Christian
Gast #2791031
Lesenswert?

Hallo Sascha,
leider ist auf der Projektseite kein Schaltplan hinterlegt. Ich habe 
auch schon geguckt, ob der Atmega32 an diesem Pin eine besondere 
Funktion hat. Dies ist nicht der Fall.

Hier ein Ausschnitt aus der rfm70.c dort ist PA4 an zwei stellen 
verwendet. Vielleicht kann sich darauf ja jemand einen Reim bilden.
1
uint8_t sendPayload(uint8_t * payload, uint8_t len, uint8_t toAck)  // choose 0=nAck, 1=AckRequest
2
{
3
  
4
    // check TX_FIFO
5
    uint8_t status;
6
    status = readRegVal(RFM70_REG_FIFO_STATUS); 
7
    if (status & RFM70_FIFO_STATUS_TX_FULL) 
8
  {
9
      debug(RFM70_DEBUG_FIFO_FULL);
10
      return 0;
11
    }
12

13
    // send payload
14
  PORT_SPI &=~ (1<<CSN);
15
    _delay_ms(RFM70_CS_DELAY);
16
    if(toAck == -1)
17
      transmitSPI(RFM70_CMD_W_ACK_PAYLOAD);
18
    else if (toAck == 0)
19
      transmitSPI(RFM70_CMD_W_TX_PAYLOAD_NOACK);
20
    else
21
      transmitSPI(RFM70_CMD_WR_TX_PLOAD);
22
    while(len--) 
23
  {
24
      transmitSPI(*(payload++));
25
    uart_putc(*payload);
26
    uart_puts(", ");
27
    }
28
  PORT_SPI |= (1<<CSN);
29
    _delay_ms(RFM70_CS_DELAY);
30
  uart_puts("\n");
31
  PORTA ^= (1<<PA4);
32
    return 1;
33
}
34

35
uint8_t receivePayload(uint8_t *payload)
36
{
37
    uint8_t len;
38
    // check RX_FIFO
39
    uint8_t status;
40
    status = readRegVal(RFM70_REG_STATUS);
41
    if (status & RFM70_IRQ_STATUS_RX_DR) { // RX_DR
42
          PORTA ^= (1<<PA4);
43
      //while(1) {
44
        uint8_t fifo_sta;
45
        len = readRegVal(RFM70_CMD_RX_PL_WID); // Payload width
46
        readRegBuf(RFM70_CMD_RD_RX_PLOAD, payload, len);
47
        fifo_sta = readRegVal(RFM70_REG_FIFO_STATUS);
48
        //if (fifo_sta & RFM70_FIFO_STATUS_RX_EMPTY) break; // read until RX_FIFO empty
49
      //}
50
    
51
        if (fifo_sta & RFM70_FIFO_STATUS_RX_EMPTY) {
52
          status|= 0x40 & 0xCF; // clear status bit rx_dr
53
        writeRegVal(RFM70_CMD_WRITE_REG | RFM70_REG_STATUS, status); 
54
        }
55
      return len;
56
    }
57
    else
58
  {
59
    
60
      return 0;
61
  }
62
}
Gast #2791084
Lesenswert?

Ich danke euch.
Habe jetzt einen anderen Pin genommen und das im Programm enstprechend 
angepasst.

Nur so richtig senden und empfangen will das Ding noch nicht. Na mal 
schauen, wie das weitergeht :-)
#2836133
Lesenswert?

Hallo,

ich habe eine kleine Frage zu den Registerinitialisierungen des RFM70.

Im HopeRF-Beispielcode (und auch in der oben genannten Library) ist die 
Bitreihenfolge bei der Initialisierung der Registerbank 1 teilweise 
genau umgekehrt:

Im Datenblatt steht z.B. "00 / 31:0  0  W / Must write with 
0x404B01E2" - initialisiert wird mit "{ (0x20|0x00), 0x40, 0x4B, 0x01, 
0xE2 }".
ABER Datenblatt: "0C / 31:0  0  Please initialize with 0x00731200" - 
und initialisiert wird mit "{ (0x20|0x0C), 0x00, 0x12, 0x73, 0x00 }".

Ist das wirklich richtig so?


Danke schonmal!

Viele Grüße,
Michael
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren