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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren