📄 stm32100b_eval_cec.c
字号:
HDMI_CEC_RX_MessageStructPrivate.Opcode = CEC_ReceiveDataByte();
RxCounter++;
}
}
/* Clear all reception flags */
CEC_ClearFlag(CEC_FLAG_RSOM | CEC_FLAG_REOM | CEC_FLAG_RBTF);
}
/********************** Transmission ******************************************/
/* Check if a transmission error occured */
if (CEC_GetFlagStatus(CEC_FLAG_TERR))
{
TransErrorCode = HDMI_CEC_GetErrorStatus();
CEC_ClearFlag(CEC_FLAG_TBTRF | CEC_FLAG_TERR);
SendFrame = 1;
SendStatus = 0;
}
/* Check if end of message bit is set in the data to be transmitted */
else if (CEC_GetFlagStatus(CEC_FLAG_TEOM))
{
CEC_ClearFlag(CEC_FLAG_TBTRF | CEC_FLAG_RBTF);
CEC_EndOfMessageCmd(DISABLE);
SendFrame = 1;
SendStatus = SUCCESS;
}
/* Check if data byte has been sent */
else if (CEC_GetFlagStatus(CEC_FLAG_TBTRF))
{
/* Set EOM bit if the byte to be transmitted is the last one of the TransmitBuffer */
if (TxCounter == (HDMI_CEC_TX_MessageStructPrivate.TxMessageLength))
{
CEC_SendDataByte(BufferPointer[TxCounter]);
TxCounter++;
CEC_ClearFlag(CEC_FLAG_TBTRF);
CEC_EndOfMessageCmd(ENABLE);
}
else
{
/* Put the byte in the TX Buffer */
CEC_SendDataByte(BufferPointer[TxCounter]);
TxCounter++;
CEC_ClearFlag(CEC_FLAG_TBTRF);
}
}
}
/**
* @brief Report physical address to all other devices thus allowing any
device to create a map of the network.
* @param None
* @retval HDMI_CEC_Error: CEC Error code.
*/
HDMI_CEC_Error HDMI_CEC_ReportPhysicalAddress(void)
{
HDMI_CEC_Error errorstatus = HDMI_CEC_OK;
HDMI_CEC_Message HDMI_CEC_TX_Message;
HDMI_CEC_TX_Message.Header = ((MyLogicalAddress << 4) | 0xF);
HDMI_CEC_TX_Message.Opcode = HDMI_CEC_OPCODE_REPORT_PHYSICAL_ADDRESS;
HDMI_CEC_TX_Message.Operande[0] = MyPhysicalAddress >> 8;
HDMI_CEC_TX_Message.Operande[1] = MyPhysicalAddress & 0xFF;
HDMI_CEC_TX_Message.Operande[2] = DeviceType;
HDMI_CEC_TX_Message.TxMessageLength = 0x03;
errorstatus = HDMI_CEC_TransmitMessage(&HDMI_CEC_TX_Message);
return errorstatus;
}
/**
* @brief Handle CEC command receive callback.
* When receiving the STANDBY Opcode commande, the system is entred in
* Stop mode and when wakeup, the PLL is configured as system clock and
* the HSI is selected as PLL source.
* @param None
* @retval None
*/
void HDMI_CEC_CommandCallBack(void)
{
uint8_t i = 0, sendcount = 0;
HDMI_CEC_Error errorstatus = HDMI_CEC_OK;
EXTI_InitTypeDef EXTI_InitStructure;
switch (HDMI_CEC_RX_MessageStructPrivate.Opcode)
{
case HDMI_CEC_OPCODE_REPORT_PHYSICAL_ADDRESS:
HDMI_CEC_MapStruct.PhysicalAddress_A = HDMI_CEC_RX_MessageStructPrivate.Operande[1] >> 4;
HDMI_CEC_MapStruct.PhysicalAddress_B = HDMI_CEC_RX_MessageStructPrivate.Operande[1] & 0x0F;
HDMI_CEC_MapStruct.PhysicalAddress_C = HDMI_CEC_RX_MessageStructPrivate.Operande[0] >> 4;
HDMI_CEC_MapStruct.PhysicalAddress_D = HDMI_CEC_RX_MessageStructPrivate.Operande[0] & 0x0F;
HDMI_CEC_MapStruct.LogicalAddress = (HDMI_CEC_RX_MessageStructPrivate.Header >> 0x4) & 0x0F;
HDMI_CEC_MapStruct.DeviceType = HDMI_CEC_RX_MessageStructPrivate.Operande[2];
HDMI_CEC_DeviceMap[DeviceCount] = HDMI_CEC_MapStruct;
HDMI_CEC_Follower_String[(HDMI_CEC_DeviceMap[DeviceCount].LogicalAddress)][1] = (uint8_t *)"1";
DeviceCount++;
break;
case HDMI_CEC_OPCODE_STANDBY:
/* CEC Line */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8);
/* Configure the CEC Line as EXTI Line on Falling Edge */
EXTI_ClearITPendingBit(EXTI_Line8);
EXTI_InitStructure.EXTI_Line = EXTI_Line8;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/* Request to enter Stop mode */
PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);
/* Disable the CEC EXTI Line */
EXTI_InitStructure.EXTI_LineCmd = DISABLE;
EXTI_Init(&EXTI_InitStructure);
/* Configure the PLL Source */
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_6);
/* Enable PLL */
RCC_PLLCmd(ENABLE);
/* Wait till PLL is ready */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
/* Select PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* Wait till PLL is used as system clock source */
while(RCC_GetSYSCLKSource() != 0x08)
{
}
break;
case HDMI_CEC_OPCODE_GET_CEC_VERSION:
/* Send the Used CEC version */
HDMI_CEC_TX_MessageStructPrivate.Header = ((MyLogicalAddress << 4) | HDMI_CEC_RX_MessageStructPrivate.Header >> 4);
HDMI_CEC_TX_MessageStructPrivate.Opcode = HDMI_CEC_OPCODE_CEC_VERSION;
HDMI_CEC_TX_MessageStructPrivate.Operande[0] = HDMI_CEC_VERSION; /* CEC Version */
HDMI_CEC_TX_MessageStructPrivate.TxMessageLength = 0x01;
errorstatus = HDMI_CEC_TransmitMessage(&HDMI_CEC_TX_MessageStructPrivate);
/* Retransmit message until 5 time */
while ((errorstatus != HDMI_CEC_OK) && sendcount < 0x5)
{
sendcount++;
errorstatus = HDMI_CEC_TransmitMessage(&HDMI_CEC_TX_MessageStructPrivate);
}
break;
case HDMI_CEC_OPCODE_GIVE_PHYSICAL_ADDRESS:
/* Send the Physical address */
errorstatus = HDMI_CEC_ReportPhysicalAddress();
sendcount = 0;
/* Retransmit message until 5 time */
while ((errorstatus != HDMI_CEC_OK) && sendcount < 0x5)
{
sendcount++;
errorstatus = HDMI_CEC_ReportPhysicalAddress();
}
break;
case HDMI_CEC_OPCODE_FEATURE_ABORT:
/* The device doesn't support the requested message type, or that it cannot
execute it at the present time. */
FeatureOpcode = HDMI_CEC_RX_MessageStructPrivate.Operande[0];
AbortReason = HDMI_CEC_RX_MessageStructPrivate.Operande[1];
break;
case HDMI_CEC_OPCODE_GIVE_OSD_NAME:
/* Send the OSD name = STM32100B CEC*/
HDMI_CEC_TX_MessageStructPrivate.Header = ((MyLogicalAddress << 4) | HDMI_CEC_RX_MessageStructPrivate.Header >> 4);
HDMI_CEC_TX_MessageStructPrivate.Opcode = HDMI_CEC_OPCODE_SET_OSD_NAME;
/* STM32100B*/
HDMI_CEC_TX_MessageStructPrivate.Operande[0] = 0x53;
HDMI_CEC_TX_MessageStructPrivate.Operande[1] = 0x54;
HDMI_CEC_TX_MessageStructPrivate.Operande[2] = 0x4D;
HDMI_CEC_TX_MessageStructPrivate.Operande[3] = 0x33;
HDMI_CEC_TX_MessageStructPrivate.Operande[4] = 0x32;
HDMI_CEC_TX_MessageStructPrivate.Operande[5] = 0x31;
HDMI_CEC_TX_MessageStructPrivate.Operande[6] = 0x30;
HDMI_CEC_TX_MessageStructPrivate.Operande[7] = 0x30;
HDMI_CEC_TX_MessageStructPrivate.Operande[8] = 0x42;
HDMI_CEC_TX_MessageStructPrivate.Operande[9] = 0x20;
/* CEC */
HDMI_CEC_TX_MessageStructPrivate.Operande[10] = 0x43;
HDMI_CEC_TX_MessageStructPrivate.Operande[11] = 0x45;
HDMI_CEC_TX_MessageStructPrivate.Operande[12] = 0x43;
HDMI_CEC_TX_MessageStructPrivate.TxMessageLength = 13;
errorstatus = HDMI_CEC_TransmitMessage(&HDMI_CEC_TX_MessageStructPrivate);
sendcount = 0;
/* Retransmit message until 5 time */
while ((errorstatus != HDMI_CEC_OK) && sendcount < 0x5)
{
sendcount++;
errorstatus = HDMI_CEC_TransmitMessage(&HDMI_CEC_TX_MessageStructPrivate);
}
break;
case HDMI_CEC_OPCODE_ROUTING_CHANGE:
for (i = 0;i < 0x14;i++)
{
if ((HDMI_CEC_DeviceMap[i].PhysicalAddress_A == HDMI_CEC_RX_MessageStructPrivate.Operande[1] >> 4) &&
(HDMI_CEC_DeviceMap[i].PhysicalAddress_B == HDMI_CEC_RX_MessageStructPrivate.Operande[1]&0x0F) &&
(HDMI_CEC_DeviceMap[i].PhysicalAddress_C == HDMI_CEC_RX_MessageStructPrivate.Operande[0] >> 4) &&
(HDMI_CEC_DeviceMap[i].PhysicalAddress_D == HDMI_CEC_RX_MessageStructPrivate.Operande[0]&0x0F))
{
HDMI_CEC_MapStruct.LogicalAddress = (HDMI_CEC_RX_MessageStructPrivate.Header >> 0x4) & 0x0F;
HDMI_CEC_MapStruct.DeviceType = HDMI_CEC_RX_MessageStructPrivate.Operande[2];
HDMI_CEC_DeviceMap[i] = HDMI_CEC_MapStruct;
}
}
break;
default:
/* Send Abort feature*/
HDMI_CEC_TX_MessageStructPrivate.Header = ((MyLogicalAddress << 4) | HDMI_CEC_RX_MessageStructPrivate.Header >> 4);
HDMI_CEC_TX_MessageStructPrivate.Opcode = HDMI_CEC_OPCODE_FEATURE_ABORT;
HDMI_CEC_TX_MessageStructPrivate.Operande[0] = 0x02; /* defines command to be performed */
HDMI_CEC_TX_MessageStructPrivate.Operande[1] = HDMI_CEC_REFUSED; /* Reason for abort feature */
HDMI_CEC_TX_MessageStructPrivate.TxMessageLength = 0x02;
errorstatus = HDMI_CEC_TransmitMessage(&HDMI_CEC_TX_MessageStructPrivate);
sendcount = 0;
/* Retransmit message until 5 time */
while ((errorstatus != HDMI_CEC_OK) && sendcount < 0x5)
{
sendcount++;
errorstatus = HDMI_CEC_TransmitMessage(&HDMI_CEC_TX_MessageStructPrivate);
}
break;
}
}
/**
* @brief Check the connected CEC devices.
* @param None
* @retval HDMI_CEC_Error
*/
HDMI_CEC_Error HDMI_CEC_CheckConnectedDevices(void)
{
HDMI_CEC_Error errorstatus = HDMI_CEC_OK;
uint32_t count = 0, i = 1;
/*----------------------------- TV device ---------------------------*/
CEC_OwnAddressConfig(MyLogicalAddress); /* Own address = MyLogicalAddress */
CEC_EndOfMessageCmd(ENABLE);
CEC_SendDataByte((MyLogicalAddress << 4) | 0x0);
/* Start of message */
CEC_StartOfMessage();
/* Wait till the header message is sent */
while ((CEC_GetFlagStatus(CEC_FLAG_TBTRF) == RESET) && (CEC_GetFlagStatus(CEC_FLAG_TERR) == RESET) && (count < HDMI_CEC_TIMEOUT_VALUE))
{
count++;
}
if (count >= HDMI_CEC_TIMEOUT_VALUE)
{
errorstatus = HDMI_CEC_TIMEOUT;
return(errorstatus);
}
errorstatus = HDMI_CEC_GetErrorStatus();
if (errorstatus == HDMI_CEC_OK)
{
HDMI_CEC_Follower_String[0][1] = (uint8_t *)"1";
i++;
errorstatus = HDMI_CEC_OK;
}
/* Clear CEC CSR register */
CEC_ClearFlag(CEC_FLAG_TBTRF);
CEC_EndOfMessageCmd(DISABLE);
/*----------------------------- Recording device 1 ---------------------------*/
CEC_OwnAddressConfig(MyLogicalAddress); /* Own address = MyLogicalAddress */
CEC_EndOfMessageCmd(ENABLE);
CEC_SendDataByte((MyLogicalAddress << 4) | 0x1);
/* Start of message */
CEC_StartOfMessage();
/* Wait till the header message is sent */
while ((CEC_GetFlagStatus(CEC_FLAG_TBTRF) == RESET) && (CEC_GetFlagStatus(CEC_FLAG_TERR) == RESET) && (count < HDMI_CEC_TIMEOUT_VALUE))
{
count++;
}
if (count >= HDMI_CEC_TIMEOUT_VALUE)
{
errorstatus = HDMI_CEC_TIMEOUT;
return(errorstatus);
}
errorstatus = HDMI_CEC_GetErrorStatus();
if (errorstatus == HDMI_CEC_OK)
{
HDMI_CEC_Follower_String[1][1] = (uint8_t *)"1";
i++;
errorstatus = HDMI_CEC_OK;
}
/* Clear CEC CSR register */
CEC_ClearFlag(CEC_FLAG_TBTRF);
CEC_EndOfMessageCmd(DISABLE);
/*----------------------------- Recording device 2 ---------------------------*/
CEC_OwnAddressConfig(MyLogicalAddress); /* Own address = MyLogicalAddress */
CEC_EndOfMessageCmd(ENABLE);
CEC_SendDataByte((MyLogicalAddress << 4) | 0x2);
/* Start of message */
CEC_StartOfMessage();
/* Wait till the header message is sent */
while ((CEC_GetFlagStatus(CEC_FLAG_TBTRF) == RESET) && (CEC_GetFlagStatus(CEC_FLAG_TERR) == RESET) && (count < HDMI_CEC_TIMEOUT_VALUE))
{
count++;
}
if (count >= HDMI_CEC_TIMEOUT_VALUE)
{
errorstatus = HDMI_CEC_TIMEOUT;
return(errorstatus);
}
errorstatus = HDMI_CEC_GetErrorStatus();
if (errorstatus == HDMI_CEC_OK)
{
HDMI_CEC_Follower_String[2][1] = (uint8_t *)"1";
i++;
errorstatus = HDMI_CEC_OK;
}
/* Clear CEC CSR register */
CEC_ClearFlag(CEC_FLAG_TBTRF);
CEC_EndOfMessageCmd(DISABLE);
/*----------------------------- Tuner 1 ---------------------------*/
CEC_OwnAddressConfig(MyLogicalAddress); /* Own address = MyLogicalAddress */
CEC_EndOfMessageCmd(ENABLE);
CEC_SendDataByte((MyLogicalAddress << 4) | 0x3);
/* Start of message */
CEC_StartOfMessage();
/* Wait till the header message is sent */
while ((CEC_GetFlagStatus(CEC_FLAG_TBTRF) == RESET) && (CEC_GetFlagStatus(CEC_FLAG_TERR) == RESET) && (count < HDMI_CEC_TIMEOUT_VALUE))
{
count++;
}
if (count >= HDMI_CEC_TIMEOUT_VALUE)
{
errorstatus = HDMI_CEC_TIMEOUT;
return(errorstatus);
}
errorstatus = HDMI_CEC_GetErrorStatus();
if (errorstatus == HDMI_CEC_OK)
{
HDMI_CEC_Follower_String[3][1] = (uint8_t *)"1";
i++;
errorstatus = HDMI_CEC_OK;
}
/* Clear CEC CSR register */
CEC_ClearFlag(CEC_FLAG_TBTRF);
CEC_EndOfMessageCmd(DISABLE);
/*----------------------------- Playback device 1 ---------------------------*/
CEC_OwnAddressConfig(MyLogicalAddress); /* Own address = MyLogicalAddress */
CEC_EndOfMessageCmd(ENABLE);
CEC_SendDataByte((MyLogicalAddress << 4) | 0x4);
/* Start of message */
CEC_StartOfMessage();
/* Wait till the header message is sent */
while ((CEC_GetFlagStatus(CEC_FLAG_TBTRF) == RESET) && (CEC_GetFlagStatus(CEC_FLAG_TERR) == RESET) && (count < HDMI_CEC_TIMEOUT_VALUE))
{
count++;
}
if (count >= HDMI_CEC_TIMEOUT_VALUE)
{
errorstatus = HDMI_CEC_TIMEOUT;
return(errorstatus);
}
errorstatus = HDMI_CEC_GetErrorStatus();
if (errorstatus == HDMI_CEC_OK)
{
HDMI_CEC_Follower_String[4][1] = (uint8_t *)"1";
i++;
errorstatus = HDMI_CEC_OK;
}
/* Clear CEC CSR register */
CEC_ClearFlag(CEC_FLAG_TBTRF);
CEC_EndOfMessageCmd(DISABLE);
/*----------------------------- Audio system ---------------------------*/
CEC_OwnAddressConfig(MyLogicalAddress); /* Own address = MyLogicalAddress */
CEC_EndOfMessageCmd(ENABLE);
CEC_SendDataByte((MyLogicalAddress << 4) | 0x5);
/* Start of message */
CEC_StartOfMessage();
/* Wait till the header message is sent */
while ((CEC_GetFlagStatus(CEC_FLAG_TBTRF) == RESET) && (CEC_GetFlagStatus(CEC_FLAG_TERR) == RESET) && (count < HDMI_CEC_TIMEOUT_VALUE))
{
count++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -