Hallo Ich will meinen HTPC vom Fernseher aus über CEC steuern. Dafür will ich einen STM32F072 verwenden, den ich dann per USB an den PC anschließe. der STM32 kann CEC in Hardware. Mein aktueller Aufbau ist: TV <--> AV-Receiver <--> HTPC <--> BD-Player Zum Testen habe ich das Kabel geöffnet und I2C (DDC) und CEC verbunden. Ich habe mich in die Spezifikationen von CEC eingelesen. Über Cube MX habe ich die CEC Peripherie konfiguriert. Prinzipiell läuft der Aufbau. Ich kann CEC Nachrichten verschicken und empfangen. Die empfangenen Daten entsprechen dem, was ich erwarte. Leider scheint es mit dem Senden nicht so zu klappen. Wenn ich z.B. eine Nachricht "0x36, Standby" verschicke, geht der AV-Receiver aus. Wenn ich mit dem Befehl 0x82 das aktive Device ändere, wechselt der AV-Receiver auf den entsprechenden Eingang. Leider reagiert der TV gar nicht. Es wirkt auf mich so, als ob die Nachrichten beim TV nicht ankommen. Weder wird auf den entsprechenden HDMI-Eingang gewechselt, noch geht der TV aus. Wenn ich den BD-Player einschalte, empfängt der STM32 prinzipiell die selben Befehle, die auch ich mit dem STM32 verschicke. Beim BD-Player verhält sich aber der TV wie erwartet: erwechselt den Eingang. Laut der Dokumentation ist CEC ein durchgehender BUS. Die physikalischen HDMI-Adressen entsprechen auch dem, was ich erwarten würde: TV: 0.0.0.0 AV-Receiver 2.0.0.0 (Angeschlossen an HDMI2) BD-Player 2.3.0.0 (Angeschlossen an HDMI3 am AV-Receiver) HTPD: 2.8.0.0 (Angeschlossen an HDMI8 am AV-Receiver) Der TV fordert sowohl von AV-Receiver als auch vom BD-Player den OST-Text an. Das passiert beim HTPC auch nicht. Daher vermute ich, dass entweder beim TV nichts ankommt oder die Signale für den TV nicht verständlich sind. Hat sich jemand mit CEC schon beschäftigt und eine Idee, wo es klemmen könnte? Ich bin gerade ein wenig ratlos. Vielen Dank, Tilo
Hallo Ich habe mit einem Logic-Analyzer das Problem gefunden. Beim STM32 muss man, bevor man das letzte Byte einer Nachricht verschickt, ein Register setzen, damit nach dem Byte "End of Message" generiert wird. Ich verwende die fertig HAL. Damit sollte das ganze automatisch passieren. In der stm32f0xx_hal_cec.c ist in der Interrupt-Funktion ein Fehler. Original:
1 | /* ----------------------------Tx Management----------------------------------*/
|
2 | /* CEC TX byte request interrupt ------------------------------------------------*/
|
3 | if((reg & CEC_FLAG_TXBR) != RESET) |
4 | {
|
5 | if (hcec->TxXferCount == 0U) |
6 | {
|
7 | /* if this is the last byte transmission, set TX End of Message (TXEOM) bit */
|
8 | __HAL_CEC_LAST_BYTE_TX_SET(hcec); |
9 | hcec->Instance->TXDR = *hcec->pTxBuffPtr++; |
10 | }
|
11 | else
|
12 | {
|
13 | hcec->Instance->TXDR = *hcec->pTxBuffPtr++; |
14 | hcec->TxXferCount--; |
15 | }
|
16 | /* clear Tx-Byte request flag */
|
17 | __HAL_CEC_CLEAR_FLAG(hcec,CEC_FLAG_TXBR); |
18 | }
|
Problem: Statt
1 | if (hcec->TxXferCount == 0U) |
gehört dort
1 | if (hcec->TxXferCount == 1U) |
rein. Ansonsten wird falsch gezählt und ein Byte zu viel verschickt. Jetzt muss ich schauen, wie ich den Bug an STM kommunizert bekomme. Viele Grüße, Tilo
Update Ind er Zwischenzeit läuft alles. Leider hat der CEC-Teil einen Hardware Bug: Man muss den Listen Mode auf "Receive all Messages" stellen. Im Transmitter ist ein Bug der dafür sorgt, dass die Daten an andere Teilnehmer nicht sauber gefiltert werden. DAs löst dann RX Overflow Fehler aus. Hat mich einige Zeit gekostet. Ich hab ein Errata zum 042, allerdings leider nicht zum 072 gefunden :(
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.