hi 先上图 表达我们小哥的设计思路。
. C) y. n5 T( j3 d! E8 k9 F7 o6 sRS485-5是独立的 利用USART3即可(比较简单)( a! i! @+ W. {% ]7 g0 @
RS485-1 2 3 4这4路是挂在一个“开关”上的,这个开关可以在4路中pick1路导通。0 C) G, Q. Y6 `
[5 Z; H9 @, Z& {' H8 u
( x( H2 v# f" u+ c9 \& K9 A5 `& ~( Y' `8 S. X
74LV4052相当于一个双刀四掷开关,具体接通哪一通道,由输入地址码AB来决定 这个器件用到4个管脚,TX RX就是STM32的USART2,而另外2个就是普通IO即可,我通过设置0和1就可以出现00/01/10/11这样4中情况,这样4中情况分别对应右边4路RS485的某一路导通。
; [/ [, H, m% r+ V" ~4 V( ^2 X4 ]& \0 F7 D
9 w& d( y0 @* I9 }1 k2 D; }- 0 O& G- Y% _, l( C: i) p+ p( j
- void RS485_1234_Init(void)
8 {3 R5 O. `7 o$ W" } - {
7 |& j n- r5 L. { J( T2 ^ - GPIO_InitTypeDef GPIO_InitStructure;( L) G; n) f; j$ ~& F! F& ^
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; % q* N, V, D3 ?7 y
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; - z: {3 y% T( S7 K; x
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
8 m) m5 Y( `& [! Y" v% H - GPIO_Init(GPIOG, &GPIO_InitStructure);/*1号*/
' l8 K3 V$ t9 ^, r' }- ~5 R - + e; G m' {/ R0 B
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; # E5 P, C! J0 P5 ~$ _% D+ i
- GPIO_Init(GPIOG, &GPIO_InitStructure);/*2号*/: Y, n% B3 A" X# f6 v# G/ S) M
+ ~0 S' U7 n. z8 h+ J7 ^- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
! T: C- Y9 q0 y6 H N5 |" K* o - GPIO_Init(GPIOG, &GPIO_InitStructure);/*3号*/ $ P5 @: u+ z6 {4 u( S
$ ^& ~/ T2 x# t5 R# _- N# i- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; # Y# S" R% E8 Y. j" M+ i- z
- GPIO_Init(GPIOG, &GPIO_InitStructure);/*4号*/! D/ j5 ]6 [' O1 f) ?6 w0 b0 C
" o% w) P2 ^' W* M+ g, f9 Q- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; 6 ~" t7 c2 J% o6 E4 A, T8 M/ }7 d, L
- GPIO_Init(GPIOG, &GPIO_InitStructure);/*S0*/ 3 ~, A, D/ |" M$ p5 V# T/ U* R
) ~- p6 N5 k+ x2 J8 h# c- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; 2 f6 s G K3 G. K+ P* V0 w5 V
- GPIO_Init(GPIOG, &GPIO_InitStructure);/*S1*/ 9 a$ o9 w. w- b7 S+ f# n
-
p8 }( }6 L8 [' M - }
% T2 G- n4 Z+ \% B( J( t1 U - $ ^/ k3 l6 c/ H6 O$ o7 C# ?
- void Choise_RS485_1234(u8 num)
4 p( H# |5 R( W3 c | - {4 d. N, S i& R% L% i3 f/ ?
- switch(num)
5 d' W/ g, G5 Y4 W5 c/ f - {
/ `6 |/ J9 {. o* _: U% W9 G. W - case 1:SW_S0_L();SW_S1_L(); break;
! K" F; p8 Z2 Z - case 2:SW_S0_H();SW_S1_L(); break;" p G4 s' ^; D: y
- case 3:SW_S0_L();SW_S1_H(); break;
- p( s: I' G+ x - case 4:SW_S0_H();SW_S1_H(); break;
9 o* O* X& M8 A2 P' P" A - default :break;
, `/ c; D1 W; V - }
9 M* o/ y, o/ }% k, V - }
. O" n: `7 V& E0 A" B5 Q: H - . K% x# k6 \' O. t, x7 ]8 f/ O
- void TS_74LV4052_Init(void)' C. V' Z7 @5 p4 J8 @
- {
- U1 v! N( p) u: V& r. V - USART_Config(2, 9600, USART_WordLength_8b, USART_Parity_No, 2, 0, ENABLE, DISABLE);/*USART2*/4 k. \. Q' U& N& a/ h% \
- RS485_1234_Init();, K+ Q1 y9 I( j5 I, J' c
- }# {3 }( a9 w4 R
$ c& _0 }) e& I1 e( P1 Y0 K. d
7 P( d o! N0 n7 v/ F' ~- void TS_74LV4052_SendMgs(int num,u8 *Msg, u8 Len), t! L' G% T/ L1 V; r, ~, ~% k6 ]
- {
$ U2 b" r N, H$ W - Choise_RS485_1234(num);- t9 ~; T4 m& ?9 u; P
- USART_GetFlagStatus(USART2,USART_FLAG_TC);1 X# R- ^1 J( Z
- if(Len)0 n' N+ H n6 X
- {
! O8 b3 d0 r/ X3 W A8 e% g - TS_74LV4052_On();
0 j/ _' l& S# |2 h6 v9 N/ o - USART_SendData(USART2, 0xFE);) ~* A; v* W( t9 V1 q) M
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET) ;0 [; z1 `- ]: X9 Q0 w
- USART_SendData(USART2, 0xFE);) q4 l4 I3 w' ^7 y- i/ v. u j. T
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET) ;$ m! r; b! v+ T/ @& j. Q
- USART_SendData(USART2, 0xFE);% C; V% C% @% y* c- J9 W* d
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET) ;0 W6 Q7 Q* Q* D; p) g$ j3 }$ Q
- USART_SendData(USART2, 0xFE);0 \, P& a0 H" T6 I! Y5 f( k
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET) ; E4 h1 J8 _ b9 X T
- while(Len--)
/ H, _' D4 B3 a2 a( x5 x - {
- b# x0 n: p0 g1 Z4 O) T5 U2 u - USART_SendData(USART2, *(Msg++));
! v4 g. g" m$ ^1 {& L+ V - while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);
) {) t0 K. Y3 X9 V0 l - }9 N% ^+ Q4 F% K- E6 v
- TS_74LV4052_Off();
7 J( D. |& X, A$ W& a& k - }9 a$ z6 ~1 P. z# D
- }* V/ t' t! r; M) r+ @, m7 W$ n
复制代码- #define SW_S0_H() GPIO_SetBits(GPIOG ,GPIO_Pin_14)
/ U: K, A6 }1 O8 Z1 b, ] - #define SW_S0_L() GPIO_ResetBits(GPIOG ,GPIO_Pin_14) / Q3 H& G3 H- a) f: O3 w; w- T* I
- #define SW_S1_H() GPIO_SetBits(GPIOG ,GPIO_Pin_13)- d/ J+ {4 h7 V; W h7 d
- #define SW_S1_L() GPIO_ResetBits(GPIOG ,GPIO_Pin_13)
n9 p& q, l6 q% P: l# ?7 d - #define RS485_1DET_ON GPIO_SetBits(GPIOG,GPIO_Pin_8)
- z7 {# x r/ A. p - #define RS485_1DET_OFF GPIO_ResetBits(GPIOG,GPIO_Pin_8) . A5 l, V+ s% m4 r' p+ A
- #define RS485_2DET_ON GPIO_SetBits(GPIOG,GPIO_Pin_9)
% ?, c1 U/ I* x2 p2 e1 h$ H - #define RS485_2DET_OFF GPIO_ResetBits(GPIOG,GPIO_Pin_9) 8 ^% o% H3 V% Q8 `3 ~3 g) b/ n9 L
- #define RS485_3DET_ON GPIO_SetBits(GPIOG,GPIO_Pin_10)
1 T" H# a8 ]' M( T - #define RS485_3DET_OFF GPIO_ResetBits(GPIOG,GPIO_Pin_10) 4 s' X1 T) Y W) `
- #define RS485_4DET_ON GPIO_SetBits(GPIOG,GPIO_Pin_11)
5 W8 _% o6 S) U% S9 b - #define RS485_4DET_OFF GPIO_ResetBits(GPIOG,GPIO_Pin_11)
/ k6 y M# O4 h8 R
2 G2 {3 u# j, ~* k* r- #define TS_74LV4052_On() RS485_1DET_ON;RS485_2DET_ON;RS485_3DET_ON;RS485_4DET_ON) Y# ?! [# k, W0 P" f- k/ y
- #define TS_74LV4052_Off() RS485_1DET_OFF;RS485_2DET_OFF;RS485_3DET_OFF;RS485_4DET_OFF
复制代码 先初始化:void TS_74LV4052_Init(void)* V7 ?" f5 Y/ B ^6 P
然后就可以去愉快的发消息了void TS_74LV4052_SendMgs(int num,u8 *Msg, u8 Len)1 w9 D9 y+ a0 s5 I! R0 |% y8 r; a
$ T$ }& t9 h+ H0 K, T实际测试发送是比较简单的,但是接受注定有麻烦了,一个时间点只能一路的通的。。。即使轮训也挺难实现。
( i, ~4 i, S; ?" t# I( ~可能需要在做设计了。有没有方便的1拖4思路呀。
* |9 u/ n D+ }3 j* @% y4 }5 r8 k3 Q% ~" b
|
他这是一个板子的 不是多个不同的设备 共用一路的话 所有的数据都到了四个接口上
这个板子是做工装测试的 这个板子同时接连5个设备同时测试 1 q# ]" `% R; `1 g
待测设备支持485接口(没有协议 也没有功能 就是设备也预留了接口) 所以我们也调试一下) ^: [# g* H) z! F2 [3 ]6 h
给我的启发是 是不是可以考虑485组网