打印
[STM32F4]

CEC 输出数据始终和输出长度不匹配

[复制链接]
895|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
前言
客户反应使用我们的 STM32F446 的 CEC 库的时候,输出的数据和数据长度始终不匹配,跟电视通信不正常,如果输出的数据
始终比长度多一个字节.客户试着按字节数减一去做输出,但是又不能输出一个字节的情况.  

使用特权

评论回复
沙发
豆杀包|  楼主 | 2021-11-8 15:51 | 只看该作者
首先,我们来看看 CEC 发送数据的过程:
1,数据格式,包含一个起始位,header OPCODE 以及 0 到 14 个字节的 OPERAND 数据.以及一个 EOM 和 ACK.  


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

使用特权

评论回复
板凳
豆杀包|  楼主 | 2021-11-8 15:52 | 只看该作者
3 发送函数: 当客户在调用下面发送函数的时候,数据跟长度不匹配.  

HAL_CEC_Transmit_IT(&hcec,InitiatorAddress ,DestinationAddress, (uint8_t *)&Tab_Tx, TxSize);
HAL_StatusTypeDef HAL_CEC_Transmit_IT(CEC_HandleTypeDef *hcec, uint8_t InitiatorAddress, uint8_t
DestinationAddress, uint8_t *pData, uint32_t Size)
{
/* if the IP isn't already busy and if there is no previous transmission
already pending due to arbitration lost */
if (hcec->gState == HAL_CEC_STATE_READY)
{
if((pData == NULL ) && (Size > 0U))
{
return HAL_ERROR;
}
/* Process Locked */
__HAL_LOCK(hcec);
hcec->pTxBuffPtr = pData;
hcec->gState = HAL_CEC_STATE_BUSY_TX;
hcec->ErrorCode = HAL_CEC_ERROR_NONE;
/* initialize the number of bytes to send,
* 0 means only one header is sent (ping operation) */
hcec->TxXferCount = Size;
/* in case of no payload (Size = 0), sender is only pinging the system;
Set TX End of Message (TXEOM) bit, must be set before writing data to TXDR */
if (Size == 0U)
{
__HAL_CEC_LAST_BYTE_TX_SET(hcec);
}
/* send header block */
hcec->Instance->TXDR = ((uint8_t)(InitiatorAddress << CEC_INITIATOR_LSB_POS) |(uint8_t) DestinationAddress);
/* Set TX Start of Message (TXSOM) bit */
__HAL_CEC_FIRST_BYTE_TX_SET(hcec);
/* Process Unlocked */
__HAL_UNLOCK(hcec);
return HAL_OK;
}
else
{
return HAL_BUSY;
}
}
例如 :发送 2 个字节(TxSize=2) 0x44 和 0x43,但是我在后面发觉多出来一个字节(如下图),而如果我们将 TxSize 设为 1,反而
数据发送正确. 从上面的函数来看,并没有什么错误.它仅仅开始发送了 HEADER 和开始发送.

使用特权

评论回复
地板
豆杀包|  楼主 | 2021-11-8 15:53 | 只看该作者
4 中断处理函数:  

void HAL_CEC_IRQHandler(CEC_HandleTypeDef *hcec)
{
…………………………………………………………….
/* CEC TX byte request interrupt ------------------------------------------------*/
if((reg & CEC_FLAG_TXBR) != RESET)
{
if (hcec->TxXferCount == 0U)
{
/* if this is the last byte transmission, set TX End of Message (TXEOM) bit */
__HAL_CEC_LAST_BYTE_TX_SET(hcec);
hcec->Instance->TXDR = *hcec->pTxBuffPtr++;
}
else
{
hcec->Instance->TXDR = *hcec->pTxBuffPtr++;
hcec->TxXferCount--;
}
/* clear Tx-Byte request flag */
__HAL_CEC_CLEAR_FLAG(hcec,CEC_FLAG_TXBR);
}
从上面的函数来看当我们发送字节数大于 0 的时候,他每次发送一个字节,而当等于 0 的时候它置位 EOM,并且再次放了一个字
节进入 TXDR,看到这里就明白了,错误出现在这里了,既然是发送字节为 0 了,为什么还要放一个字节呢?这里应该是最后一个字
节的时候,置位 EOM 和发送一个字节数据,而当再次中断来这里 SIZE 变为 0 的时候什么都不做.


使用特权

评论回复
5
豆杀包|  楼主 | 2021-11-8 15:54 | 只看该作者
解决方法:
按照下面的方法修改中断处理函数,送给客户验证,能够正常发送数据并且跟电视通信正常  

void HAL_CEC_IRQHandler(CEC_HandleTypeDef *hcec)
{
…………………………………………………………….
/* CEC TX byte request interrupt ------------------------------------------------*/
if((reg & CEC_FLAG_TXBR) != RESET)
{
if (hcec->TxXferCount == 1U)
{
/* if this size is zero ,do nothing */
}
else if (hcec->TxXferCount == 1U)
{
/* if this is the last byte transmission, set TX End of Message (TXEOM) bit */
__HAL_CEC_LAST_BYTE_TX_SET(hcec);
hcec->Instance->TXDR = *hcec->pTxBuffPtr++;
hcec->TxXferCount--;
}
else
{
hcec->Instance->TXDR = *hcec->pTxBuffPtr++;
hcec->TxXferCount--;
}
/* clear Tx-Byte request flag */
__HAL_CEC_CLEAR_FLAG(hcec,CEC_FLAG_TXBR);
}


使用特权

评论回复
6
木木guainv| | 2021-12-4 11:43 | 只看该作者
cec是一种什么库呢

使用特权

评论回复
7
磨砂| | 2021-12-4 11:45 | 只看该作者
是不是配置的有问题啊

使用特权

评论回复
8
晓伍| | 2021-12-4 11:46 | 只看该作者
验证信息如何定义呢

使用特权

评论回复
9
tpgf| | 2021-12-4 11:47 | 只看该作者
第一次了解这个词汇

使用特权

评论回复
10
八层楼| | 2021-12-4 11:50 | 只看该作者
那就握手不成功啊

使用特权

评论回复
11
观海| | 2021-12-4 11:50 | 只看该作者
出厂调试的时候没有发现问题吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

323

帖子

0

粉丝