资源描述
资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。
基于CAN2.0标准的CAN-串转换通信技术研究
于素梅 蔡祥宝
( 南京邮电大学 电子科学与工程学院, 南京 210003)
摘 要: 现场总线是自动化领域的计算机网络, 已成为当今自动化领域技术发展的热点。CAN总线是现场总线的一种, 它与串口之间的通信, 是经过硬件电路的电平转换, 和软件设计的数据处理实现的。此方法实现了双CAN功能, 提高了通信的可靠性。
关键词: CAN总线; CAN设置; 双CAN; 串口RS232; 看门狗
1 引言
CAN (Controller Area Network) 总线又称控制器局域网, 是Bosch公司在现代汽车技术中领先推出的一种多主机局部网。它是一种串行通信网络, 支持分布式实时控制, 最大传输速度可达1Mbit/s, 最大传输距离为10km。CAN规范已被 ISO 国际标准组织制订为国际标准, 即CAN标准, 现在最常见的是2.0标准, 分为2.0A和2.0B。其区别仅在通信数据位数, 前者是11位的标准帧, 后者是29位的扩展帧。CAN 协议建立在国际标准组织的开放系统互连参考模型基础上的, 主要工作在数据链路层和物理层, 用户可在其基础上开发适合系统实际需要的应用层通信协议。而串口 RS232 作为标准计算机串行接口, 与 CAN 网的结构、 传输特性、 通信协议等都不相同, 因此导致不同设备间无法进行直接通信。因此实现二者之间的直接信息流交互成为问题的关键。
2 原理
这里采用嵌入式芯片 STM32F103 作为主控, CAN网和串口数据的转换是经过芯片相应管脚收发数据, 然后把转换后的数据发送出去的过程。此方法实现了双CAN的功能, 即经过继电器切换实现两个CAN切换使用, 相当于单刀双掷开关,这样增强了CAN的可靠性。
2.1 CAN网切换
经过芯片连接继电器的管脚拉高和拉低实现CAN网的切换, 默认为低, 是一路, 当软件程序中写高时就会拉高, 则继电器切换到另外一路, 实现双CAN 的功能。
2.2 CAN-串通信协议转换
CAN网设置是通串口发送的数据来实现的, 即芯片STM32F103根据上位机串口发来的数据, 把CAN属性设置成相应的值。这样就与上位机串口设置一致, 便于观察与记录。不但美观还节省测试者的大量时间。
串口RS232互连总线接口主要功能是接口模块与PC机通信。
通信方式: 信息以串行异步通信方式传送。
传输速率: 11.52kbit/s。
字节发送帧结构: 按发送顺序依次为1个起始位, 8个信息位, 1个停止位。
串口发送数据步骤: 先设置CAN, 设置完把设置值回发给串口, 串口接收到数据后表示CAN已设置完成, 能够进行数据通信, 然后再发送数据。当帧头为FE时表示设置CAN , 为FF时表示进行数据通信。如串口发FE F0 F1 EF FE FE EF, 则设置CAN, 同时会把这组数据发给串口, 串口接收到这组数之后, 才能够进行CAN-串转换通信。设置CAN时串口发送数据为下表一所示:
此处 CAN 波特率可有十个选择( 如表A) , 因为要实现 CAN 的正常通讯, 通讯节点之间设置的波特率必须相同。因此用户能够根据自己的需要, 设置自己的波特率。
表 1 设置CAN的数据
帧头DATA0
DATA1
DATA2
DATA3
DATA4
0xFE
波特率设置
( 见表A)
0xF1: CAN-1路
0xF0: CAN-2路
0xFE: 单滤波
0xEF: 双滤波
0xFE: 只听模式
0xEF: 正常模式
DATA5
DATA6
DATA7
0xFE: 标准帧
0xEF: 扩展帧
0xFE: 远程帧
0xEF: 数据帧
用户自定义
A)波特率DATA1设置:
0xF0: 5k 0xF5: 125k
0xF1: 10k 0xF6: 250k
0xF2: 20k 0xF7: 500k
0xF3: 50k 0xF8: 800k
0xF4: 100k 0xF9: 1M
3 软硬件设计
3.1 硬件设计
电原理图如下图1:
G5
25MHZ
C5
20pF
C50
20pF
+
C53
10uF/16V
C54
104
C55
104
C56
104
+3.3V
1
2
3
XS5
CON3
+3.3V
D5_BOOT0
V51
LED
R503
1K
D5_PB6
1
2
3
XS50
CON3
VCC
1
GND
2
TXD
3
RXD
4
CANH
6
CANL
7
CANG
8
D51
CTM8251A
+3.3V
D5_BOOT1
D5_CANTX
D5_CANRX
+5V
+
C58
10uF/16V
C59
10n
R1
0
CANH
CANL
C52
10n
+3.3V
+
C51
10uF/16V
V5
LED
R51
1K
D5_STM32F_TX
D5_STM32F_RX
+3.3V
+3.3V
1
2
3
XS508
CON3
+
C523
0.1u/16V
+
C525
0.1u/16V
+
C526
0.1u/16V
+
C524
0.1u/16V
+
C527
0.1U/16V
D5_TXD232
D5_RXD232
C528
10n
C1+
2
C1-
4
C2+
5
C2-
6
T1IN
11
R1OUT
9
EN
1
FON
12
FOFF
16
INVALID
10
R1IN
8
T1OUT
13
V-
7
V+
3
VCC
15
GND
14
D52
MAX3221EAE
+3.3V
D5_RST
GND
1
RESET
2
VCC
3
D54
MAX809R
G51
32KHZ
C530
12pF
C529
12pF
D5_OSC32_IN
D5_OSC32_OUT
1
2
3
5
4
AND
D55
SN74AHC1G08DBV
R594
10K
+3.3V
D5_RST_CPU
D5_RST
D5_RST_J
+3.3V
+3.3V
+3.3V
+3.3V
+3.3V
GND
GND
GND
GND
D5_CANTX
D5_CANRX
D5_RST_CPU
D5_STM32F_TX
D5_STM32F_RX
D5_JTDI
D5_JTDO
D5_JTCK
D5_JTMS
D5_BOOT1
D5_BOOT0
D5_OSC32_IN
D5_OSC32_OUT
PE2/TRCECK
1
PE3/TRACED0
2
PE4/TRACED1
3
PE5/TRACED2
4
PE6/TRACED3
5
VBAT
6
PC13-ANTI_TAMP
7
PC14-OSC32_IN
8
PC15-OSC32_OUT
9
VSS_5
10
VDD_5
11
OSC_IN
12
OSC_OUT
13
NRST
14
PC0/ADC_IN10
15
PC1/ADC_IN11
16
PC2/ADC_IN12
17
PC3/ADC_IN13
18
VSSA
19
VREF-
20
VREF+
21
VDDA
22
PA0-WKUP
23
PA1
24
PA2
25
PA3
26
VSS_4
27
VDD_4
28
PA4
29
PA5
30
PA6
31
PA7
32
PC4
33
PC5
34
PB0
35
PB1
36
PB2/BOOT1
37
PE7
38
PE8
39
PE9
40
PE10
41
PE11
42
PE12
43
PE13
44
PE14
45
PE15
46
PB10/USART3_TX
47
PB11/USART3_RX
48
VSS_1
49
VDD_1
50
PB12
51
PB13
52
PB14
53
PB15
54
PD8
55
PD9
56
PD10
57
PD11
58
PD12
59
PD13
60
PD14
61
PD15
62
PC6
63
PC7
64
PC8
65
PC9
66
PA8
67
PA9/USART1_TX
68
PA10/USART1_RX
69
PA11/CANRX
70
PA12/CANTX
71
PA13/JTMS/SWDIO
72
NC
73
VSS_2
74
VDD_2
75
PA14/JTCK/SWCLK
76
PA15/JTDI
77
PC10
78
PC11
79
PC12
80
PD0
81
PD1
82
PD2
83
PD3
84
PD4
85
PD5
86
PD6
87
PD7
88
PB3/JTDO
89
PB4/JNTRST
90
PB5
91
PB6
92
PB7
93
BOOT0
94
PB8
95
PB9
96
PE0
97
PE1
98
VSS_3
99
VDD_3
100
D5
STM32F103VBT6
+3.3v
GND
D5_JNTRST
PA0
PA1
PA2
PA3
PA4
PA5
PA6
PA7
PD0
PD1
PD2
PD3
PD4
PD5
PD6
PD7
read
D5_JTMS
D5_JTCK
D5_JTDO
D5_RST_J
D5_JNTRST
D5_JTDI
D5_GND_J
R5002
0R
R5001
10K
R5000
10K
R599
10K
R598
10K
R597
10K
GND
+3.3V
1
2
3
4
5
6
7
8
XS53
CON8
R5003
0R
D5_GND_J
D5_PB6
1
2
3
XS509
CON3
CAN-GND
C522
10nF
C521
1uF
VREF+
VREF+
VREF-
VREF-
INIT1
INIT2
+3.3V
GND
write
1
2
XS1
CON2
R54
120R
tp
1
X1
TP
tp
1
X2
TP
tp
1
X3
TP
tp
1
X4
TP
tp
1
X6
TP
tp
1
X7
TP
tp
1
X8
TP
L1
8
1
K2A
G6K-2F-5V
V7
1N4148SMD
V11
MMBT9013LT1
C42
47n
R11
5.1K
+5V
3
2
4
K2B
G6K-2F-5V
6
7
5
K2C
G6K-2F-5V
1
2
3
XS510
CON3
PD1
+3.3V
图 1 电原理图
内部晶振: 32KHZ; 外部晶振: 8MHZ;
管脚配置: PA12为CAN_TX, PA11为CAN_RX,
PA10为USART_RX, PA11为USART_TX;
复位电路模块: D54部分, MAX809R作为复位电路芯片;
双CAN模块: D51部分, XS509和XS510是两路CAN, XS510是CAN-1路, 为高时通, XS509是CAN-2路, 为 s低时通。默认为低, 是XS509通, 当PD1管脚控制切换;
外部串口收发模块: D52部分;
电机模块: K2;
为了保证CAN网的可靠性, 并在错误出现时尽快定位错误设备, 找出错误原因, 规范规定了看门狗稳定性保证措施, 两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障; 当计数器达到给定的超时值时, 触发一个中断或产生系统复位, 以防止程序意外跑飞。这样为系统提供了更高的安全性、 时间的精确性和使用的灵活性。
3.2 软件设计
软件设计主要包括上位机和下位机的编写, 上位机用的VC++平台,下位机用嵌入式IAR EWARM平台。
( 1) 上位机
由于串口调试助手不具备通用性、 局限性太大, 很多时候不能满足设备的要求, 因而此处上位机采取新的方法, 重新编写界面, 不但更加美观, 同时对下位机CAN的设置也更加清晰明了, 让用户一目了然, 使用起来十分方便。
( 2) 下位机
下位机中CAN节点通信主要包括: 串口初始化、 CAN初始化、 CAN报文转换为串数据和串数据转换为CAN报文四部分。下面就各部分作简要描述, 以便大家在实际应用中参考。
在进行通信时, 主控芯片 STM32F103 接收到 CAN 网的数据时, 先转换成串口数据, 然后再发出去给上位机串口, 串口的数据在界面中显示出来。同理接收到串口发送的数据时, 先转换成 CAN 数据, 再发出去给 CAN 网, 能够用周立功的 CAN 卡进行监视。CAN 的转换能够为原样显示, 也能够转换其它进制, 如八、 十进制等, 此处 CAN 设置为原样转换。即 CAN 来的数据, 在串口上是原样显示, 串过来的数据在CAN上原样显示。这里帧 ID 也是原样传输的。
串初始化程序:
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
CAN初始化设置:
#define USART_FRAME_HEAD 0xFE
#define USART_FRAME_HEAD1 0xFF
if((UsartRxBuffer[i].Data[0]) == USART_FRAME_HEAD) //设置CAN
{ //此处举例帧格式
if(UsartRxBuffer[i].Data[5] == 0xFE) {TxMessage.IDE = CAN_ID_STD;} //扩展帧
else if(UsartRxBuffer[i].Data[5] == 0xFE) { TxMessage.IDE = CAN_ID_EXT; } //标准帧
}
CAN转换成串:
if (RxMessage.IDE == CAN_ID_STD) //标准帧
UsartTxBuffer[i].Data[3] = (uint32_t)RxMessage.StdId & 0xFF;
UsartTxBuffer[i].Data[2] = (uint32_t)(RxMessage.StdId >> 8) & 0x07;
UsartTxBuffer[i].Data[1] = 0;
UsartTxBuffer[i].Data[0] = 0;
else {… } //扩展帧
for(j=0; j<CAN_Data->DataLength; j++)
UsartTxBuffer[i].Data[(UsartTxBuffer[i].DataLength++)+4] = CAN_Data->Data[j];
串转换成CAN:
if ( (UsartRxBuffer[i].Data[0]) == USART_FRAME_HEAD1 )
j = Get_Free_CANTxBuffer();
for (k=5; k<UsartRxBuffer[i].DataLength; k++)
{
CANTxBuffer[j].Data[k-5] = UsartRxBuffer[i].Data[k];
}
CANTxBuffer[j].DataLength = UsartRxBuffer[i].DataLength;
软件流程如下图2所示:
图 2 软件流程图
此方法的流程图能够分三部分: 开始部分是初始化程序, 串口中断程序是对串口数据的处理转换部分, CAN中断程序是对CAN数据的处理转换部分。
4 结束语
数据通信在嵌入式系统的应用中占有重要地位, CAN与串口的互相通信也越来越重要, 这种转换方法功能明确、 结构简单、 具有很强的通用性和实用性, 特别对于CAN的特性设置和两路CAN的切换, 使得用户能够根据自己的需要随意更改。上位机界面也很美观和实用。同时由于加入看门狗程序, 使得通信更加稳定、 可靠, 而且成本很低, 足以满足用户系统的各种要求。由于这一CAN通信技术具有模块化特点, 因此可适用于多种嵌入式系统中的数据通信.
参 考 文 献
[1]饶运涛.现场总线CAN原理与应用技术[M].北京: 北京航天航空出版社, .20~166.
[2]王田苗.嵌入式系统设计与实例开发[M].北京:清华大学出版社, .
[3]吴志伟,丁铂.USB-CAN-RS232总线转换电路设计与实现[J].国外电子元器件, (6):31-34.
CAN- Serial Conversion Communication Based On The CAN2.0 Standard
Yu Sumei Cai Xiang bao
School of electrical science and engineering , Nanjing University of Posts & Telecommunications, Nanjing 210003
Abstract: The field bus is computer network in the field of automation, which has become the hotspot in the development of automation technology. CAN bus is a kind of field bus, and communication conversion between CAN and serial is achieved by voltage conversion in hardware circuit and data conversion in software programming. Here we carry out double CAN function to ensure the high stability.
Key words: CAN bus, CAN set, Double CAN, Serial RS232 , Watchdog
作者简介: 于素梅( 1987-) , 南京邮电大学电子与通信工程专业研究生, 研究方向为光网络通信与移动通信。通信地址: 南京市新模范马路66号, 电话: Email:
展开阅读全文