hi 先上图 表达我们小哥的设计思路。
- a) G& l. _1 V' @! B6 ~" ]RS485-5是独立的 利用USART3即可(比较简单)0 ~; M! x: B. w1 J/ D, |
RS485-1 2 3 4这4路是挂在一个“开关”上的,这个开关可以在4路中pick1路导通。
1 j/ B6 D e# u) K3 N ?
6 S! b& q9 _- O* @$ M8 m
1 B& J4 H' J: N" T! M# t
2 w2 \( s- t5 L: |) K3 l& F74LV4052相当于一个双刀四掷开关,具体接通哪一通道,由输入地址码AB来决定 这个器件用到4个管脚,TX RX就是STM32的USART2,而另外2个就是普通IO即可,我通过设置0和1就可以出现00/01/10/11这样4中情况,这样4中情况分别对应右边4路RS485的某一路导通。
5 i/ l" i* w$ A/ O t: n+ X6 T" l" i# x7 ]; V
* |! X. l, j1 i8 `! X: V+ ^2 u# ]- " q2 R) D/ w5 P" e! D* z, @, T
- void RS485_1234_Init(void)
+ ^& g9 a0 R/ M - {
' Z0 L6 @" C/ ~: }* _* o) ` - GPIO_InitTypeDef GPIO_InitStructure; A0 F: ^- {0 S
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
. e; G+ r1 \% s - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; ; z3 M% z6 j0 o& h# k+ S
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;$ V2 ^& A) D. d" A7 S0 v
- GPIO_Init(GPIOG, &GPIO_InitStructure);/*1号*/4 b0 [9 r# c! Z( L7 Q" Q8 g
- ; O( T( W5 L- u5 N# j" }
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; ( W# e4 Z4 }, ^; y
- GPIO_Init(GPIOG, &GPIO_InitStructure);/*2号*/; ?9 o v, B. A+ q& i
- , s" A' P/ V/ G# x
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 5 n1 |2 l" j) {. u3 |7 T# O; g7 I
- GPIO_Init(GPIOG, &GPIO_InitStructure);/*3号*/ ) N! ?- X! @6 v' ~$ K0 M1 d* m+ y) r
- % m! I+ |/ u# K8 F% F2 V, s2 k
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
" _$ o! E7 R% R) h3 n! A - GPIO_Init(GPIOG, &GPIO_InitStructure);/*4号*/
+ _/ k4 A! A5 Y; V - 2 l$ \% S9 h! K$ U; C& u% D/ j
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
+ v+ Z/ n3 t4 ?# R8 ~2 P/ x - GPIO_Init(GPIOG, &GPIO_InitStructure);/*S0*/
& [, n# g$ u/ J- K& @9 G { - " n% E% [& c9 H7 d* @& h8 V
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
) V @6 Y+ k6 i0 b/ Z - GPIO_Init(GPIOG, &GPIO_InitStructure);/*S1*/ 0 r \8 a# Z! h
-
/ c* ? N/ h: o - }
' H2 C8 P' S, B1 f
. k% ?( ~: G& t1 J: d9 B- void Choise_RS485_1234(u8 num)
X6 i. L9 w& ?# A8 D - {% Z L) U( o' ~' V& h
- switch(num)
K& D1 d. O9 ]: u: v - {$ Z9 q' O. g$ I7 T
- case 1:SW_S0_L();SW_S1_L(); break;3 l. \4 `- j @, q4 U) u w0 F
- case 2:SW_S0_H();SW_S1_L(); break;
7 r; h. u) T k \ - case 3:SW_S0_L();SW_S1_H(); break;0 B w8 h- a1 Y! ]/ m6 S
- case 4:SW_S0_H();SW_S1_H(); break;, s1 j4 ]5 s! @$ t t$ K
- default :break;* k0 l% I! _; G
- }1 v' A) Z; O% r% c% o2 X' Q" `* U8 @( l
- } p |9 ~, ~: X; l8 t5 s( I' M, F
- 9 l, c9 y: \+ n0 m2 j
- void TS_74LV4052_Init(void)
( D" W% Y6 t8 ^; a% a! u - {
. J" B& q2 ]! w6 J% M2 v - USART_Config(2, 9600, USART_WordLength_8b, USART_Parity_No, 2, 0, ENABLE, DISABLE);/*USART2*/4 k: a, r7 j6 N1 r4 w }
- RS485_1234_Init();
$ J, M2 x" L6 D7 s v - }- S& z' J3 u3 e4 z
: m! b4 k+ |% q8 g" x- ) T6 c3 `, h' h
- void TS_74LV4052_SendMgs(int num,u8 *Msg, u8 Len)% B0 J7 t. Z" z! |* P' L
- {
6 F' I0 l8 z, a& ?% _2 ` - Choise_RS485_1234(num);5 i9 [ V) B8 O
- USART_GetFlagStatus(USART2,USART_FLAG_TC);
3 ^* Y* |% h0 M8 i" L' C Q A3 F - if(Len)
# Q. i6 ^2 B9 x, N - {
1 S1 M( t+ v0 v2 S1 q - TS_74LV4052_On();5 I' m' k; [4 e$ V9 L4 ]; d
- USART_SendData(USART2, 0xFE);
: }; A5 m2 a2 T1 t - while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET) ;8 [6 k; |/ s `! o
- USART_SendData(USART2, 0xFE);0 M; L' Z+ C6 X2 f& R
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET) ;
) f3 C! X, e' P1 T6 X. F - USART_SendData(USART2, 0xFE);
' m' u' t! @# L# Y0 G - while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET) ;4 z& S2 l* }4 z0 n
- USART_SendData(USART2, 0xFE);6 x+ Q x% Z* ?+ m. f' v
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET) ;" P$ l% R: F2 t" E
- while(Len--)$ _3 |: h# ^# E! w0 G9 I
- {- e0 j5 T; F8 J3 s3 k
- USART_SendData(USART2, *(Msg++));4 i$ U( f6 x0 {) r% X- \( W6 ?
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);) v/ C9 E/ H! G$ {
- }/ _1 Q2 ?1 V) h+ b7 M) A
- TS_74LV4052_Off();
- ?+ X \0 Q8 g3 o - }$ B3 U& I1 d: H/ \
- }
4 e. I! f3 l$ {
复制代码- #define SW_S0_H() GPIO_SetBits(GPIOG ,GPIO_Pin_14)
* {9 \& g) e- k. G. Z4 X7 e9 S - #define SW_S0_L() GPIO_ResetBits(GPIOG ,GPIO_Pin_14) / S3 T( X' \& g( ?7 _3 v
- #define SW_S1_H() GPIO_SetBits(GPIOG ,GPIO_Pin_13)
" J, p* M$ i$ g - #define SW_S1_L() GPIO_ResetBits(GPIOG ,GPIO_Pin_13) / j4 D7 O- ?' I; a
- #define RS485_1DET_ON GPIO_SetBits(GPIOG,GPIO_Pin_8) 8 s5 L6 I% h4 ~( |
- #define RS485_1DET_OFF GPIO_ResetBits(GPIOG,GPIO_Pin_8) 6 T" Q1 M& d$ g7 f
- #define RS485_2DET_ON GPIO_SetBits(GPIOG,GPIO_Pin_9)
- l6 O: f" T$ s0 V5 U9 ^ W - #define RS485_2DET_OFF GPIO_ResetBits(GPIOG,GPIO_Pin_9) 7 D2 Q3 C/ E9 ]2 p! x, b
- #define RS485_3DET_ON GPIO_SetBits(GPIOG,GPIO_Pin_10) 1 {; s: b {5 u' d- ?
- #define RS485_3DET_OFF GPIO_ResetBits(GPIOG,GPIO_Pin_10)
5 t V% P+ _+ }, r8 T - #define RS485_4DET_ON GPIO_SetBits(GPIOG,GPIO_Pin_11)
2 p* b7 a4 s! L/ C) Z9 X5 C - #define RS485_4DET_OFF GPIO_ResetBits(GPIOG,GPIO_Pin_11) e S5 Z% K" Y% k0 T7 _7 k
- + x* d4 I1 ~8 j8 e: G
- #define TS_74LV4052_On() RS485_1DET_ON;RS485_2DET_ON;RS485_3DET_ON;RS485_4DET_ON: ^8 @: ?( ^# _" x2 B: V
- #define TS_74LV4052_Off() RS485_1DET_OFF;RS485_2DET_OFF;RS485_3DET_OFF;RS485_4DET_OFF
复制代码 先初始化:void TS_74LV4052_Init(void)+ r$ o) C. T2 h3 y4 A
然后就可以去愉快的发消息了void TS_74LV4052_SendMgs(int num,u8 *Msg, u8 Len)/ A7 }$ |6 e7 C7 T7 @, E* W
$ d) u2 b: v+ v- ~9 A) i+ d实际测试发送是比较简单的,但是接受注定有麻烦了,一个时间点只能一路的通的。。。即使轮训也挺难实现。
3 B6 u* }) _+ t1 Y* y4 J: _9 S0 L( t可能需要在做设计了。有没有方便的1拖4思路呀。! k* J- K6 _, J& e
. ? {/ R s: n7 f |
他这是一个板子的 不是多个不同的设备 共用一路的话 所有的数据都到了四个接口上
这个板子是做工装测试的 这个板子同时接连5个设备同时测试 8 t0 K" H( @' W) C$ t @2 ]
待测设备支持485接口(没有协议 也没有功能 就是设备也预留了接口) 所以我们也调试一下
给我的启发是 是不是可以考虑485组网