我是老温,一名热爱学习的嵌入式工程师& s8 L; {& p8 v
关注我,一起变得更加优秀!RS485是工业控制场景下,应用得非常广泛的通信协议,RS485的差分物理信号在电磁环境复杂的工业现场,有强大的抗干扰能力。( j9 o) ]( `' J
8 j: U2 U" m9 N* X0 g2 o% E( x
对于平时专注于应用软件开发的工程师,使用RS485进行数据传输,只要关注串口的数据收发器即可,但其实在硬件层面,RS485通信的数据收发,也需要遵循一定的机制。
* {- Q, [2 i0 {' j/ _2 H, z
2 ]1 O& d' m+ y% `" ]/ RRS485通信接口特点
) f1 ]$ P) s6 ~& x6 @1 ? M- S# P' I* x$ }5 Q% z
作为工业领域上较常用的通信方式,RS485总线具有以下诸多特点:
) G9 {6 ^7 `( _ g; v* O9 K5 B) Z8 C: l
1、收发器输出A、B之间的电平为+2V~+6V,是逻辑“1”;为-6V~-2V,是逻辑“0”。信号电平比RS232降低了,不易损坏接口芯片。另有“使能”控制信号,可使收发器处于高阻状态,切断与传输线的连接。7 {$ ~6 A& ?5 L7 k: h( s$ K1 P! `
/ D$ j; M/ g8 S! j) b
2、接收器的输入灵敏度为200mV。即在当接收端A、B之间的电平相差200mV时即可输出逻辑。
+ Y7 p+ Y2 q) B
! ?5 U1 Z* l+ v) q3、传输速率高(10Mbps),传输距离达到1200m)。% H* y; \, B% {7 n2 j% |8 x- L
/ n8 c: H& k* m ?! o) y
4、具有多站点传输能力,即总线上允许挂接多达128个收发器,可建立设备网络。8 v$ H3 ~' E$ @" [$ Y4 I
) o" t' T, p3 n0 X/ R; M9 A: T, P
5、RS485收发器共模电压范围为-7V~+12V,只有满足该条件,整个网络才能正常工作。当网络线路中共模电压超出此范围时就会影响通信的稳定,甚至损坏接口。
4 i) A: ^6 [: S" j {
( p! r( i, R [. ~" D: ?* dRS485收发控制方法8 q* `* M+ H4 T3 g" s# t0 p
& [, C7 _; |2 |1 C, `
RS485属于半双工总线,在实际使用时一般采用主机轮询或令牌传递的方法来分配总线控制权,RS485设备需要进行发送和接收的方向转换。
$ L! E( v) k6 f4 Z0 u: V. s
: M6 K* q7 i8 i" v9 v比较通用的做法是,每个RS485设备在平时均处于接收状态,只有在自己有数据要发送时才转换到发送状态,数据发送完毕后再次切换回接收状态。
3 N9 n' [/ Y6 e
8 N& J5 g& R9 t" h/ ]" W第一种:程序换向控制
5 l% N' I/ T X' R8 j. k: t1 L4 U( n) w
最常用的RS485收发换向方法是程序换向,即由MCU的一个I/O端口控制RS485收发器件的收发使能引脚,在平时使RS485收发器件处于接收状态。
! n" d& {2 t6 `/ a6 |6 g& Y
) X8 h; H" s& E0 B7 D! e如下图,这里485芯片用TI的SN65LBC184,最大速率达到250Kbps,当有数据需要发送时,MCU将RS485收发器件引脚(网络RS485_EN2)置于发送状态,完成数据发送后,再把RS485收发器件切回接收状态。
& H' q7 a- b" T* \; d) x
6 t3 Q- Z9 B; m4 T
3b5wtklvlk164026769621.png
/ C+ m, i% [) g) a
这种方式简单易行,不需增加额外成本,这种方法很多人都会知道并且基本上都用的方法。
; r5 l0 f; P8 \8 M( z _9 |% j第二种:自动换向% u5 n& t) {# r: A8 N7 R9 X; C( Y6 b
但是,当我们采用某种硬件平台的工控主板或核心板进行二次开发时,由于工控主板或核心板上没有预留出足够的I/O端口,使得RS485收发的程序换向方法无法实现。! U- [6 F1 ~3 f$ \3 a7 ~+ r+ k) w+ @
在某些特定的情况下,开发平台的底层驱动未对外开放,难以对底层进行二次开发,这种情况下即便有足够的I/O端口也无法实现程序换向。
" e, U8 @) u0 \6 b* Q为此,我们需要采用另外一种换向技术,即自动换向技术。, r) a% D( R9 E- w, A
自动换向其实就是对使能引脚不需要单独的I/O口来控制,而是由发送引脚发送数据时候顺便控制了。. _0 U, Y6 K1 m' J$ K8 {6 l
要实现这种方法可以使能那里加一个反相器,如下图,在空闲状态下,串口的发送信号TXD2为高电平,经过反相器后输出低电平,使SN65LBC184处于接收状态,而RS485总线由于上下拉电阻的作用处于A高B低的状态。$ g0 |" X0 l% O9 H$ ]9 T3 Y' S" q8 c
当发送数据时,TXD2信号线上的低电平比特位控制SN65LBC184进入发送状态,将该比特发送出去。而高电平比特位则使SN65LBC184处于接收状态,由RS485总线上下拉电阻把总线置于A高B低的状态,即表示发送了高电平。
9 T9 J6 ~/ @% A! y
ejq2ugp4uox64026769721.png
9 f- Z8 ]+ c9 o v反相器也可以用三极管代替,如下图所示,工作原理和加反相器一样。' I- m ]" W4 X u ]
但是这种方法在发送高电平时的驱动能力有限,因此会限制通讯距离,一般适用于距离不远场合。3 B' h8 u( {- z7 P- `' w
t3e34oi54b064026769821.png
( L5 X, _+ F$ Z* l$ t" I r, x
其实,为了省去控制的麻烦,也可以采用专门的、带有AutoDirection功能的485芯片,比如MAX13487E,它省去了常用的485使能信号,从而简化了设计电路。
5 S" v- { y* y; j5 {, M5 o0 f
1taj0wvturs64026769921.png
, C3 U' `( }9 ]7 J( m8 C- c4 c来源:牛x的工程师网友。" u+ _! r; `+ `& E9 M) b$ [
j1n4ifocilx64026770022.png
) R! H0 r. [' R' t; x! O4 r5 A& A7 o9 ]) ~# q
7 t- l. Q2 o! k* M
-END-* D; k, j6 K0 Z8 W) P* w( R3 `- R
往期推荐:点击图片即可跳转阅读
& Z; o _( g, x 5 ?: f" D0 V& f. q% i4 T
6 ~: @3 G$ L, o- Z9 u0 H6 J) U7 m6 S 3 p* v p5 T$ ^. f& e
+ {& B% H/ g/ d# } c" \% Z
jpqh0b3lxwl64026770122.jpg
2 G9 U9 R, U! p$ B 4 W7 J4 a8 U, \; h5 }* Y
嵌入式应用程序开发,经常使用哪些数据结构?
( ?- R; _7 z4 Y0 c) a9 u2 V) p+ q3 h M8 G: r" D+ O* g. v
s5 j7 Q: f* Q1 o4 i* e
1 q$ j" S( Z9 t$ D' Z5 k
# P/ y) N& r0 {3 v. x. F0 _
e4liopiuqhq64026770222.jpg
5 `! P d) L% y$ ]+ b& A# \
* A- q( t5 \4 u5 G1 j! t- S 嵌入式 C 语言运行时的错误处理机制
7 ^/ j$ o" _2 o) s6 u
! w" \! O0 s/ U1 r& r" y' N0 v* d
+ ^, w1 U7 [0 V5 K/ y2 U9 F
9 _8 l! f R- N
rrbuwireyqh64026770322.jpg
: @8 F' l% E7 P# u3 J " A! p4 r" \# V/ ~% X' _0 I9 R
今年快过完了,明年准备进厂搞嵌入式工控,提前了解各方行业信息!
; F: c, ^" T9 B
$ K0 h0 ]% @! i) W1 I5 V. G & y. K7 o8 H. u( U- m& c% ?9 B
! R, W1 \9 P& k& d. C
我是老温,一名热爱学习的嵌入式工程师2 x9 G& \1 p7 s2 V E
关注我,一起变得更加优秀! |