STM32的RS485调试过程记录
2019-07-27 来源:eefocus
RS485是半双工,RS422是全双工。
A接A,B接B,不要交叉。
RS485标准是4根线,定义如下:
RO: Receiver Output: If A > B by 200mV, RO will be high;If A < B by 200mV, RO will be low.2
/RE: 接收器输出使能。当RE为低电平时,RO有效;当RE为高电平时,RO为高阻状态。
RI: Driver Input. A low on DI forces output Y low and output Z high.
Similarly, a high on DI forces output Y high and output Z low.
DE: DI enable(enable input(read)).
实际上接三根线就可以了。RO/RE用一根线。
但在工程实践中,一般都只有D+/D-或A/B两根线,如何实现双工通信呢?答案就是:通过不同的命令码来区分。
举例:
读温控器开关: 01(addr) 03(type:read) 0001(reg-addr) 0001(读长度) D5CA(CRC16)
写温控器开关: 01(addr) 06(type:write) 0001(reg-addr) 0001(写的值) 19CA (CRC16)
调试中碰到的问题:
问题1:
先是:received invalid response to Modbus query
之后很快变成:message time out
原因:485标准定义是5v电平,485设备供电用DC-5V,但STM32用的是DC-3.3V。这样通信就不可靠。
解决:没有换接口电平转换芯片,只是把上下拉电阻去掉了。
问题2:
STM32一次只能接收一个字节!!
原因:STM32接收中断是比较关键的,解决了中断接收的问题,就可以接收多个字节。
一些调试过程的打印:
FreeRTOS 7.6.0 for STM32F030
Build date: Aug 4 2017 15:08:22
The current time is : 08:08:08
The current alarm is : 08:08:50
rs485 send[8]:
010300000001840A
uart2 recv[5]:
01 83 02 C0 F1 //
rs485 send[]:
010300010001D5CA
uart2 recv[7]:
01 03 02 00 01 79 84
rs485 read val=0x0001=1
holleywell,ret=1