Forum: Mikrocontroller und Digitale Elektronik RFM12 und STM32F1xx


von Gerry L. (Gast)


Lesenswert?

Hallo,

hat schon jemand den RFM12 am STM32F1xx zum laufen gebracht?
Ich versuch gerade den Code (c kein asm) von Benedikt anzupassen bin 
aber erst seit knapp 1 Woche mit dem STM32 vertraut. Daher fällt mir das 
ganze etwas schwer.

Wäre schön wenn mir jemand unter die Arme greifen könnte.

Gerry

von Sven Wagner (Gast)


Lesenswert?

Gerry L. schrieb:
> Wäre schön wenn mir jemand unter die Arme greifen könnte.
Stell konkrete Fragen, beschreibe detailiert, was Du gemacht hast, wo es 
jetzt hängt und welches Resultat Du erwartet hättest. So kann man am 
ehesten helfen.

Die SPI-Schnittstelle wird wohl schon mal jemand am STM32 genutzt haben. 
Ob nun für RFM12 oder was anderes, ist wahrscheinlich zweitrangig.

Grüße
Sven

von Gerry L. (Gast)


Lesenswert?

Also es geht darum das ich die korrekte komunikation nicht zustande 
bekomme.
Meine init routinen sehen so aus:
1
/********************************************************************************************************************************************************/
2
void GPIO_Configuration(void)
3
{
4
    GPIO_InitTypeDef GPIO_InitStructure;
5
    /* Configure SPI2 pins: SCK, MISO and MOSI -------------------------------*/
6
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
7
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
8
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
9
    GPIO_Init(GPIOB, &GPIO_InitStructure);
10
}
11
12
/*******************************************************************************
13
*******************************************************************************/
14
static void RFM12_SPI_Init(void) 
15
{ 
16
  SPI_InitTypeDef  SPI_InitStructure;
17
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
18
  /* DISABLE SPI1 */ 
19
  SPI_Cmd(SPI1, DISABLE); 
20
  
21
  /* SPI1 Config -------------------------------------------------------------*/ 
22
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 
23
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master; 
24
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; 
25
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; 
26
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; 
27
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; 
28
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; 
29
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; 
30
  SPI_InitStructure.SPI_CRCPolynomial = 7; 
31
  SPI_Init(SPI2, &SPI_InitStructure); 
32
  
33
  /* Enable SPI2 */ 
34
  SPI_Cmd(SPI2, ENABLE); 
35
} 
36
37
/*******************************************************************************
38
*******************************************************************************/
39
unsigned short rf12_trans(unsigned short wert){
40
41
  // Wait for SPI1 Tx buffer empty
42
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); 
43
    // Send SPI1 data
44
    SPI_I2S_SendData(SPI2,wert); 
45
    // Wait for SPI1 data reception
46
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET); 
47
    // Read SPI1 received data
48
    return SPI_I2S_ReceiveData(SPI2); 
49
  
50
}
51
52
/******************************************************************
53
   
54
 *****************************************************************/
55
void rf12_init(void)
56
{
57
    /* GPIO configuration ----------------------------------------------------*/
58
    GPIO_Configuration();
59
  RFM12_SPI_Init();
60
...
61
}
62
63
/******************************************************************
64
 *****************************************************************/
65
static void rf12_ready(void)
66
{
67
  RFM12_CS(0);
68
  //while ((GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)));      // wait until FIFO ready
69
  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
70
  RFM12_CS(1);
71
 }
72
73
#define RFM12_CS(a)  if (a)  \
74
          GPIO_SetBits(GPIOB,GPIO_Pin_12);\
75
          else    \
76
          GPIO_ResetBits(GPIOB,GPIO_Pin_12)

Es findet eine Komunikation statt, das sehe ich mit dem Logicport, aber 
scheinbar ist irgendetwas faul da das Modul nicht korrekt angesprochen 
wird.

