Forum: Mikrocontroller und Digitale Elektronik HDMI CEC mit STM32 Signal kommt nicht durch


von Tilo (Gast)


Lesenswert?

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

von Tilo (Gast)


Lesenswert?

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

von Tilo (Gast)


Lesenswert?

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