sdi12实现.docx
《sdi12实现.docx》由会员分享,可在线阅读,更多相关《sdi12实现.docx(15页珍藏版)》请在冰豆网上搜索。
sdi12实现
SDI-12串行总线实现
图1:
总线时序
唤醒信号:
12MS高电平(Least)+8.33MS低电平;
主机指令发送;
从机应答发送。
对于时序偏差的容忍度是±0.4MS,唯一的例外是StopBit和下一个StartBit之间的时间间隔的最大值为1.66MS不允许偏差。
主机将数据线设置为高至少12MS将被认为是一个Break;
从机在数据线设置为高6.5MS以内不会认为是Break,而设置为高12MS以上必定认为是Break;
从机在接收地址之前,必须要等待8.33MS的前导低电平;
在接收到Break信号100MS以内,传感器必须被唤醒,并做好监测StartBit的准备;
主机在发送完命令的最后一个Bit以后,必须在StopBit结束后7.5MS内让出总线的控制权;(容忍度:
+0.4MS)
在接收到Break和Command以后,被地址定位的从机将数据总线设置为低8.33MS(容忍度:
—0.4MS),应答的第一个Byte的StartBit应在Command的最后一个StopBit发送后15MS发送(容忍度:
+0.4MS);
从机在发送完最后一个应答Byte以后,应该在7.5MS以内释放总线的控制权(容忍度:
+0.4MS);
在应答和指令的两个Bytes的StopBit和StartBit之间的时间间隔不能超过1.66MS,没有容忍,这使得对M命令的应答被限制在380MS以内;
传感器必须在接受到一个无效地址或者在接受到最后一个MarkBit的100MS后进入睡眠模式(容忍度:
+0.4MS);
如果上一个指令是不同的地址,或者最后一个MarketBit已经发送了87MS,在发送命令前应加上Break。
Break的规则
在需要从休眠状态唤醒一个传感器时,主机将发送一个BreakBit。
传感器在接受到最后一个MarkBit的100MS后或者接收到一个无效地址后将再次进入休眠状态。
因此,如果上一个指令是不同的地址,或者最后一个MarketBit已经发送了87MS,在发送命令前应加上Break。
如果接收到的服务通知将在87MS以内执行D0指令,主机不一定要发送Break。
然而如果延迟的时间超过了87MS,则必须发送一个Break来唤醒设备。
重试
主机必须支持重试,传感器在接收到Break以后有100MS的时间来唤醒设备,且在被唤醒前不会接收任何指令。
传感器在检测到数据总线空闲100MS以后将再次进入休眠模式。
重试:
在发送命令后没有接到回应的情况下,主机将等到命令的最后一个Bit发送16.67MS以后87MS以前重新发送命令(不需要Break)。
在重试两次以上以后仍未接收到正确的回应新号,如果最后一次重试是在Break的100MS以后(保证设备拥有完整的100MS的唤醒时间),将重新发送包括Break在内的所有命令(两次以上)。
重试的条件如下:
1、传感器没有回应;
2、在接收到回应的StartBit后,出现了8.33MS的Mark;
3、不正确的回应。
错误回应包括:
不正确的格式;奇偶校验错误;帧错误或者是总线竞争。
在发送重试以前必须等待回应结束。
任何以上三条件之一存在的话,将触发重试。
SDI-12通信协议
SDI-12的主机和传感器之间通过ASCII字符进行数据交换。
主机将数据线置高12MS以发送一个Break来唤醒传感器。
主机发送一个命令。
传感器回复一个相应的应答。
每个命令都将发送给一个明确的传感器。
每个命令的第一个字符是主机将要通信的那个传感器的唯一地址。
其他的传感器将跳过这个命令并再次进入休眠状态。
主机开始从一个传感器采集数据后,如果没有接收到正确的回应将不会同其他传感器进行通信。
一个标准的传输流程为:
1、主机通过一个Break来唤醒SDI-12总线上的所有设备;
2、主机广播一个带有唯一地址的命令,指示一个传感器进行测量;
3、地址指向的传感器将在15MS以内回应测量设备将数据准备好所需的时间和将要回应的数据的字节数;
4、如果测量数据立刻就可以准备好,主机将发送一个命令来得到测量数据。
如果数据不能立刻准备好,主机将等待传感器发送一个表示数据已经准备就绪的请求。
这时主机再发送命令来得到数据;
5、传感器回应一个或多个测量数据。
数据率和帧格式
SDI-12总线的数据率是1200,下表显示了SDI-12的帧格式:
StartBit:
奇偶校验:
偶校验EndBit:
UART设置:
硬件流关闭,数据位8,校验无,停止位1,起始位1.
BAUD_M=131,BAUD_E=5波特率:
1200.
正当的字符
在SDI-12总线上传输的数据必须是可以显示的ASCII字符。
有效字符为32~126,ASCII码表如下所示:
代码
字符
代码
字符
代码
字符
代码
字符
0
32
[空格]
64
@
96
`
1
33
!
65
A
97
a
2
34
"
66
B
98
b
3
35
#
67
C
99
c
4
36
$
68
D
100
d
5
37
%
69
E
101
e
6
38
&
70
F
102
f
7
39
'
71
G
103
g
8
**
40
(
72
H
104
h
9
**
41
)
73
I
105
i
10
**
42
*
74
J
106
j
11
43
+
75
K
107
k
12
44
76
L
108
l
13
**
45
-
77
M
109
m
14
46
.
78
N
110
n
15
?
47
/
79
O
111
o
16
?
48
0
80
P
112
p
17
?
49
1
81
Q
113
q
18
?
50
2
82
R
114
r
19
_
51
3
83
S
115
s
20
_
52
4
84
T
116
t
21
_
53
5
85
U
117
u
22
?
54
6
86
V
118
v
23
?
55
7
87
W
119
w
24
?
56
8
88
X
120
x
25
?
57
9
89
Y
121
y
26
?
58
:
90
Z
122
z
27
_
59
;
91
[
123
{
28
?
60
<
92
\
124
|
29
?
61
=
93
]
125
}
30
-
62
>
94
^
126
~
31
63
?
95
_
127
?
ASCII码表:
红色为非法字符
有两个例外:
1、传感器的回应以两个字符为结束,回车(0X0D)和换行(0X0A),在本文档中显示为;
2、在某些情况下CRC数据的第二个或者第三个字节可能不是可显示字符。
设备地址
任何命令的第一个字符应该是一个传感器的地址。
同样的,回应的第一个字符也应该是这个传感器的地址。
这样SDI-12的主机就能够确认此回应是来自正确的设备。
(一个地址是一个用来表示那个传感器将回应命令的字符)
ASCII字符0—9是所有的主机和传感器必须支持的标准地址,如果必须要使用多于10个的传感器,可以使用字符A-Z或者字符a-z。
SDI-12的命令及回应
下表列出了基本的SDI-12命令,命令的格式和命令的回应的格式。
所有的SDI-121.3版本的设备必须支持所有下表列出的命令。
基本命令都不会影响传感器的校准。
高级命令将在以后的章节中体现。
名称
命令
回应
Break
数据线拉高12MS
无
AcknowledgeActive
a!
a
SendIdentification
aI!
allccccccccmmmmmmvvvxxx...xx
ChangeAddress
aAb!
b
AddressQuery
?
!
a
StartMeasurement
aM!
atttn
StartMeasurementandRequestCRC
aMC!
atttn
SendData
aD0!
aora
aD1!
aora
….
aora
aD9!
aora
AdditionalMeasurements
aM1!
......aM9!
atttn
AdditionalMeasurementsandRequestCRC
aMC1!
...aMC9!
atttn
StartVerification
aV!
atttn
StartConcurrentMeasurement
aC!
atttnn
StartConcurrentMeasurementandRequestCRC
aCC!
atttnn
AdditionalConcurrentMeasurements
aC1!
....aC9!
atttnn
AdditionalConcurrentMeasurementsandRequestCRC
aCC1!
...aCC9!
atttnn
ContinuousMeasurements
aR0!
...aR9!
a(formattedliketheDcommands)
ContinuousMeasurementsandRequestCRC
aRC0!
...aRC9!
a(formattedliketheDcommands)
所有的命令和回复的第一个字符总是地址,命令的最后一个字符总是!
,而!
也只能用做命令的结束符。
回应的最后两个字节总是。
在D命令的应答中的Value部分包含的字符的最大值可以是35或者75个。
如果D命令是为了检索数据,且一个数据采集命令正在执行的话,最大值是75个。
数据采集命令的Value部分也可以包括最多75个字符,其他的情况下都是35个字符。
ACK(a!
)
这个命令用来确定传感器已经能接收命令,它使一个传感器报告自己在SDI-12总线上的存在。
命令:
a!
应答:
a
例子:
0!
0
1!
1
其他命令请查阅数据手册。
实现方式
以一个IO口作为数据线终点,在睡眠前设置此IO口为输入并可以产生外部中断(高电平中断)。
此中断产生后,关闭中断,计时7MS,如果已经为低电平则继续进入休眠模式,否则等待低电平到来。
低电平到来后立刻计时,若在8MS以前出现高电平则休眠,到8.33MS时,立即开始以1200的波特率接收数据。
使用计时器1来完成长时间的计时。
使用计时器3来完成1200波特率的定时。
流程图如下:
SDI-12是基于微处理传感器的数据接口标准。
SDI-12代表了1200波特串行/数字接口。
本文描述了SDI-12数据记录器和SDI-12传感器的电器接口、通讯协议和时序请求。
SDI-12按照以下的需求进行应用:
◆最低功耗的电池供电系统
◆低的系统开销
◆通过单一数据线缆,使用单一数据记录器对多个传感器数据进行记录
◆传感器和数据记录器之间的电缆长度可达200英尺
2.0SDI-12性能
有数据记录器的微处理传感器最好选择串行数据接口。
◆微处理机传感器有自己独特的综合自测试算法。
◆无需校准编程数据记录器或者其他信息传感器之间可以互换。
◆通过此接口可以给传感器供电。
◆在一个小小的传感器里可以实现电源校准、微处理和其他必需的电路。
◆传感器可以使用低成本的EEPROMS(电可擦除只读存储器)来校准系数和其他信息。
◆标准串行接口简化了数据记录器的复杂设计。
◆在未来的传感器发展进化上,数据记录器可以独立前进和简化。
◆SDI-12数据记录器可以和不同的传感器接口相连。
◆人们很容易熟练掌握SDI-12数据记录器和SDI-12传感器。
◆不同版本的SDI-12传感器可以和不同版本的SDI-12数据记录器兼容工作
3.0SDI-12电器接口
SDI-12电器接口使用SDI-12总线在SDI-12数据记录器和传感器间传输串行数据。
SDI-12总线是连接多种SDI-12设备的电缆。
此电线为三芯电缆:
1)一根串行数据线
2)一根地线
3)一根12伏线
以下描述中,所有数值(不特殊指定)允许有±10%的误差差。
图1给出了连接一个数据记录器和两个传感器的SDI-12总线。
一个SDI12总线至少可以连接10个传感器。
3.1串行数据线
这个数据线是一个双向、三相数据传输线。
表1给出了传输串行数据的标准SDI-12的逻辑和电压值。
表1:
串行数据的逻辑和电压值
条件
二进制值
电压范围
marking
1
-0.5to1.0V
spacing
0
3.5to5.5V
transition
无定义
1.0to3.5V
3.1.1电压转换
正常操作时,数据线性电压变化率不会大于1.5V/微秒。
3.1.2阻抗
当一个SDI-12设备工作时,它的直流源阻抗必须在1000欧姆和2000欧姆之间。
当SDI-12设备关闭或者在低功耗待机状态时,对地的直流阻抗必须在160K欧姆和360K欧姆之间。
3.2地线
数据记录器的地线必须和电路地和地球地连接到一起。
传感器电路地也必须和地线连接起来,但是通常不用和它自己的地球地相连。
如果要求把传感器电路地和地球地相连,在传感器地球地和数据记录器地球地之间必须加一个大于12AWG的地线做为雷击保护。
为了保证所有的传感器电流损耗最大时,数据记录器和所有传感器间的电压损耗小于0.5伏,要求地线导线要足够大。
3.2.1瞬间保护
SDI-12总线最好使用瞬间保护电路。
附录A给出了SDI-12瞬间保护建议。
3.312V线
至于地,在最大传感器负载0.5安培时,数据记录器(或者外用电源)给12伏线提供了9.6v到16v的电压。
SDI-12不需要数据记录器给12V线提供电源。
因为传感器和12v线之间会有感应负载,需要串连一个二极管。
传感器里SDI-12没有电压限制,可以不做瞬间保护。
附录A是可用瞬间保护电路图。
3.4接头
ASDI-12的接头类型无特殊要求。
4.0SDI-12通讯协议
SDI-12数据记录器和传感器通过数据线交换ASCII码来进行通讯。
数据记录器向数据线上发出中断唤醒传感器,数据线上中断持续时间须大于12毫秒。
数据记录器发送一个指令。
传感器返回一个相应的响应,一个指令对应一个相应的传感器。
每个指令的第一个字符对应于记录器需要与之通讯的传感器地址。
SDI-12总线上的其他传感器不响应此指令继续处于低功率待机状态。
当数据记录器向一个传感器发出开始测量指令,记录器在这台传感器的数据收集完成前不和其他传感器之间进行通讯。
(多重测量指令时,一个数据记录器可以同时和其他传感器进行通讯。
见页14。
)
记录器/传感器基本测量过程如下:
步骤1.数据记录器通过中断唤醒SDI-12总线上的传感器
步骤2.记录器发送指令给相应的传感器,开始测量。
步骤3.地址传感器最大响应时间为15微秒,测量数据值准备传回。
步骤4.如果测量立即有效,记录器发送一个指令给传感器开始测量。
如果测量没有准备好,数据记录器等待传感器给记录器发送数据准备好请求。
记录器然后发送一个接收数据指令。
步骤5.传感器响应并返回一个或更多的测量值。
4.1波特率和字帧结构
SDI-12的波特率为1200。
表2显示了SDI-12的字帧结构。
4.2可实现特性
所有在SDI-12总线上发送的字符必须是可印刷的ASCII字符,表3显示了可印刷的字符。
这里有两种例外:
1)所有的从SDI-12传感器来的响应由回车中止(0Dhex,13decimal)线性流入字符(0Ahex,10decimal),本文显示为;
2)在同样情况下,CRC校验的第二、三个字符可以不是可印刷的ASCII码。
4.3设备地址
每一个命令的第一个字符都是传感器地址,同样的,响应的第一个字符也是传感器地址。
以使SDI-12记录器校验响应来自正确的传感器。
(地址是一个单字符显示哪一台传感器响应了这条指令)表4给出了这些地址码。
ASCII码'0'到ASCII码'9'是所有传感器和数据记录器必须支持的标准地址。
因为有时需要会超过10个传感器,所以使用地址范围从ASCII码'A'到ASCII码'Z'(十进制数从65到90)和ASCII码'a'到ASCII码'z'(十进制数从97到122)。
4.4SDI-12的命令和响应
下表列出了SDI-12的基本指令、格式,以及指令响应的的格式。
所有SDI-12的1.3版本的传感器和数据记录器必须支持表中的所有指令。
另外,传感器可支持4.4.13节中的扩展指令。
表中的术语(a,ll,cccccccc,mmmmmm,vvv,xxx,,etc.)在4.4.1和4.4.12中说明。
名称命令应答
Break(起始)持续空号(space)无
至少12mS
确认a!
a
送识别信息aI!
AIIccccccccmmmmmmvvvxxx…xx
改变地址aAb!
b(假定传感器支持此命令)
地址查询?
!
a
开始测量aM!
atttn
开始测量加CRCaMC!
atttn
发送数据aD0!
a<数值>或a<数值>
附加测量aM1!
atttn
.atttn
.atttn
.atttn
aM9!
atttn
附加测量加CRCaMC1!
…aMC9!
atttn
检验aV!
atttn
协同测量aC!
atttn
协同测量加CRCaCC!
atttn
附加协同测量aC1!
atttn
.atttn
.atttn
.atttn
aC9!
atttn
附加协同测量aCC1!
…aCC9!
attt加CRC
连续测量aR0!
…aR9!
a<数值>(同D命令)
连续测量加CRCaRC0!
…aRC9!
a<数值>(同D命令)
表5。
SDI-12基本命令/应答
5.0常用命令的使用说明
?
!
——查询地址指令,向传感器发送该命令,传感器返回一个地址码,这种方式在总线上只能连接一只传感器,用以查询它的地址。
a!
——确认指令,发磅该命令,传感器返回一个地址码,以确认其存在。
aI!
——识别信息指令,传感器返回条包含有软件件版本、厂家名称、序列号信息。
aAb!
——改变传感器地址指令,“a”为旧地址,“b”为新地址。
aM!
——开始测量指令,传感器返回atttn,ttt为本次测量所需时间,n为产生数据的数量。
aD0!
——获取数据指令,数据采集器通过该指令将传感器数据收集。