Mikrocontroller und Digitale Elektronik
›
Thread
RFM12 und STM32F1xx
GL
Gerry L.
Gast
18.01.2012 19:07
#2507593
Hallo,
hat schon jemand den RFM12 am STM32 F1xx 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
SW
Sven Wagner
Gast
18.01.2012 23:06
#2507998
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
GL
Gerry L.
Gast
19.01.2012 19:48
#2509266
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
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.
GL
Gerry L.
Gast
21.02.2012 22:10
#2560471
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
GL
Gerry L.
Gast
21.02.2012 22:13
#2560479
S
sebastian
Gast
04.08.2012 10:18
#2780652
Auf welche Geschwindigkeit wurde die SPI initialisiert ? Das RF12 sollte
nicht mit mehr als 8 MHz, besser 2,5 MHz angesprochen werden.
↑ Nach oben
← Zurück zu Mikrocontroller und Digitale Elektronik
Antwort schreiben