Forum: Mikrocontroller und Digitale Elektronik Problem mit SPI: RFM12 an ATTiny85


von Stephan M. (stmz)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe mir eine Schaltung aufgebaut nach dem Schaltplan: 
http://obersomer.com/furios-power/images/atmel_projekte/rfm12/rfm12_empfaenger2_schaltplan.pdf 
, verwende jedoch statt dem ATTiny13 den ATTiny85. Im Prinzip ist die 
Schaltung denkbar einfach und das RFM12-Modul ist direkt per SPI an den 
ATTiny angeschlossen. Die Beschaltung ist minimal, es kommt daher auch 
kein Interrupteingang zum Einsatz. Um einen weiteren I/O-Port zu 
erhalten, habe ich nSEL (Chip-Select) auf GND gezogen (es sollen keine 
weiteren SPI-Geräte angeschlossen werden).

Ich verwende allerdings nicht die Quellcodes auf der Homepage. Als SPI 
kommt aktuell noch ein Software-SPI zum Einsatz:
1
unsigned short rf12_trans(unsigned short wert)
2
{  unsigned short werti=0;
3
  unsigned char i;
4
  cbi(RF_PORT, CS);
5
  for (i=0; i<16; i++)
6
  {  if (wert&32768)
7
      sbi(RF_PORT, SDI);
8
    else
9
      cbi(RF_PORT, SDI);
10
    werti<<=1;
11
    if (RF_PIN&(1<<SDO))
12
      werti|=1;
13
    sbi(RF_PORT, SCK);
14
    wert<<=1;
15
    _delay_us(0.3);
16
    cbi(RF_PORT, SCK);
17
  }
18
  sbi(RF_PORT, CS);
19
  return werti;
20
}

Soweit so gut. Das Senden von Daten klappt vermutlich auch, zumindest 
kann ich mit einem Funkscanner ein entsprechendes "Knacken" hören. 
Allerdings empfange ich keine Daten. Ich vermute, dass etwas bei der 
SPI-Kommunikation schief läuft.

Der ATTiny pollt regelmäßig den FIFO-Puffer des RFM12. Eine solche 
Kommunikation habe ich mittels Logic-Analyzer aufgezeichnet und an 
meinen Beitrag angehängt. Schön zu sehen sind die Daten, welche an das 
RFM12 gesendet werden:

0x82C8 //RX on
0xCA81 //Set FIFO mode
0xCA83 //Enable FIFO
0xB000 //Abfrage des ersten Byte
0xB000 //Abfrage des zweiten Byte
0xB000 //Abfrage des dritten Byte
0xB000 //Abfrage des vierten Byte
0X8208 //RX deaktivieren

Das Problem ist aber nun, dass scheinbar auf jeden Befehl eine Antwort 
gesendet wird. Nach meinem Verständnis sollte eine Antwort nur dann 
gesendet werden, wenn Statusregister abgefragt werden. Die Antworten 
variieren dabei scheinbar zufällig und sind mal 0xF8F8, 0xF9F9 etc.

Ich bin nun schon das ganze Wochenende mit dem Problem beschäftigt, habe 
schon das Forum durchsucht und auch Google bringt mich nicht wirklich 
weiter. Leider ist das Pollin-Datenblatt auch extrem kurz gehalten :(

Hat jemand von euch einen Tipp für mich? Sehe ich den Wald vor lauter 
Bäumen nicht?

viele Grüße
Stephan

von Stephan M. (stmz)


Lesenswert?

Noch als Ergänzung:

Initialisiert wurde der RFM12-Chip mit folgenden Befehlen:
1
  rf12_trans(0x80D7); // Enable FIFO
2
  rf12_trans(0xC2AB); // Data Filter: internal
3
  rf12_trans(0xCA81); // Set FIFO mode
4
  rf12_trans(0xE000); // disable wakeuptimer
5
  rf12_trans(0xC800); // disable low duty cycle
6
  rf12_trans(0xC4F7); // AFC settings: autotuning: -10kHz...+7,5kHz

Der ATTiny85 läuft über den internen Oszillator mit 8 MHz (eine 
Verringerung auf 1 MHz führte zu keiner Verbesserung).

von Stephan M. (stmz)


Lesenswert?

Hallo zusammen,

ok, es liegt glaub daran, dass der Chip-Select zwischen den 
Übertragungen tatsächlich deaktiviert werden muss. Ihn dauerhaft auf GND 
zu ziehen scheint wohl problematisch zu sein.

viele Grüße
Stephan

von Stephan M. (stmz)


Lesenswert?

Für alle, die dasselbe Problem haben:

* CS darf nicht dauerhaft auf GND gezogen werden. Eine Änderung wird 
benötigt um eine Kommunikation zu beenden
* Man sollte auch in der Lage sein, die Anzahl der Nullen bei F_CPU 
richtig abzuzählen. Dann klappt es auch mit den Timings ;)


Mein Problem ist also gelöst!

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.