Forum: Mikrocontroller und Digitale Elektronik RFM12 SDO ist "immer" low (keine daten?)


von C. H. (hedie)


Angehängte Dateien:

Lesenswert?

Hallo

Ich möchte gerne etwas mit den RFM12 Modulen machen.

Dazu habe ich ein modul zusammen mit einem Attiny2313 auf einen kleinen 
testprint gelötet.

Das SPI hab ich selbst programmiert:
1
unsigned int SPI(unsigned int uiData)
2
{
3
  unsigned char   ucCount = 0;
4
  unsigned int   uiReceive = 0;
5
  nSEL_0;
6
  _delay_ms(1);
7
  while(ucCount != 16)
8
  {
9
    ucCount++;
10
    if((uiData & 0x8000) > 0)  SDI_1
11
    else             SDI_0;
12
    SCK_1;
13
    _delay_ms(1);
14
    //uiReceive = (uiReceive | SDO); //Hier befindet sich noch ein fehler
15
    if(ucCount != 16) uiReceive = uiReceive << 1;
16
    SCK_0;
17
    _delay_ms(1);
18
    uiData = uiData << 1;
19
  }
20
  nSEL_1;
21
  _delay_ms(1);
22
  return uiReceive;
23
}

Das Problem ist nun, ich kann problemlos mit dem Modul kommunizieren, 
also es versteht was ich ihm sage.
Das sehe ich daran, das sich die Frequenz am CLK ausgang ändern wenn ich 
die entsprechenden Befehle sende.

Wenn ich jedoch das Status Register auslesen möchte, also 0x0000 sende, 
so bekomme ich nichts zurück ausser direkt nach einem Reset des boards.

Nach einem Reset sehen die Signale wie im Bild1 aus
Wen ich 0x0000 ein zweites mal sende, dan sehen die Signale so aus wie 
in
Bild2

Zur testweisen initialisierung sende ich lediglich zu beginn

SPI(0x80E7);
SPI(0xC0C0);

Ich habe an der Leitung SDO einen PullUp widerstand angebracht!

P.S. Die Programmoberfläche ghört zu meinem eigenen LogicAnalyzer 
(OpenLogic) Baupläne und Infos unter www.endasmedia.ch

Danke schonmal

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Da liegen Interrupte im RFM an, die Du nicht behandelt hast. Reine 
Vermutung.

von C. H. (hedie)


Angehängte Dateien:

Lesenswert?

Travel Rec. schrieb:
> Da liegen Interrupte im RFM an, die Du nicht behandelt hast. Reine
> Vermutung.

Danke für deine Antwort :)

Ich habe inzwischen einiges umgestellt...

Zu testzwecken habe ich das Beidpielprogramm aus diesem Thread 
Beitrag "Beispielprogramm für RFM12 433MHz Funk-Module" mal zur hilfe verwendet.

Ich habe die initialisierung, power on etc kopiert ausser die Frequenz 
einstellung. Diese habe ich auf meine 868MHz angepasst.

Doch leider empfange ich absolut nichts!!!
Hat irgendwer eine idee weshalb?

Im anhang findet sich die Logische Analyse :)
Also die Signale nach einem Tasterdruck
Ich habe die Signale mit OpenLogic aufgenommen. Programm ist mit dabei
Keine Installation notwendig!

Hier mein C Code

