Forum: Mikrocontroller und Digitale Elektronik STM32F103 can


von Manuel (Gast)


Angehängte Dateien:

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

von Peer (Gast)


Lesenswert?

Hardware OK?
Bus terminiert?

von Manuel (Gast)


Lesenswert?

ja hardware ist OK
und Terminiert auf beiden Seiten mit 120R

von Uwe B. (derexponent)


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

von Manuel (Gast)


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
}

von Manuel (Gast)


Lesenswert?

Da kann mir scheinbar keiner Weiterhelfen.

von Alex (Gast)


Lesenswert?

Welches Board isn das?

von Manuel (Gast)


Lesenswert?

Dieses hier . Ebay 190509403384

von Manuel (Gast)


Lesenswert?

Hat keiner eine Idee was hier nicht Richtig ist

von CANonier (Gast)


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.

von Manuel (Gast)


Lesenswert?

Laut dem mitgelieferten Beispiel sollte dies so funktionieren
das tuts nu leider nich schade.

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