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在规格书里说清楚,不要放在应用笔记里,好像是羞羞答答不愿意直面自身缺陷似的。最后放一张测试的时间累计误差对比图。
|