一、电路设计

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. 线程:synchronized
  2. zcmu-1184(矩阵乘法)
  3. Java Store_java之Properties集合中的方法store
  4. Linux shell重复执行某命令n次
  5. opencv中,c和c++版本区别体验
  6. git(6)---Repo 命令参考资料
  7. 毫秒转换友好的显示格式【刚刚、几秒前,几小时,几天前(3天内) 时间格式化】
  8. myeclipse中加入jad查看jar源代码
  9. hive 日期函数_数据分析面试必备——SQL窗口函数你会了吗?
  10. 视图查询sql_视图 索引
  11. 推荐一个字体工具:Fontmin
  12. 计算机的创新产品,这几种电脑创新功能 空有喝彩没人买
  13. java下载excel模板文件
  14. 爬虫之字体反爬(仅供学习参考)
  15. Hi3519AV100 SDK文档解读
  16. IOS之 UITableview的简单使用
  17. 【ChatGPT】GPT-4
  18. 基于单片机的电子琴系统设计(#0424)
  19. 计算机网络国际标准界最,计算机网络标准综述.pdf
  20. 【内存】物理内存和虚拟内存

热门文章

  1. Spring Cloud学习笔记(一)概要
  2. 无人驾驶感知篇之目标跟踪(一)
  3. 【主编连线】:对话即构科技李凯——聊聊流媒体互动新趋势
  4. ACPI相关(8)- ACPI Platform Error Interfaces
  5. 响铃:新零售迷上了形象类IP,搭便车,还是打错了车?
  6. 手机应用软件测试要点
  7. 2月19号英语翻译(和A+B一样简单)
  8. 输电线路导线舞动在线监测装置
  9. 【FFmpeg】aac 编码的cbr和vbr 测试
  10. 【财务】FMS财务管理系统---日常数据核对与处理