STM32F103 can

Gast #3345395
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
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
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
>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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.