打印
[技术文档]

航顺HC32F103C8T6串口通信失败问题解决

[复制链接]
774|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ZZY001|  楼主 | 2022-3-28 14:22 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
STM的MCU价格一路缺货飙涨,为降低成本使用航顺的MCU替换。HC32F103C8T6与中移M5311串口通信,波特率为115200,8N1格式。通信时发现失败的几率非常大,简单的发个“AT\r\n”有时候都识别不了。一开始怀疑是串口波形问题,示波器检查后发现HC发送数据波形完全正常,接收数据波形顶部稍微有点斜坡。如下图所示:

所以考虑可能是由于斜坡导致HC32接收数据失败。原来设计是采用的2个三极管在3.3V和1.8V之间进行电平转换,为了验证是否是这个问题,直接打了样板使用专门的电平转换芯片接在HC32F103C8T6和M5311之间,结果是涛声依旧。HC发送指令后,M5311回应正常,但是HC还是接收错误,表现为串口DMA根本收不到数据。
一个问题调试耽误了两三天时间,反复的查HC32F103的规格书,也没有发现任何异常。最后在看航顺官方发布的一个应用笔记里,发现了问题根源—累积误差。全名是《HK32F103应用笔记V1.0.32》。

六个字节都已经接收错误了。官方给出3种解决方案:

直接采用第二种,把HC32F103C8T6的波特率从115200修改为116352,重新烧录测试发现HC接收数据正常,问题得到解决。

/* USART1 init function */


void MX_USART1_UART_Init(void)

{


  huart1.Instance = USART1;

  huart1.Init.BaudRate = 116352;

  huart1.Init.WordLength = UART_WORDLENGTH_8B;

  huart1.Init.StopBits = UART_STOPBITS_1;

  huart1.Init.Parity = UART_PARITY_NONE;

  huart1.Init.Mode = UART_MODE_TX_RX;

  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

  huart1.Init.OverSampling = UART_OVERSAMPLING_16;

  if (HAL_UART_Init(&huart1) != HAL_OK)

  {

    Error_Handler();

  }

}

HC官方说 波特率偏差小于1%,这个对于低速率的通信来说估计还能匹配。速率高一点,由于时间累积产生的误差必然导致通信失败。也是因为这不到1%的误差,耽误硬件调试好几天功夫。建议HC在规格书里说清楚,不要放在应用笔记里,好像是羞羞答答不愿意直面自身缺陷似的。最后放一张测试的时间累计误差对比图。







使用特权

评论回复

相关帖子

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

本版积分规则

60

主题

60

帖子

0

粉丝