hi 先上图 表达我们小哥的设计思路。
4 J. B0 z( c8 q* w+ r$ nRS485-5是独立的 利用USART3即可(比较简单)0 w2 X0 H+ p. O0 B- d' @
RS485-1 2 3 4这4路是挂在一个“开关”上的,这个开关可以在4路中pick1路导通。! q" K8 `( {. P# b% L7 W
2 o+ i) c" P: P6 N# y
8 Q: z( N: }) O1 R; Y
# i7 j+ f6 @) ^7 g7 A- O! O( X
74LV4052相当于一个双刀四掷开关,具体接通哪一通道,由输入地址码AB来决定 这个器件用到4个管脚,TX RX就是STM32的USART2,而另外2个就是普通IO即可,我通过设置0和1就可以出现00/01/10/11这样4中情况,这样4中情况分别对应右边4路RS485的某一路导通。
9 G' \, _: G/ r1 C( C) a* e( {6 s0 f
5 G% g5 I5 P4 s; x2 Y" I" P l/ |. i# s2 `2 n* @
- 3 o$ X7 @( m+ ]! b+ ^( Q1 U K4 }
- void RS485_1234_Init(void)9 U+ E" V p+ |" h3 x' m" C
- {
* d: u6 `( }) N( U* Y5 c; E - GPIO_InitTypeDef GPIO_InitStructure;
: S. B4 M9 H8 ^5 E, v: V7 ? - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; " [9 _) T0 ?. |; D; j
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; " N: Q, I1 `8 F
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;9 O- P9 s% @$ F, I+ Z" g0 K* X6 L9 T
- GPIO_Init(GPIOG, &GPIO_InitStructure);/*1号*/
( ^$ ]( g3 U# h4 A8 j) F; \
; y- }9 Q X/ D2 t) d+ s- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
3 `" c8 p5 C5 J - GPIO_Init(GPIOG, &GPIO_InitStructure);/*2号*/
5 \. n+ @: h1 ?) ]
6 |3 Z u3 v, l: O! x) e- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
4 W9 z8 ~$ ~3 E$ b) {0 M - GPIO_Init(GPIOG, &GPIO_InitStructure);/*3号*/
* `2 j' k2 @ K! d - , Q5 q6 a; X! i5 k6 p
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; * l+ `! A! K8 O4 m
- GPIO_Init(GPIOG, &GPIO_InitStructure);/*4号*/1 Q2 m2 V4 T& w/ a7 y. ?
- # Z: ?/ i7 G! L) v$ }. x
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
# B' p# s$ w% G3 t - GPIO_Init(GPIOG, &GPIO_InitStructure);/*S0*/ * A! I" A6 d9 }9 p( I6 A
- 4 X5 }: n& _1 M- L3 r3 T
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; 6 v0 `2 f1 V) a# j+ {* y& k% E
- GPIO_Init(GPIOG, &GPIO_InitStructure);/*S1*/ 2 L2 s, s% H7 |8 m5 I4 {5 f3 H2 I
- % s, ]- W0 |4 g% _2 R( h# \
- } T' b; |2 P. Y
8 i+ r% T! V0 O" v; a5 n# C/ V- void Choise_RS485_1234(u8 num): U" I, F: |1 g/ o
- {; X7 s+ X- A: J# I F' D
- switch(num)
( j' I" F8 k9 q - {* O/ o5 P! A7 d8 b
- case 1:SW_S0_L();SW_S1_L(); break;
0 v( `- Z G- a* i( v5 n2 { - case 2:SW_S0_H();SW_S1_L(); break;
+ A6 @0 x1 f) a- U; |" C# X - case 3:SW_S0_L();SW_S1_H(); break;) ~$ O3 |6 K7 J: k. }- v1 l# ~ K, q
- case 4:SW_S0_H();SW_S1_H(); break;
, L. A9 q5 G1 u, Z1 g/ |' m) k! z - default :break;, x2 A G7 z! O5 A% Q& ?# ~ X
- }
7 t9 w' |3 K I* b& O - }4 p& x: W6 U, R, ]$ d; x
" g! m2 N: d3 H3 d0 I- void TS_74LV4052_Init(void)
& G$ P' t8 X7 g4 E, o! O - {
5 E1 S6 D+ t# x - USART_Config(2, 9600, USART_WordLength_8b, USART_Parity_No, 2, 0, ENABLE, DISABLE);/*USART2*/
# q& H! t+ J$ @+ S. q9 K: n - RS485_1234_Init();" X% A2 G7 r/ P1 H, b+ \
- }
$ S1 j5 c% e H) B: d8 l# y4 f9 x( I* K7 V
& t P8 L9 R/ U+ t+ W& z8 x% Y- ) X: @0 g& U5 j9 c
- void TS_74LV4052_SendMgs(int num,u8 *Msg, u8 Len)+ E/ s, B# \- V% w
- {' S1 R3 q7 T! h; \4 L
- Choise_RS485_1234(num);2 w$ ~2 K% E/ X. M% _
- USART_GetFlagStatus(USART2,USART_FLAG_TC);
L1 P/ @2 {2 d4 p" p; \ - if(Len)
% a$ t) D4 w/ @$ [! T - {! _4 r( ?7 s. N. Q( d" U
- TS_74LV4052_On();
$ i/ _5 D Z4 r, f - USART_SendData(USART2, 0xFE);, L0 p3 k% X2 [6 h& F
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET) ;% b5 C' U1 d3 y- {* \/ b
- USART_SendData(USART2, 0xFE);% w6 u5 v$ @ [5 ], u+ \
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET) ;
0 w; n. f$ W- \5 U/ q - USART_SendData(USART2, 0xFE);) k+ _ l! i( J" _
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET) ;9 O/ W/ i4 z8 _' ^6 v, B6 `) R: S
- USART_SendData(USART2, 0xFE);
4 K- K% |" _; c* {/ X$ W9 j - while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET) ;2 F) G9 @3 w/ X7 p* p9 T
- while(Len--)
, ?) i& _1 H) G3 P9 A3 r$ e/ D - {
5 ?! z* `9 J- q6 Q# L! @ - USART_SendData(USART2, *(Msg++));, `) R7 v" p: W1 N, j! R$ m5 n
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);
0 A0 v3 E2 Y0 C: K {+ t - }! m6 M: s- e0 O1 h
- TS_74LV4052_Off();
6 G/ E: Y7 E! l) X0 f/ Z/ k - }
, G7 g# v* X) u, K" ?1 o/ S, k4 M - }
' @6 _9 F9 O0 P* C9 f( H4 c% ^
复制代码- #define SW_S0_H() GPIO_SetBits(GPIOG ,GPIO_Pin_14)
. O8 g+ k1 J$ I1 q - #define SW_S0_L() GPIO_ResetBits(GPIOG ,GPIO_Pin_14)
$ C! m2 [2 E& D - #define SW_S1_H() GPIO_SetBits(GPIOG ,GPIO_Pin_13)" U% L9 F6 `$ @5 m, b% c" D
- #define SW_S1_L() GPIO_ResetBits(GPIOG ,GPIO_Pin_13)
: v/ A# z! G% T' p% g - #define RS485_1DET_ON GPIO_SetBits(GPIOG,GPIO_Pin_8)
& r1 G" P: G8 _; ^) d2 h+ @ - #define RS485_1DET_OFF GPIO_ResetBits(GPIOG,GPIO_Pin_8) * Z5 B9 }* Z! l/ j0 N+ S- m
- #define RS485_2DET_ON GPIO_SetBits(GPIOG,GPIO_Pin_9) + v% S/ A: D1 E# \4 } m
- #define RS485_2DET_OFF GPIO_ResetBits(GPIOG,GPIO_Pin_9) 4 `6 T/ o' y$ _; o8 p( a
- #define RS485_3DET_ON GPIO_SetBits(GPIOG,GPIO_Pin_10) " g" i! d( k# K$ E& J1 ~& F
- #define RS485_3DET_OFF GPIO_ResetBits(GPIOG,GPIO_Pin_10) : J- p$ A! u+ a' ]8 C
- #define RS485_4DET_ON GPIO_SetBits(GPIOG,GPIO_Pin_11) 4 W; Q4 c# D0 P8 M" q3 R
- #define RS485_4DET_OFF GPIO_ResetBits(GPIOG,GPIO_Pin_11) 0 W9 l# k+ n, G- d5 `) `. Z
- 0 ?; x9 i& {1 p5 y9 L8 X# H9 Z
- #define TS_74LV4052_On() RS485_1DET_ON;RS485_2DET_ON;RS485_3DET_ON;RS485_4DET_ON
( ` w; U: U# g: J5 [: E - #define TS_74LV4052_Off() RS485_1DET_OFF;RS485_2DET_OFF;RS485_3DET_OFF;RS485_4DET_OFF
复制代码 先初始化:void TS_74LV4052_Init(void), k6 {% ^4 A* W
然后就可以去愉快的发消息了void TS_74LV4052_SendMgs(int num,u8 *Msg, u8 Len)
# |2 U1 Y! b: @/ P/ R, t1 {
' i4 y9 q+ \! K W+ l4 @实际测试发送是比较简单的,但是接受注定有麻烦了,一个时间点只能一路的通的。。。即使轮训也挺难实现。- W+ O9 |3 l/ l2 g0 b8 Y3 ]
可能需要在做设计了。有没有方便的1拖4思路呀。
' ^- T: A$ ^! ~- z3 r# V R! r1 p/ H/ O" s
|
他这是一个板子的 不是多个不同的设备 共用一路的话 所有的数据都到了四个接口上
这个板子是做工装测试的 这个板子同时接连5个设备同时测试
待测设备支持485接口(没有协议 也没有功能 就是设备也预留了接口) 所以我们也调试一下
给我的启发是 是不是可以考虑485组网