一、电路设计

1、低成本非隔离:

3.3v系统同样,将5V改为3.3即可。同时采用TX连接三极管,实现三极管驱动RS485芯片的EN使能脚,从而省下一个IO口控制。隔离只需要将两个信号线用光耦隔离即可。

2、高成本隔离:

两边电源为不同电源,从而实现隔离。成本较高。A/B端也要并联10K电阻能提高通讯质量。

二、关于第一种方案的问题分析

1、光耦隔离时需考虑光耦开通速度与关闭速度,较高波特率将导致通讯失败,例如PC817,不适合波特率9600及以上。

2、采用三极管接TX控制使能引脚会导致出RX上反射电压,原因为EN脚一直反复跳变,RS485的A B上电压变化未完成时,已切换成了接收模式,见下图:(红色曲线前半段,较细的即为RX上被TX反射出的电压)

三、上述问题的解决方案

第一种问题详细见另一篇博文:

https://blog.csdn.net/qq_27747359/article/details/107721969?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161528644516780271555475%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=161528644516780271555475&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-3-107721969.pc_v2_rank_blog_default&utm_term=485

第二种问题分为硬件解决和软件解决:

硬件解决:A B间并联10k电阻,加大放电速度,使得A B的电平变化速度加快6倍左右,RX上反射的波形持续时间缩短,软件将不会触发串口接收中断。以下为并联10k电阻,和无电阻的对比:

10K电阻并联

无并联电阻

软件解决:再发送未完成之前,禁止接收中断,从而屏蔽掉反射波形的影响。

ST官方都有APPNOTE指导的(对于UART没有RS485功能的单片机型号而言):
1、启动DMA前,先关闭UART发送完成中断,并清除发送完成中断标志;
2、在DMA传输完成中断函数中,开启UART发送完成中断;
3、在UART发送完成中断函数中,切换RS485为接收态;

(可以在发送的时候将串口接收直接失能,在串口发送完成中断中再使能)

DMA中断时,只表示需要传送的所有数据字节全部传送到串口的发送数据寄存器中了。
此时串口实际上还有2个字节并未发送完成,数据寄存器和移位寄存器中的2个字节还需要发送,并不能关闭串口发送。
同理,如果是485切换方向,必须要等到发送完成,也就是移位寄存器发送完成-TC标志置位。

你看串口的硬件结构就明白了,TXE指的是发送缓冲器DR空,TC指的是SHIFT移位寄存器空。
DMA完成只是代表把最后一个字节送到DR寄存器里面了,此时SHIFT移位寄存器有1个字节正在开始发送,
DR寄存器里面有一个字节等待发送,所以就是2个字节未发送完成。

void Drv_Usart2TxStream(uint8_t const data[], uint32_t num)
{if(!data || !num){return;}if(is_tx_busy){return;}/* 设置发送忙标志,表示占用硬件 */is_tx_busy = TRUE;/* 清除串口发送完成中断标志 */USART_ITConfig(USART2, USART_IT_TC, DISABLE);USART_ClearFlag(USART2, USART_FLAG_TC);/* 启动DMA发送 */DMA1->IFCR = DMA_IFCR_CGIF7;DMA1_Channel7->CCR   = ((0<<12)|(0<<8)|DMA_CCR7_MINC|DMA_CCR7_DIR);DMA1_Channel7->CCR  |= (DMA_CCR7_TCIE|DMA_CCR7_TEIE);DMA1_Channel7->CPAR  = (uint32_t)&USART2->DR;DMA1_Channel7->CMAR  = (uint32_t)data;DMA1_Channel7->CNDTR = (uint16_t)num;DMA1_Channel7->CCR  |= DMA_CCR7_EN;
}void DMA1_Channel7_IRQHandler(void)
{uint32_t isr = DMA1->ISR;DMA1->IFCR = DMA_IFCR_CGIF7;if(isr & (DMA_ISR_TEIF7|DMA_ISR_TCIF7)){DMA1_Channel7->CCR = 0;USART_ITConfig(USART2, USART_IT_TC, ENABLE);}
}void USART2_IRQHandler(void)
{// 最后一字节发送完成中断if((USART2->CR1 & USART_CR1_TCIE) && (USART2->SR & USART_SR_TC)){USART_ITConfig(USART2, USART_IT_TC, DISABLE);is_tx_busy = 0;// 至此,最后一字节也发送完成了}
}

四、总结

1、并不是所有的单片机都会被该干扰波形影响,实测中stm32有的项目中无影响,但是国产GD32芯片相同的项目会触发串口中断,接收到0xff。

2、仅仅靠上述软件解决,可能仍然会触发一次串口接收中断,接收0xff,根据实际需要可进行手动去除,但并不是最完美方案。