Das E_ bedeutet das es die Pins des Externen Moduls sind!
SDI_1 ist eingeschaltet und SDI_0 Ausgeschaltet
1
unsigned int SPI_External(unsigned int uiData)
2
{
3
  unsigned char   ucCount = 0;
4
  unsigned int   uiReceive = 0;
5
  E_nSEL_0;
6
  while(ucCount != 16)
7
  {
8
    ucCount++;
9
    if((uiData & 0x8000) > 0)  E_SDI_1
10
    else             E_SDI_0;
11
    E_SCK_1;
12
    _delay_us(10);
13
    //uiReceive = (uiReceive | SDO);
14
    if(ucCount != 16) uiReceive = uiReceive << 1;
15
    E_SCK_0;
16
    _delay_us(10);
17
    uiData = uiData << 1;
18
  }
19
  E_nSEL_1;
20
  while(!E_SDO);  //Auf externes Modul Warten
21
  return uiReceive;
22
}
23
24
unsigned int SPI_OnBoard(unsigned int uiData)
25
{
26
  unsigned char   ucCount = 0;
27
  unsigned int   uiReceive = 0;
28
  nSEL_0;
29
  while(ucCount != 16)
30
  {
31
    ucCount++;
32
    if((uiData & 0x8000) > 0)  SDI_1
33
    else             SDI_0;
34
    SCK_1;
35
    _delay_us(10);
36
    //uiReceive = (uiReceive | SDO);
37
    if(ucCount != 16) uiReceive = uiReceive << 1;
38
    SCK_0;
39
    _delay_us(10);
40
    uiData = uiData << 1;
41
  }
42
  nSEL_1;
43
  while(!SDO);  //Auf OnBoard Modul Warten
44
  return uiReceive;
45
}
46
47
48
int main( void )
49
{
50
  //RFM OnBoard
51
  DDRD = (1 << DDD4) | (1 << DDD5) ;                 //Ausgänge bestimmen
52
  DDRB = (1 << DDB0) | (1 << DDB2) | (1 << DDB3) ;         //Ausgänge bestimmen
53
  DDRB &= ~( 1 << DDB4 );                      //Eingang bestimmen
54
  DDRB &= ~( 1 << DDB1 );                      //Eingang bestimmen
55
56
  //////RFM External
57
  DDRD &= ~( 1 << DDD1 );                      //Eingang bestimmen
58
  DDRD = (1 << DDD2) | (1 << DDD3) | (1 << DDD0) ;         //Ausgänge bestimmen
59
60
  nSEL_1;
61
  SDI_0;
62
  SCK_0;
63
  E_nSEL_1;
64
  E_SDI_0;
65
  E_SCK_0;
66
67
  _delay_ms(50);
68
69
  SPI_OnBoard(0xC0E0);  //Clock einstellungen (Ausgang)
70
  SPI_OnBoard(0x80E7);  //FIFO Aktivieren
71
  SPI_OnBoard(0xC2AB);  //Daten Filter
72
  SPI_OnBoard(0xCA81);  //FIFO Modus
73
  SPI_OnBoard(0xE000);  //Disable Wakeuptimer
74
  SPI_OnBoard(0xC800);  //Disable low Duty Cycle
75
  SPI_OnBoard(0xC4F7);  //AFC Einstellungen: autotuning: -10kHz...+7,5kHz
76
  SPI_OnBoard(0xA680);  //Frequenz auf: 868.32MHz
77
  SPI_OnBoard(0x908C);  //200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
78
  SPI_OnBoard(0xC623);  //Datenrate: 9.54kbps
79
  SPI_OnBoard(0x9870);  //1mW Ausgangangsleistung, 120kHz Frequenzshift
80
81
  SPI_External(0xC0E0);  //Clock einstellungen (Ausgang)
82
  SPI_External(0x80E7);  //FIFO Aktivieren
83
  SPI_External(0xC2AB);  //Daten Filter
84
  SPI_External(0xCA81);  //FIFO Modus
85
  SPI_External(0xE000);  //Disable Wakeuptimer
86
  SPI_External(0xC800);  //Disable low Duty Cycle
87
  SPI_External(0xC4F7);  //AFC Einstellungen: autotuning: -10kHz...+7,5kHz
88
  SPI_External(0xA680);  //Frequenz auf: 868.32MHz
89
  SPI_External(0x908C);  //200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
90
  SPI_External(0xC623);  //Datenrate: 9.54kbps
91
  SPI_External(0x9870);  //1mW Ausgangangsleistung, 120kHz Frequenzshift
92
93
94
  while(1)
95
  {
96
    while(!taster);
97
    LED_gn_1;
98
    SPI_External(0x0000);  //Status Register auslesen
99
    SPI_OnBoard(0x0000);  //Status Register auslesen
100
101
    SPI_OnBoard(0x82C8);  //Rx Einschalten
102
    SPI_OnBoard(0xCA81);  //FIFO Modus setzen
103
    SPI_OnBoard(0xCA83);  //FIFO Aktivieren
104
105
    SPI_External(0x8238);  //TX Enable
106
    SPI_External(0xB8AA);  //Senden wie im Beispiel
107
    SPI_External(0xB8AA);  //Senden wie im Beispiel
108
    SPI_External(0xB8AA);  //Senden wie im Beispiel
109
    SPI_External(0xB82D);  //Senden wie im Beispiel
110
    SPI_External(0xB8D4);  //Senden wie im Beispiel
111
112
    SPI_External(0xB8AA);  //Eigentliche Daten Senden AA
113
114
    SPI_External(0x8208);  //Tx Deaktivieren
115
116
    SPI_OnBoard(0xB000);  //FIFO Auslesen
117
    SPI_OnBoard(0x8208);  //Rx Deaktivieren
118
119
    LED_gn_0;
120
    while(taster);
121
  }
122
}

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.