hi 先上图 表达我们小哥的设计思路。: _4 [$ A% F) s) c1 N
RS485-5是独立的 利用USART3即可(比较简单)2 g: x# M8 I7 I- J8 F4 v
RS485-1 2 3 4这4路是挂在一个“开关”上的,这个开关可以在4路中pick1路导通。
# q7 ^; |; A! e$ t B' A0 r
. F! e1 @! _; t% M' w$ d% D+ z+ H
- \$ j5 S! X& m$ T" a1 g s74LV4052相当于一个双刀四掷开关,具体接通哪一通道,由输入地址码AB来决定 这个器件用到4个管脚,TX RX就是STM32的USART2,而另外2个就是普通IO即可,我通过设置0和1就可以出现00/01/10/11这样4中情况,这样4中情况分别对应右边4路RS485的某一路导通。
" f3 ~' b4 P6 M. r$ q! ]6 P
; ?% Y6 \# b! C1 N. }
5 t8 T0 I( J) [3 c3 q, i+ @3 r9 f% U5 C- / K" n" t# A4 R
- void RS485_1234_Init(void)
' h! `% t1 t. y - {- a, y- W5 O1 t7 g1 P; \
- GPIO_InitTypeDef GPIO_InitStructure;/ @3 H% @0 j' K' Z5 K |! G/ w0 K
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; " S9 r' j' l3 ~0 ?
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 7 @. \. U7 ]+ {4 ]8 l9 d3 |1 u0 f
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;) L+ y" q, ]( e- K3 L- |) N8 J
- GPIO_Init(GPIOG, &GPIO_InitStructure);/*1号*/ I% a& p+ Q. n8 {
% o. g$ X1 N% B+ S- B3 Z- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; & }& e% ^% u+ s& W
- GPIO_Init(GPIOG, &GPIO_InitStructure);/*2号*/
' |' z) V4 f! U
! ]- G1 C& @$ _% o. h: ?- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
) B! A3 W( k1 M& v& b/ E% A - GPIO_Init(GPIOG, &GPIO_InitStructure);/*3号*/
9 Y1 H# A5 q8 a
2 f' w6 @- _2 \2 i+ I- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
3 _- k( K) v* R/ h+ L - GPIO_Init(GPIOG, &GPIO_InitStructure);/*4号*/# c$ F, m$ {( j# R0 ~# ~
( p# w5 l6 O; }& @3 |- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; ! H3 p U* F8 }: k# x
- GPIO_Init(GPIOG, &GPIO_InitStructure);/*S0*/ - N$ k/ |$ P% h4 d2 w
1 X' @1 z4 K6 ]1 w( h- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
( d# C6 t$ c2 q - GPIO_Init(GPIOG, &GPIO_InitStructure);/*S1*/ 6 a0 M4 a8 g1 V0 q
-
& i. ^! D1 c; n - }
`% e2 ^+ q6 w4 [' m
/ z4 M5 o9 n+ k) U3 Y4 `0 X1 \! ^- void Choise_RS485_1234(u8 num)
: [. k- x6 A) U# H" `7 d) } - {
0 r' k9 E* a% W* n1 q5 P$ F/ C, d& P& o - switch(num). x: q' N" X' @0 e; u5 Q, T
- {
$ L2 B( F1 n' Y) a4 p+ V - case 1:SW_S0_L();SW_S1_L(); break;% b, Y- G9 K9 z
- case 2:SW_S0_H();SW_S1_L(); break;
6 P! t( y, o4 k7 f1 a8 ? - case 3:SW_S0_L();SW_S1_H(); break;: P w0 r& s0 p
- case 4:SW_S0_H();SW_S1_H(); break;+ m2 U& W% ~4 m" ]/ ^5 M% I
- default :break;4 }! j5 I. r! Z4 y* Q
- }
1 Y) S9 ]. j7 {% ? - }
, Q N, m, t4 n) w' c - ' b/ D: p& e. ^7 }! i/ l% m$ K
- void TS_74LV4052_Init(void)2 O# J" s o! |1 A6 J' v
- {( z0 C! U5 s7 k6 J/ @. k
- USART_Config(2, 9600, USART_WordLength_8b, USART_Parity_No, 2, 0, ENABLE, DISABLE);/*USART2*/
; c7 t& n; B" L9 x" I Z - RS485_1234_Init();
+ E1 G( C3 `6 o/ V$ k+ J- i - }
, }3 k. F8 U+ p, M! F5 s6 V - $ I( K: S" }$ s8 R+ L. j1 `
- + k. l8 I& T1 T4 k+ Y+ R
- void TS_74LV4052_SendMgs(int num,u8 *Msg, u8 Len)
2 K( l" k3 S$ o5 a* r" a - {. D5 B0 U5 y1 i) \; O
- Choise_RS485_1234(num);
2 q1 j5 D. F; A# u - USART_GetFlagStatus(USART2,USART_FLAG_TC);
4 g3 K4 \! x! ~- w1 F - if(Len)
* E9 w) w% z* w" ~# D - {
# g# @' z0 x* A - TS_74LV4052_On();4 }; ?- r" _6 S) L) p
- USART_SendData(USART2, 0xFE);
& b- R% ?) M* Q( l1 ^ - while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET) ;% B) _, x- Q1 d/ H& D
- USART_SendData(USART2, 0xFE);
, d& k/ O9 S: w0 }( q - while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET) ;5 V( B6 t: B" u- U) K( S; x
- USART_SendData(USART2, 0xFE);
8 V: w- O/ t* @5 ^ - while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET) ;
+ q' E, M0 E) ]1 Y* B) }$ m: N1 ~ - USART_SendData(USART2, 0xFE);5 M/ J) r8 `! q) n! l& i1 z: D
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET) ;
( I& r- ^/ f2 Q$ N+ u - while(Len--)! F* m& d4 ?0 m3 } e& @9 c1 q
- {: q* S0 m+ H. y j3 E0 f" t" Q" y0 t
- USART_SendData(USART2, *(Msg++));
! r( ]& o! k, A9 Q - while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);
* r2 V$ U5 k# T" L5 H' r, Y6 P' H+ b - }
: F5 ]* y, x* _# i* { - TS_74LV4052_Off(); Z* h# m; J7 z( t- h; Z4 ^: w
- }
3 V8 c0 v. Y4 N# ? - }2 K+ d5 \% z1 b% k+ e
复制代码- #define SW_S0_H() GPIO_SetBits(GPIOG ,GPIO_Pin_14)1 R& ?) r* n% b% A; z4 M& x; |
- #define SW_S0_L() GPIO_ResetBits(GPIOG ,GPIO_Pin_14) 0 S7 @5 x$ q/ }4 \+ D* W4 E
- #define SW_S1_H() GPIO_SetBits(GPIOG ,GPIO_Pin_13)
% s" v: `/ X. M d! ^; a( O4 ~5 _ - #define SW_S1_L() GPIO_ResetBits(GPIOG ,GPIO_Pin_13) " d' T3 j9 ~! D0 I1 x
- #define RS485_1DET_ON GPIO_SetBits(GPIOG,GPIO_Pin_8) " f- j$ b" e& E, C
- #define RS485_1DET_OFF GPIO_ResetBits(GPIOG,GPIO_Pin_8)
1 i+ X3 s% E: \+ Z# j, v! o - #define RS485_2DET_ON GPIO_SetBits(GPIOG,GPIO_Pin_9) $ Y/ |! v- t8 j) i) `) \
- #define RS485_2DET_OFF GPIO_ResetBits(GPIOG,GPIO_Pin_9)
* _8 t$ W( I4 ?9 ?8 }2 R- i; ` - #define RS485_3DET_ON GPIO_SetBits(GPIOG,GPIO_Pin_10) 9 \$ U: g# H4 x4 [7 t7 P
- #define RS485_3DET_OFF GPIO_ResetBits(GPIOG,GPIO_Pin_10) ; ~8 W4 y& g0 P; t/ w) y
- #define RS485_4DET_ON GPIO_SetBits(GPIOG,GPIO_Pin_11) % }3 p( O' [; ~
- #define RS485_4DET_OFF GPIO_ResetBits(GPIOG,GPIO_Pin_11)
' E" T' m, g1 n% @0 E - ' s) T" C' u; d# \: D3 x3 S: Z
- #define TS_74LV4052_On() RS485_1DET_ON;RS485_2DET_ON;RS485_3DET_ON;RS485_4DET_ON0 |/ N! Y1 K& t+ R# g5 A
- #define TS_74LV4052_Off() RS485_1DET_OFF;RS485_2DET_OFF;RS485_3DET_OFF;RS485_4DET_OFF
复制代码 先初始化:void TS_74LV4052_Init(void)0 D% E# \- @% \' T3 O" H
然后就可以去愉快的发消息了void TS_74LV4052_SendMgs(int num,u8 *Msg, u8 Len)
, w5 z" ]5 M, h3 ~5 U: ?& D3 z& k- [7 p
; D4 e" A4 }+ O# |' K+ p实际测试发送是比较简单的,但是接受注定有麻烦了,一个时间点只能一路的通的。。。即使轮训也挺难实现。% Z8 I' [4 J( U" G1 [; ~
可能需要在做设计了。有没有方便的1拖4思路呀。
) Z( V* T2 o4 X0 l( e
, G L' D- f5 @7 ^+ ? |
他这是一个板子的 不是多个不同的设备 共用一路的话 所有的数据都到了四个接口上
这个板子是做工装测试的 这个板子同时接连5个设备同时测试
待测设备支持485接口(没有协议 也没有功能 就是设备也预留了接口) 所以我们也调试一下
给我的启发是 是不是可以考虑485组网