你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】CEC 输出数据始终和输出长度不匹配

[复制链接]
STMCU小助手 发布时间:2022-2-14 23:40
前言
客户反应使用我们的 STM32F446 的 CEC 库的时候,输出的数据和数据长度始终不匹配,跟电视通信不正常,如果输出的数据始终比长度多一个字节.客户试着按字节数减一去做输出,但是又不能输出一个字节的情况.

调研
首先,我们来看看 CEC 发送数据的过程:
1,数据格式,包含一个起始位,header OPCODE 以及 0 到 14 个字节的 OPERAND 数据.以及一个 EOM 和 ACK.



2 发送过程: 从下面两个寄存器的描述来看,当我们发送最后一个字节之前,要将 EOM 置位.而每一次发送数据的第四位时候,它会发出 TXBR 的请求(请求发送下一个数据)

VXY5SW[))~W@MJQ{[4EX@XC.png

C9N0@5D6(NO3J09`5SRPNVP.png

3 发送函数: 当客户在调用下面发送函数的时候,数据跟长度不匹配.

HAL_CEC_Transmit_IT(&hcec,InitiatorAddress ,DestinationAddress, (uint8_t *)&Tab_Tx, TxSize);
  1. HAL_StatusTypeDef HAL_CEC_Transmit_IT(CEC_HandleTypeDef *hcec, uint8_t InitiatorAddress, uint8_t
  2. DestinationAddress, uint8_t *pData, uint32_t Size)
  3. {
  4. /* if the IP isn't already busy and if there is no previous transmission
  5. already pending due to arbitration lost */
  6. if (hcec->gState == HAL_CEC_STATE_READY)
  7. {
  8. if((pData == NULL ) && (Size > 0U))
  9. {
  10. return HAL_ERROR;
  11. }
  12. /* Process Locked */
  13. __HAL_LOCK(hcec);
  14. hcec->pTxBuffPtr = pData;
  15. hcec->gState = HAL_CEC_STATE_BUSY_TX;
  16. hcec->ErrorCode = HAL_CEC_ERROR_NONE;

  17. /* initialize the number of bytes to send,
  18. * 0 means only one header is sent (ping operation) */
  19. hcec->TxXferCount = Size;

  20. /* in case of no payload (Size = 0), sender is only pinging the system;
  21. Set TX End of Message (TXEOM) bit, must be set before writing data to TXDR */
  22. if (Size == 0U)
  23. {
  24. __HAL_CEC_LAST_BYTE_TX_SET(hcec);
  25. }
  26. /* send header block */
  27. hcec->Instance->TXDR = ((uint8_t)(InitiatorAddress << CEC_INITIATOR_LSB_POS) |(uint8_t) DestinationAddress);
  28. /* Set TX Start of Message (TXSOM) bit */
  29. __HAL_CEC_FIRST_BYTE_TX_SET(hcec);

  30. /* Process Unlocked */
  31. __HAL_UNLOCK(hcec);

  32. return HAL_OK;
  33. }
  34. else
  35. {
  36. return HAL_BUSY;
  37. }
  38. }
复制代码


例如 :发送 2 个字节(TxSize=2) 0x44 和 0x43,但是我在后面发觉多出来一个字节(如下图),而如果我们将 TxSize 设为 1,反而数据发送正确. 从上面的函数来看,并没有什么错误.它仅仅开始发送了 HEADER 和开始发送.  

QTNWF`UL7W2$`1H8`D3HF~S.png

4 中断处理函数:

  1. void HAL_CEC_IRQHandler(CEC_HandleTypeDef *hcec)
  2. {
  3. …………………………………………………………….
  4. /* CEC TX byte request interrupt ------------------------------------------------*/
  5. if((reg & CEC_FLAG_TXBR) != RESET)
  6. {
  7. if (hcec->TxXferCount == 0U)
  8. {
  9. /* if this is the last byte transmission, set TX End of Message (TXEOM) bit */
  10. __HAL_CEC_LAST_BYTE_TX_SET(hcec);
  11. hcec->Instance->TXDR = *hcec->pTxBuffPtr++;
  12. }
  13. else
  14. {
  15. hcec->Instance->TXDR = *hcec->pTxBuffPtr++;
  16. hcec->TxXferCount--;
  17. }
  18. /* clear Tx-Byte request flag */
  19. __HAL_CEC_CLEAR_FLAG(hcec,CEC_FLAG_TXBR);
  20. }
  21. :
  22. :
复制代码


从上面的函数来看当我们发送字节数大于 0 的时候,他每次发送一个字节,而当等于 0 的时候它置位 EOM,并且再次放了一个字节进入 TXDR,看到这里就明白了,错误出现在这里了,既然是发送字节为 0 了,为什么还要放一个字节呢?这里应该是最后一个字节的时候,置位 EOM 和发送一个字节数据,而当再次中断来这里 SIZE 变为 0 的时候什么都不做.

解决方法:
按照下面的方法修改中断处理函数,送给客户验证,能够正常发送数据并且跟电视通信正常

  1. void HAL_CEC_IRQHandler(CEC_HandleTypeDef *hcec)
  2. {
  3. …………………………………………………………….
  4. /* CEC TX byte request interrupt ------------------------------------------------*/
  5. if((reg & CEC_FLAG_TXBR) != RESET)
  6. {
  7. if (hcec->TxXferCount == 1U)
  8. {
  9. /* if this size is zero ,do nothing */
  10. }
  11. else if (hcec->TxXferCount == 1U)
  12. {
  13. /* if this is the last byte transmission, set TX End of Message (TXEOM) bit */
  14. __HAL_CEC_LAST_BYTE_TX_SET(hcec);
  15. hcec->Instance->TXDR = *hcec->pTxBuffPtr++;
  16. hcec->TxXferCount--;
  17. }
  18. else
  19. {
  20. hcec->Instance->TXDR = *hcec->pTxBuffPtr++;
  21. hcec->TxXferCount--;
  22. }
  23. /* clear Tx-Byte request flag */
  24. __HAL_CEC_CLEAR_FLAG(hcec,CEC_FLAG_TXBR);
  25. }
  26. :
  27. :
复制代码


收藏 评论1 发布时间:2022-2-14 23:40

举报

1个回答
烛音 回答时间:2022-6-21 17:50:21
为啥我通过CEC给TV发命令,TV没反应

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版