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


von Christian Julius (Gast)


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?






1
// TX: Datenbyte raussenden  (1=warten, 0=sofort senden (nur erstes Byte))
2
void RF_SendByte(byte data)
3
{
4
    SSPSTAT_CKE = 1;
5
  ChipSelect(devRFM,1);
6
//  while (SDI);
7
  SPIRF(0xB8);
8
  SPIRF(data);
9
  ChipSelect(devRFM,0);
10
  delay_us(200);
11
}  
12
13
// >>>>> TXRX: Initialisierung des Moduls <<<<
14
//
15
//   BR = 344827/(R+1)/(1+cs*7) [baud]   cs=1 => 8 cs=0 => 1
16
//
17
//   600  => cs=1 R=0x48 (C8)
18
//   1200 => cs=1 R=0x24 (A4)
19
//   2400 => cs=1 R=0x12 (92)
20
//   4800 => cs=0 R=0x48
21
//   9600 => cs=0 R=0x1a
22
//  19200 => cs=0 R=0x12 
23
//  38400 => cs=0 R=0x06
24
25
void RF_Init()
26
{
27
28
  // Befehle werden erkannt und funktionieren  
29
30
  RF_CMD(0x80D7);  //EL,EF,12.0pF
31
  RF_CMD(0xA640);  //A140=430.8MHz
32
  RF_CMD(0xC647);  //4,8kbps
33
  RF_CMD(0x94A0);  //VDI,FAST,134kHz,0dBm,-103dBm
34
  RF_CMD(0xC2AC);  //AL,!ml,DIG,DQD4
35
  RF_CMD(0xCA81);  //FIFO8,SYNC,!ff,DR
36
  RF_CMD(0xC4F7);  //@PWR,autotune: -10kHz...+7,5kHz,!st,!fi,OE,EN
37
  RF_CMD(0x9850);  //!mp,9810=30kHz,MAX OUT
38
  RF_CMD(0xE000);  //NOT USE
39
  RF_CMD(0xC800);  //NOT USE
40
  RF_CMD(0xC000);  //kein WDT, kein Batteriewächter
41
  
42
  RF_CMD(0x8209);  //!er,!ebb,!ET,ES,EX,!eb,!ew,!DC (in Bereitschaft gehen)
43
  delay_ms(6);
44
}  
45
46
47
// >>>> TX: Senden einer Bytefolge + Checksumme <<<<<
48
// <2 x 0xAA>, <Anzahl Bytes>, <Bytes>... <Bytes>, <Checksumme>, < Dummy>
49
50
void RFTX_Send(byte* data, int16 size)
51
{
52
  byte check;
53
  int16 i;
54
55
  RF_CMD(0x8239);      // TX on
56
  delay_us(200);
57
58
  RF_SendByte(0xAA);    // Präambel ins Latch, lockt die PLL
59
  RF_SendByte(0xAA);
60
  RF_SendByte(0xAA);
61
  RF_SendByte(0x2D);    // FIFO Schlüssel 2DD4 (öffnet das Tor)
62
  RF_SendByte(0xD4);
63
64
  RF_Sendbyte(size+1);  // Anzahl folgender Bytes senden (incl Checksumme)
65
66
  check = 0;
67
  for (i=0; i<size; i++)  // Datensatz senden
68
  {
69
    RF_SendByte(*data);
70
    check += *(data++);
71
  }
72
73
  RF_Sendbyte(check);    // Checksumme
74
  RF_SendByte(0xAA);    // Dummy, nachschieben als Pipelineputzer
75
      
76
  RF_CMD(0x8209);      // TX off
77
}

  

von Christian Julius (Gast)


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.
1
byte SPIRF(byte data)
2
{
3
  byte rec;
4
5
    // Solange SPI beschäftigt ist hämmere ihr die Daten ein bis frei wird   
6
7
  LED_AKTIV = 1;
8
  do {
9
        SSPCON1_WCOL = 0;
10
        SSPBUF = data;      // Sende Register beschreiben
11
    } while (SSPCON1_WCOL);
12
13
  // Datentransfer läuft, jetzt warten bis Byte vom Slave reingekommen
14
    while (!SSPSTAT_BF);
15
  rec = SSPBUF;
16
  
17
  LED_AKTIV = 0;
18
    return(rec);
19
}

  

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.