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.

