Hallo Gemeinde, ich bin etwas angefressen... Ich habe ein NUCLEO-L476RG-Board (STM32L476RG) und möchte über CAN kommunizieren, aber ER will nicht. Setup: Nucleo64-Board mit CAN-Transceiver (kleines Chinaboard mit sn65hvd230), PCAN-USB (mit PCanView) und PCAN-Diag. Die Konfig wurde mit CubeMx "zusammengeklickt". Terminierung 58Ohm. Wenn alle o.g. Teinehmer am CAN sind kann ich von PCanView senden und PCAN-Diag empfängt die Message. Wenn PCAN-Diag abgestöpselt geht der CAN beim ersten Senden sofort auf BusHeavy. (sieht also keinen zweiten Teilnehmer mehr) Die Verdrahtung sollte OK sein. PA12=CAN1_Tx=Morphhaeder CN10:Pin12 PA11=CAN1_Rx=Morphhaeder CN10:Pin14 Jetzt bin ich am Ende mit meinem Latein... Der STM32L476RG hat 80MHz HCLK, prescaler ist 10, für 125ns Zeitquantum. CAN-Speed soll 500kBit/s sein. Der Resultcode für "HAL_CAN_Transmit" und "HAL_CAN_Receive" ist immer HAL_TIMEOUT Wäre für jeden Tipp dankbar. Grüße Runout
Wieviele Teilnehmer sind am Bus? Wenn außer µC und PCAN nichts ist, kann auch keiner ACKen und der µC MUSS aufhören.
@Uwe: Terminierung 58Ohm @Karl: der PCAN-USB ist ein vollwertiger Teilnehmer, er steht NICHT auf "listen only". Meine Frage war: ist das Software-Setting OK (Timing etc.) Überlege schon, ob ich einen MCP2551 probehalber dranhänge. (wenn der 3V3-tolerant ist) Von den China-Boards (sn65hvd230) habe ich drei Stück, die können nicht alle kaputt sein... Wenn Interesse besteht kann ich das ganze Miniprojekt mal hier reinstellen. Kann man mit dem Oszi die TTL-Pegel von PA11/PA12 messen? bitte um weiteres Brainstorming runout
:
Bearbeitet durch User
Sorry. Dachte PCAN-Diag wäre nur eine SW für den PCAN Adapter. Takt: Keine Ahnung, bin zu faul das nachzurechnen. Bei mir sieht es so aus STM32F4 mit 168 MHz):
1 | /* CAN1 init function */
|
2 | void MX_CAN1_Init(void) { |
3 | hcan1.Instance = CAN1; |
4 | hcan1.Init.Prescaler = 6; |
5 | hcan1.Init.Mode = CAN_MODE_NORMAL; |
6 | hcan1.Init.SJW = CAN_SJW_1TQ; |
7 | hcan1.Init.BS1 = CAN_BS1_10TQ; |
8 | hcan1.Init.BS2 = CAN_BS2_3TQ; |
9 | hcan1.Init.TTCM = DISABLE; |
10 | hcan1.Init.ABOM = ENABLE; |
11 | hcan1.Init.AWUM = DISABLE; |
12 | hcan1.Init.NART = DISABLE; |
13 | hcan1.Init.RFLM = DISABLE; |
14 | hcan1.Init.TXFP = ENABLE; |
15 | HAL_CAN_Init(&hcan1); |
16 | }
|
Der Instanzname ist Richtig? "CAN" statt "CAN1"? Warum ist dein ABOM aus? Sonst musst Du das alles von Hand machen. TXFP ist nur für spezielle Sachen relevant. Was ich sonst noch habe ist der PullUp am RX-Pin aktiv. Sonst verrent sich der CAN-Controller beim Aufstart schon, wenn am Bus nichts los ist. Oszi schon an CAN H und L gehabt? Fehlerursache No. 1 Verpolung, No. 2 fehlernder Abschluss. Transceiver hat Enable/VIO/Sleep etc. und wird richtig bedient? Welchen Zustand hat der CAN Controller im STM32? Ist die Configuration abgeschlossen? Filter richtig eingestellt (Da ist die Software doof geschrieben, Standard-IDs muss man noch zurechtrücken)?
Hallo Karl, aus stm32l476xx.h: #define CAN ((CAN_TypeDef *) CAN1_BASE) #define CAN1 ((CAN_TypeDef *) CAN1_BASE) ist also egal... hcan1.Init.ABOM - werde ich ausprobieren in HAL_CAN_MspInit() steht: /**CAN1 GPIO Configuration PA11 ------> CAN1_RX PA12 ------> CAN1_TX */ GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF9_CAN1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); sieht so aus, als hätte PA11 keinen Pullup. R-Output = High = rezessiv PCAN-Diag ist (u.a.) ein Oszi, aber da sieht man nix. (wenn ich von PCAN-USB aus sende kommt alles richtig an, der µC hingegen ist stumm und taub...) Danke für die Tipps
So, Problem gelöst... Die sn65hvd230-Baugruppe war's. Schaltplan siehe oben. Jetzt werkelt der gute alte MCP2551 mit 5V. Der "Rx" ist über einen 1k-Angstwiderling auf den PA11 vom Nucleo geschaltet. ob wohl die Eingänge 5V-tolerant sind. Warum das China-Geraffel nicht geht ist unklar. Die Pegel sollten lt. Datenblatt passen. 5€ das Stück, was solls... Grüße Runout
Hallo Fangemeinde (Nik, me-), DAS PROBLEM IST GELÖHÖST... siehe oben. Danke für die Hilfe. Runout
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.