关于RS485的DMA发送,以及EN使能脚的自动切换相关推荐

  1. 【STM32】HAL库 STM32CubeMX教程十一---DMA (串口DMA发送接收)

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  2. 华大芯片HC32F4A0实现RS485通讯DMA收发

    1.串口初始化 stc_irq_signin_config_t stcIrqSigninCfg;const stc_usart_uart_init_t stcUartInit = {.u32Baudr ...

  3. stm32 usart 单线半双工串口 DMA发送 最后一个字节发不出来问题

    最近遇到一个小问题,感觉很有意思便记下来分享一下 ,顺便也为日后类似的问题提供点思路: 使用stm32串口发送数据 ,串口是单线半双工模式,要求数据发送前串口变成发送模式,发送完后立即变回接收模式,发 ...

  4. STM32使用DMA发送串口数据

    1.概述 上一篇文章<STM32使用DMA接收串口数据>讲解了如何使用DMA接收数据,使用DMA外设和串口外设,使用的中断是串口空闲中断.本篇文章主要讲解使用DMA发送数据,不会讲解基础的 ...

  5. FPGA 串口中断_一个严谨的STM32串口DMA发送amp;接收(1.5Mbps波特率)机制

    昨天分享的<嵌入式大杂烩读者福利:第一期>大家有去抽奖吗,没抽的可参与抽奖,碰碰运气.我最喜欢抽奖了,还记得前几个月疫情严重时期连抽中了3包口罩,真刺激,哈哈.之后多多安排抽奖,敬请期待. ...

  6. 一个严谨的STM32串口DMA发送接收(1.5Mbps波特率)机制

    文章目录 1 前言 2 串口有必要使用DMA吗 3 实现方式 4 STM32串口使用DMA 5 串口DMA接收 5.1 基本流程 5.2 相关配置 5.3 接收处理 5.3 .1 接收数据大小 5.3 ...

  7. STM32H7xx 串口DMA发送接收(LL库)

    文章目录 1 前言 2 STM32H7实现 2.1 关键步骤 2.2 注意事项 3 代码仓库 1 前言   关于串口DMA收发实现,不同CPU其套路都是类似的,不同之处在于寄存器配置.依赖BSP库等差 ...

  8. 网卡驱动:stmmac DMA发送流程

    1. 设置DAM buffer&descriptor,并启动DMA发送 在stmmac_xmit设置buffe r& descriptor,如下片段: if (likely(!is_j ...

  9. hal库串口dma卡死_STM32 HAL库 串口DMA发送完成中断

    近期使用STM32驱动MAX3485进行485通信,发现STM32F103C8并不自带硬件485首发功能,需要软件上控制IO高低来驱动MAX3485进行485接收.485发送. 根据MAX3485手册 ...

最新文章

  1. 「技术综述」有三AI不得不看的技术综述
  2. 高等数学、线性代数、概率论数理统计书籍推荐
  3. SAP 销售与分销模块定价完全实施手册(SAP SD Pricing Handbook)
  4. 在C#程序设计中使用Win32 API
  5. 化繁为简 - 腾讯计费高一致TDXA的实践之路
  6. Mybatis多条件直接查询Param注解版
  7. Vue+Mock.js模拟登录和表格的增删改查
  8. 取代 Postman + Swagger!这款神器功能更强大,界面更炫酷!
  9. 【Matlab】利用diary记录日志/保存命令窗口输出
  10. Dockter:研究人员的容器图像生成器
  11. 计算机网络class2(标准化工作及相关组织)
  12. 使用css3背景渐变中的透明度来设置不同颜色的背景渐变
  13. 2D曲线插值拟合基础
  14. EXCEL【数据处理之数据抽取——随机抽样】
  15. python 逐行调试工具_常用的 Python 调试工具,Python开发必读-乾颐堂
  16. AI_综述----图像分割综述
  17. 程序员好几年才能成为架构师_成为更好的企业架构师
  18. 基于C#的超市收银终端软件--小孩玩具
  19. 数据结构与算法|马踏棋盘算法(小甲鱼)C语言代码的算法分析
  20. 【深度学习入门:基于Python的理论与实现】书本学习笔记 第三章 神经网络

热门文章

  1. What is Nginx?
  2. 启用LSI 2208阵列卡JBOD模式
  3. 知识图谱之实体对齐二
  4. 【C语言正则表达式】一个示例
  5. 【es6】教程 Symbol数据以及迭代器和生成器
  6. 《MongoDB权威指南》读书笔记 —— Part Ⅱ:设计应用(2)
  7. 互相监督,先从5公里跑步开始
  8. 求两个集合的交集和并集
  9. 利用Oracle分区表来减少磁盘I/O冲突
  10. html 清除animation,简单删除动画效果