STM32F103 can

Gast #3345395
Lesenswert?
• ▲
▼
Hallo,
Ich habe 2 Boards mit dem STM32F103vct6 von e... mit CAN,  habe das 
mitgelieferte CAN Beispiel auf beiden Boards aufgespielt doch leider 
funktioniert das ganze nur 1-2 mal.

vielleicht kann mir da einer Weiterhelfen.
mfg
Angehängte Dateien:
#3345498
Lesenswert?
• ▲
▼
Hi,

bei "CAN_ID_STD" darf die ID nur 11 bit lang sein...
...dein "0xA5A5" sind 16bit

füge mal in der Funktion "CanWriteData"
diese Zeilen direkt VOR dem senden hinzu :
(der Code ist eigentlich für den STM32F4 ich hoffe der ist beim F1 
gleich und es gibt dort auch TME0 bis TME2)
.
1
  uint32_t timeout;
2

3
  timeout=0;
4
  while(!(CAN1->TSR & CAN_TSR_TME0 || CAN1->TSR & CAN_TSR_TME1 || CAN1->TSR & CAN_TSR_TME2)) {
5
    timeout++;
6
    if(timeout>CAN1_TX_TIMEOUT)  break;
7
  }
8
  CAN_Transmit(CAN1,&TxMessage);

und in der Receive ISR bin ich mir nicht sicher ob diese Zeile
überhaupt notwendig ist :
1
CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0);

bei meinen Test lösche ich keine Flags und es funktioniert trotzdem
(kann aber auch ein Fehler bei mir sein)

Gruss Uwe
Gast #3345985
Lesenswert?
• ▲
▼
hallo,
Er bleibt immer hier hängen

if (CanTxStatus == CANTXPENDING) {
// Message Sendevorgang läuft gerade

}

1
void CanWriteData(uint16_t ID)
2
{
3
  CanTxMsg TxMessage;
4
  uint8_t CanMailBox;
5
  uint8_t CanTxStatus;
6

7
  CAN_DATA0=rand()%0xff;  CAN_DATA1=rand()%0xff;  
8
  CAN_DATA2=rand()%0xff;  CAN_DATA3=rand()%0xff;  
9
  CAN_DATA4=rand()%0xff;  CAN_DATA5=rand()%0xff;
10
  CAN_DATA6=rand()%0xff;  CAN_DATA7=rand()%0xff; 
11

12
  /* transmit */
13
  TxMessage.StdId = 0x123;//ID;  
14
//TxMessage.ExtId = 0x00;     
15
  TxMessage.RTR = CAN_RTR_DATA; 
16
  TxMessage.IDE = CAN_ID_STD;   
17
  TxMessage.DLC = 8;            
18
  TxMessage.Data[0] = CAN_DATA0;    
19
  TxMessage.Data[1] = CAN_DATA1;    
20
  TxMessage.Data[2] = CAN_DATA2;    
21
  TxMessage.Data[3] = CAN_DATA3;    
22
  TxMessage.Data[4] = CAN_DATA4;    
23
  TxMessage.Data[5] = CAN_DATA5;     
24
  TxMessage.Data[6] = CAN_DATA6;    
25
  TxMessage.Data[7] = CAN_DATA7;     
26

27
 //while(!(CAN1->TSR &CAN_TSR_TME0 || CAN1->TSR & CAN_TSR_TME1 || CAN1->TSR & CAN_TSR_TME2)){}
28
 
29

30

31

32

33
  CanMailBox = CAN_Transmit(CAN1, &TxMessage);   // Rückgabe Mailbox-Nr. 0,1,3 (4=keine Mailbox frei)
34
  if (CanMailBox == CAN_NO_MB) {
35
    // Mailboxen voll mit ungesendeten Messages
36
    printf("--> keine Mailbox frei \r\n");  
37
  } else {
38
    // Mailbox verfügbar
39
    // Sendevorgang läuft
40
    printf("--> Mailbox-Nr.: %u \r\n",CanMailBox);
41
    while(1) {
42
      CanTxStatus = CAN_TransmitStatus(CAN1, CanMailBox);   // Rückgabe 0=Fehler, 1=ok, 2=senden läuft noch
43

44
    
45
      printf("--> TxStatus: %u \r\n",CanTxStatus);
46
      if (CanTxStatus == CANTXPENDING) {
47
        // Message Sendevorgang läuft gerade
48
        printf("--> Sendevorgang aktiv!");
49
         
50
        
51
        printf("EWG:%u EPV:%u BOF:%u TEC:%u \r\n",CAN_GetFlagStatus(CAN1, CAN_FLAG_EWG),CAN_GetFlagStatus(CAN1, CAN_FLAG_EPV), CAN_GetFlagStatus(CAN1, CAN_FLAG_BOF), (uint16_t)(CAN1->ESR >> 16) & 0x000000FF);
52

53
      }
54
      if (CanTxStatus == CANTXFAILED) { // CANTXFAILED bis V3.4.0 - V3.5.0 dann CANTXFAILE
55
        // Fehler Message nicht gesendet         
56
        printf("--> Senden nicht erfolgreich \r\n");        
57
        break;
58
      }
59
      if (CanTxStatus == CANTXOK) {        
60
        // Message gesendet und bestätigt
61
        printf("--> Senden OK \r\n");        
62
        break;
63
      }
64
    }
65
  }
66

67

68
}
Gast #3351311
Lesenswert?
• ▲
▼
>funktioniert das ganze nur 1-2 mal.
Haste auf der Empfängerseite auch die Mailbox(en) richtich konfiguriert? 
Wenn die voll sind und der Sender steht auf RTR kanns sein daß der ewig 
(oder 127x ?) anfordert. Ich kenn mich mit STM32 nicht aus, müßte aber 
das gleiche Verhalten sein wie auf meinen SAM3X. CAN ist schließlich 
CAN.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.