Hallo zusammen ich wollte in dernschuel einen Chat mit dem RFM 12 Modul realisieren. Da ich elektor abonnent bin, dachte ich mir ich nehme das Heft zur Hilfe. Nun stolpere ich immer beim Wait rfm12 Befehl. In dieser Funktion setze ich den Chipselect aso nSEL auf 0 und warte bis der Datenausgang SDO auf "high" geht. Dies macht dieser aber nie. Hätte jemand eine Idee was der "Bock" sein könnte? Danke schon im Vorraus Hier noch der Programmcode: /*********************************************************************** ***********\ * Dateiname: rfm12_treiber.c * * Projekt : uP-Grundausbildung AE2 * Hardware : SIRIUS 20-A mit H8/36049F * * Copyright: msw-winterthur, AE2 * * Beschreibung: * * * * * Datum: Autor: Version, Grund der Änderung: * 01.10.2010 M. Brunner V1.0 Neuerstellung * \*********************************************************************** ***********/ #include "iodefine.h" //H8/36049F I/O-Definitionen #include "AE2_define.h" //Port-Definitionen, Grundausbildung AE2 #define NSEL IO.PDR6.BIT.B0 #define SCK IO.PDR6.BIT.B1 #define SDI IO.PDR6.BIT.B3 #define SDO IO.PDR6.BIT.B2 /*********************************************************************** ***********\ * wait_1us * * Wartet die angegebene Zeit (Basis: Behfehls-Ausführungszeit) * faktor = Wartezeit: faktor * 1us (faktor: 1..65635) \*********************************************************************** ***********/ void wait_1us(unsigned int uiWert) { uiWert = uiWert << 1; while(--uiWert) { uiWert++; uiWert--; } } /* Hauptprogramm ******************************************************************/ void wait_rmf12(void) { NSEL = 0; while(SDO != 1); } /*********************************************************************** ******/ void send_spi(unsigned int uiDin2) { unsigned int uiEnddata = 0xB800; unsigned int uiZwischenspeicher = 0; unsigned char ucAusgabe = 0; unsigned char ucZaehler = 15; unsigned char i = 0; NSEL = 0; wait_1us(5); for(i=0; i<16; i++) { uiZwischenspeicher = uiDin2; uiZwischenspeicher = uiZwischenspeicher >> ucZaehler; uiZwischenspeicher = uiZwischenspeicher & 0x0001; if(uiZwischenspeicher == 1) { SDI = 1; wait_1us(3); SCK = 1; wait_1us(10); } else { SDI = 0; wait_1us(3); SCK = 1; wait_1us(10); } SCK = 0; wait_1us(5); SDI = 0; ucZaehler--; wait_1us(10); } wait_1us(5); NSEL = 1; } /*********************************************************************** ******/ void send_rfm12(unsigned int uiDin) { unsigned int uiEnddata = 0xB800; unsigned int uiZwischenspeicher = 0; unsigned char ucAusgabe = 0; unsigned char ucZaehler = 15; unsigned char i = 0; uiZwischenspeicher = uiDin | 0xFF00; uiEnddata = (uiEnddata & uiZwischenspeicher); uiDin = uiEnddata; NSEL = 0; for(i=0; i<16; i++) { uiZwischenspeicher = uiDin; uiZwischenspeicher = uiZwischenspeicher >> ucZaehler; uiZwischenspeicher = uiZwischenspeicher & 0x0001; if(uiZwischenspeicher == 1) { SDI = 1; SCK = 1; wait_1us(5); } else { SDI = 0; SCK = 1; wait_1us(5); } SDI = 0; SCK = 0; ucZaehler--; wait_1us(5); } NSEL = 1; } /*********************************************************************** ******/ void init_rfm12(void) { NSEL = 1; SCK = 0; SDI = 0; send_spi(0x80E7); send_spi(0x82D9); send_spi(0xA67C); send_spi(0xC647); send_spi(0x94A0); send_spi(0xC2AC); send_spi(0xCA81); send_spi(0xC483); send_spi(0x9854); send_spi(0xE000); send_spi(0xC800); send_spi(0xC000); /*send_spi(0xC0E0); // AVR CLK: 10MHz send_spi(0x80D7); // Enable FIFO send_spi(0xC2AC); // Data Filter send_spi(0xCA81); // FIFO mode send_spi(0xE000); // disable wakeuptimer send_spi(0xC800); // disable low duty cycle*/ } /*********************************************************************** ***********/ /*********************************************************************** ******/ void main(void) { unsigned char i; PortInitAE2(); //Einstellungen Grundausbildung AE2 IO.PCR6 = 0xFB; init_rfm12(); send_spi(0x8238); while(1) { wait_rmf12(); send_spi(0xB8AA); } }
Bist du sicher, dass dein SDO Pin am Controller auch bidirektional arbeitet? Denn du musst ja Daten dadrüber ausgeben und gleichzeitig bei der Abfrage von SDO den externen Status auch einlesen können und nicht den Wert, den du selber zuletzt dadrauf ausgegeben hast. Alternativ habe ich mal deine Register beim Initialisieren mit meinen verglichen. Es gibt nur geringe Unterschiede, aber dabei ist nichts, was dieses Verhalten auslösen könnte. Du hast auch nicht angegeben auf welcher Frequenz du arbeitest. Deine Einstellungen des RFM12 besagen, dass du im 868 MHZ Band mit genau 868,3 MHz arbeitest. Hier mal ein Vergleich deiner Init Werte zu meinen (nur die unterschiedlichen Register habe ich aufgeführt, erster Wert von dir, zweiter Wert von mir): setting command 1000 0000 1110 0111 // el , ef , 11.5pf, 866 MHz band 1000 0000 1101 0111 // el , ef , 11.5pf, 433 MHz band power management 1000 0010 1101 1001 // er , ebb , !et , es , ex , !eb , !ew , dc 1000 0010 1100 1001 // er , ebb , !et , !es , ex , !eb , !ew , dc frequency setting 1010 0110 0111 1100 // 868,3 MHz 1010 0110 0100 0000 // 434,00 MHz data rate command 1100 0110 0100 0111 // 4.8kbps 1100 0110 0010 0011 // 9.6kbps receiver control command 1001 0100 1010 0000 // Vdi , Fast , 67 kHz Bandbreite, -14db , -79dbm 1001 0100 1100 0100 // Vdi , Fast , 67 kHz Bandbreite, 0db , -79dbm afc command 1100 0100 1000 0011 // @pwr , keine Beschränkung , !st , !fi , oe , en 1100 0100 1001 0011 // @pwr , +15/-16 f(res) , !st , !fi , oe , en tx configuration control 1001 1000 0101 0100 // 90 kHz Frequenzhub, tx-power -12 dB, !mp 1001 1000 0010 0111 // 45 kHz Frequenzhub, tx-power -21 dB, !mp So auf den ersten Blick kann ich ansonsten auch keinen Fehler erkennen. Am besten wäre es, wenn du einen Logik Analyzer hättest um die Kommunikation real beobachten zu können. Ciao, Rainer
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.