Hallo,
ich experimentiere gerade mit dem STM32F103. Dort möchte ich zwischen
zwei STM32 Chips CAN-Daten austauschen. Hierzu habe ich beide
Prozessoren per CAN miteinander verbunden.
Im Prinzip funktioniert das auch prima - bis auf - ja bis auf den Ich
Durchsatz, der nur einem Teil der möglichen Baudrate entspricht. Ich
betreibe den Bus mit 125kbaud, erreiche aber nur so etwa 1/10 Durchsatz.
Kabelverbindung ist 50cm zwischen Sender und Empfänger
(Abschlusswiderstände sind dran)
Falls ich zu schnell sende, werden beim Empfänger einfach Frames
verschluckt.
Nachfolgend meine Interrupt Routine
1 | void USB_LP_CAN1_RX0_IRQHandler(void) {
|
2 |
|
3 | CanRxMsg RxMessage;
|
4 |
|
5 | CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
|
6 | can_counter++;
|
7 | //blink_yellow(); // just indicate we have received a CAN telegram
|
8 | LastCANmsg = RxMessage;
|
9 | //if (RxMessage.Data[0] == 1) {
|
10 |
|
11 | cand[0] = RxMessage.StdId;
|
12 | cand[1] = RxMessage.Data[0];
|
13 | cand[2] = RxMessage.Data[1];
|
14 | cand[3] = RxMessage.Data[2];
|
15 | cand[4] = RxMessage.Data[3];
|
16 | cand[5] = RxMessage.Data[4];
|
17 | cand[6] = RxMessage.Data[5];
|
18 | cand[7] = RxMessage.Data[6];
|
19 | cand[8] = RxMessage.Data[7];
|
20 | //print_can(RxMessage);
|
21 | }
|
Beim senden teste ich den Transmitstatus:
1 | TransmitMailbox = CAN_Transmit(CAN1, &canMessage);
|
2 | while((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK) && (i < 200000))
|
3 | {
|
4 | delay_us(1);
|
5 | i++;
|
6 | }
|
Meine Frage lautet:
Bei der Intitialisierung des CAN Busses setze ich:
1 | CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
|
Wie gross ist denn der CAN FiFo 0 und wo stellt man dessen Größe ein?
Beim senden überprüfe ich die Tx REegister
Gruß