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
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.