Ich weiss nur leider nicht was

von Dennis P. (dennisp)


Lesenswert?

Hi, hast du es zum laufen bekommen? Ich kriege es auch nicht hin, dass 
der RFM12 ordentlich über SPI antwortet. Habe den Code von "DasLabor" 
angepasst und ich kriege den rfm12(b) nicht zum horchen. Ein nrf2401+ 
habe ich zum laufen bekommen.

von Gerry L. (Gast)


Angehängte Dateien:

Lesenswert?

Ja.
1
int main(void){
2
3
    rf12_init();
4
    rf12_config(RF_BAUDRATE, CHANNEL, 7, NORMAL);  // Baudrate, Kanal (0-3), Leistung (0=max, 7=min), Umgebungsbedingungen (QUIET, NORMAL, NOISY)
5
  rf12_rxmode();
6
7
    for(;;)
8
     {  
9
    strcpy((char *)rx_data,Telegram.Empfaenger_Nr);
10
    strcat((char *)rx_data,"-");
11
    strcat((char *)rx_data,Telegram.Absender_Nr);
12
    strcat((char *)rx_data,"-");
13
    strcat((char *)rx_data,Telegram.Temperatur);
14
    strcat((char *)rx_data,"-");
15
    strcat((char *)rx_data,Telegram.Voltage);
16
    strcat((char *)rx_data,"-");
17
    strcat((char *)rx_data,Telegram.Power);
18
19
20
    if (!(flags&WAITFORACK))          // Puffer nur dann füllen, wenn die alten Daten aus dem Puffer wirklich angekommen sind
21
    {  
22
    
23
24
      if (secflag)                    // 1Hz
25
      {  
26
        secflag=0;
27
        sekunde++;
28
        
29
        if( sekunde == 1 ){
30
31
          strcpy((char *)txbuf,"1");
32
          strcat((char *)txbuf,"#");
33
          strcpy((char *)txbuf,"1");
34
          strcat((char *)txbuf,"#");
35
          strcat((char *)txbuf,"10.00");
36
          strcat((char *)txbuf,"#");          
37
          strcat((char *)txbuf,"3.300");
38
          strcat((char *)txbuf,"#");          
39
          strcat((char *)txbuf,"1");
40
41
          if (!tx_cnt) delaycnt=TX_TIMEOUT/2;
42
          tx_cnt=strlen((char *)txbuf);
43
          sekunde=0;
44
        }
45
      }
46
        
47
      if ( (tx_cnt>=MAX_BUF) || ( (tx_cnt)&&(delaycnt==0) ) ) // Puffer voll, oder timeout seit erstem Byte im Puffer vorbei ?  -> senden
48
      {  
49
        GPIOB->BRR = GPIO_Pin_1;        //Retrans LED aus
50
        tx_status=0;            // zu sendender Status
51
        tx_packet(0);            // erstmaliger Transfer
52
      }
53
54
    }
55
    else if (delaycnt==0)            // Timeout: Daten nochmal senden
56
    {  
57
      GPIOB->BSRR = GPIO_Pin_1;          //Retrans LED ein
58
      
59
      if (retrans_cnt)
60
      {  
61
        retrans_cnt--;
62
               tx_packet(1);            // retransmit
63
      }
64
      else                  // Versuche abgelaufen
65
      {  
66
          tx_cnt=0;              // -> Daten verwerfen
67
        tx_id++;
68
        flags&=~WAITFORACK;          // Daten als OK markieren
69
      }
70
    }
71
  }
72
}

Sorry für Codeposting.

Gerry

von Gerry L. (Gast)


Angehängte Dateien:

Lesenswert?

rfm12.c

von sebastian (Gast)


Lesenswert?

Auf welche Geschwindigkeit wurde die SPI initialisiert ? Das RF12 sollte 
nicht mit mehr als 8 MHz, besser 2,5 MHz angesprochen werden.

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.