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