你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32的4路RS485通讯

[复制链接]
GKoSon 发布时间:2018-8-14 14:12
hi 先上图 表达我们小哥的设计思路。
RS485-5是独立的 利用USART3即可(比较简单)
RS485-1 2 3 4这4路是挂在一个“开关”上的,这个开关可以在4路中pick1路导通。
QQ截图20180814140329.jpg
QQ截图20180814140408.jpg


74LV4052相当于一个双刀四掷开关,具体接通哪一通道,由输入地址码AB来决定  这个器件用到4个管脚,TX RX就是STM32的USART2,而另外2个就是普通IO即可,我通过设置0和1就可以出现00/01/10/11这样4中情况,这样4中情况分别对应右边4路RS485的某一路导通。



  1. void RS485_1234_Init(void)
  2. {
  3.                 GPIO_InitTypeDef   GPIO_InitStructure;
  4.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;        
  5.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;            
  6.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  7.                 GPIO_Init(GPIOG, &GPIO_InitStructure);/*1号*/

  8.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;        
  9.                 GPIO_Init(GPIOG, &GPIO_InitStructure);/*2号*/

  10.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;        
  11.                 GPIO_Init(GPIOG, &GPIO_InitStructure);/*3号*/       

  12.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;        
  13.                 GPIO_Init(GPIOG, &GPIO_InitStructure);/*4号*/

  14.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;        
  15.                 GPIO_Init(GPIOG, &GPIO_InitStructure);/*S0*/       

  16.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;        
  17.                 GPIO_Init(GPIOG, &GPIO_InitStructure);/*S1*/       
  18.        
  19. }

  20. void Choise_RS485_1234(u8 num)
  21. {
  22.         switch(num)
  23.         {
  24.                 case 1:SW_S0_L();SW_S1_L();                        break;
  25.                 case 2:SW_S0_H();SW_S1_L();                        break;
  26.                 case 3:SW_S0_L();SW_S1_H();                        break;
  27.                 case 4:SW_S0_H();SW_S1_H();                        break;
  28.                 default :break;
  29.         }
  30. }

  31. void TS_74LV4052_Init(void)
  32. {
  33.     USART_Config(2, 9600, USART_WordLength_8b, USART_Parity_No,  2,  0, ENABLE, DISABLE);/*USART2*/
  34.           RS485_1234_Init();
  35. }


  36. void TS_74LV4052_SendMgs(int num,u8 *Msg, u8 Len)
  37. {
  38.                 Choise_RS485_1234(num);
  39.     USART_GetFlagStatus(USART2,USART_FLAG_TC);
  40.     if(Len)
  41.     {
  42.         TS_74LV4052_On();
  43.         USART_SendData(USART2, 0xFE);
  44.         while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET)  ;
  45.         USART_SendData(USART2, 0xFE);
  46.         while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET)        ;
  47.         USART_SendData(USART2, 0xFE);
  48.         while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET)        ;
  49.         USART_SendData(USART2, 0xFE);
  50.         while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET)        ;
  51.         while(Len--)
  52.         {
  53.             USART_SendData(USART2, *(Msg++));
  54.             while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);
  55.         }
  56.         TS_74LV4052_Off();
  57.     }
  58. }
复制代码
  1. #define SW_S0_H()                         GPIO_SetBits(GPIOG ,GPIO_Pin_14)
  2. #define SW_S0_L()                                 GPIO_ResetBits(GPIOG ,GPIO_Pin_14)
  3. #define SW_S1_H()                         GPIO_SetBits(GPIOG ,GPIO_Pin_13)
  4. #define SW_S1_L()                                 GPIO_ResetBits(GPIOG ,GPIO_Pin_13)
  5. #define RS485_1DET_ON         GPIO_SetBits(GPIOG,GPIO_Pin_8)
  6. #define RS485_1DET_OFF        GPIO_ResetBits(GPIOG,GPIO_Pin_8)
  7. #define RS485_2DET_ON         GPIO_SetBits(GPIOG,GPIO_Pin_9)
  8. #define RS485_2DET_OFF        GPIO_ResetBits(GPIOG,GPIO_Pin_9)
  9. #define RS485_3DET_ON         GPIO_SetBits(GPIOG,GPIO_Pin_10)
  10. #define RS485_3DET_OFF        GPIO_ResetBits(GPIOG,GPIO_Pin_10)
  11. #define RS485_4DET_ON         GPIO_SetBits(GPIOG,GPIO_Pin_11)
  12. #define RS485_4DET_OFF        GPIO_ResetBits(GPIOG,GPIO_Pin_11)

  13. #define TS_74LV4052_On()      RS485_1DET_ON;RS485_2DET_ON;RS485_3DET_ON;RS485_4DET_ON
  14. #define TS_74LV4052_Off()     RS485_1DET_OFF;RS485_2DET_OFF;RS485_3DET_OFF;RS485_4DET_OFF
复制代码
先初始化:void TS_74LV4052_Init(void)
然后就可以去愉快的发消息了void TS_74LV4052_SendMgs(int num,u8 *Msg, u8 Len)

实际测试发送是比较简单的,但是接受注定有麻烦了,一个时间点只能一路的通的。。。即使轮训也挺难实现。
可能需要在做设计了。有没有方便的1拖4思路呀。

收藏 1 评论8 发布时间:2018-8-14 14:12

举报

8个回答
FF_胖子 回答时间:2018-8-15 09:33:57
楼主为甚麽不使用一个485芯片,上面挂载多个设备,然后通过软件协议进行解析和判断接收到的数据是这个设备所需要的吗,或者说你还有其他设甚麽考虑?
jyl_518 回答时间:2018-8-14 15:16:37
485是总线通讯,1、2、3、4没必要硬件切换,4路接口共用一路485总线即可,如是挂接不同协议的设备,只要软件做兼容即可。
琦子 回答时间:2018-8-14 15:44:25
楼主啊 485可以带多个节点 和你用什么芯片有关 所以真的没有必要用你这种方式哈
dengyi36 回答时间:2018-8-14 16:34:06
牛逼
一匹夫尔 回答时间:2018-8-15 09:25:32
jyl518-283289 发表于 2018-8-14 15:16
485是总线通讯,1、2、3、4没必要硬件切换,4路接口共用一路485总线即可,如是挂接不同协议的设备,只要软 ...

他这是一个板子的 不是多个不同的设备 共用一路的话 所有的数据都到了四个接口上
GKoSon 回答时间:2018-8-15 11:43:47
噢 看了楼上的一些意见  有些启发
这个板子是做工装测试的 这个板子同时接连5个设备同时测试
待测设备支持485接口(没有协议 也没有功能 就是设备也预留了接口)  所以我们也调试一下
给我的启发是 是不是可以考虑485组网
爱电子辉辉 回答时间:2018-8-16 11:36:58
真不懂,485明明可以自己组网,为何还要用一个开关来选择
changshs2006 回答时间:2018-8-16 14:34:36
学习了!~
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版