基于CAN2. 0标准的CAN-串转换通信技术研究于素梅蔡祥宝(南京邮电大学电了科学与工程学院,南京210003)摘要:现场总线是自动化领域的计算机网络,已成为当今自动化领域技术发展的热点CAN总线是现场 总线的一种,它与串口之间的通信,是通过硬件电路的电平转换,和软件设计的数据处理实现的此方法 实现了双CAN功能,提高了通信的可靠性关键词:CAN总线;CAN设置;双CAN;串口RS232;看门狗1引言CAN (Controller Area Network)总线又称控制器局域网,是Bosch公司在现代汽车技术中领先推出 的一种多主机局部网它是一种串行通信网络,支持分布式实时控制,最大传输速度可达IMbit/s,最大 传输距离为10kmCAN规范已被ISO国际标准组织制订为国际标准,即CAN标准,现在最常用的是2. 0标准, 分为2. 0A^2. 0Bo其区别仅在通信数据位数,前者是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/so字节发送帧结构:按发送顺序依次为1个起始位,8个信息位,1个停止位串口发送数据步骤:先设置CAN,设置完把设置值回发给串口,串口接收到数据后表示CAN已设置完成,可 以进行数据通信,然后再发送数据。
当帧头为FE时表示设置CAN ,为FF时表示进行数据通信如串口发FE F0 Fl EF FE FE EF,则设置CAN,同时会把这组数据发给串口,串口接收到这组数之后,才可以进行CAN- 串转换通信设置CAN时串口发送数据为下表一所示:此处CAN波特率可有十个选择(如表A),因为要实现CAN的正常通讯,通讯节点之间设置的波特 率必须相同所以用户可以根据自己的需要,设置自己的波特率表1设置CAN的数据帧头DATA0DATA1DATA2DATA3DATA4OxFE波特率设置(见表A)OxFl: CANT 路OxFO: CAN-2 路OxFE:单滤波OxEF:双滤波OxFE:只听模式OxEF:正常模式DATA5DATA6DATA7OxFE:标准帧OxFE:远程帧用户自定义OxEF:扩展帧OxEF:数据帧A)波特率DATA 1设置:OxFO:5k0xF5:125kOxFl:10k0xF6:250k0xF2:20k0xF7:500k0xF3:50k0xF8:800k0xF4:100k0xF9:IM3软硬件设计3.1硬件设计电原理图如下图1:OSC32 INcsca n\RKI-- 20VR PF-i- 21read 17 —write 18 GN» [9+33V ?2PA" g_24- 25£5 STM32F103VBT6PE2/TRCECKVDDJ PE3/TRACED0VSSJ PE4/TRACED1 PEI PE5/TRACED2 PEO:99GND12pF D5_OSC32_OW3?3 V _6— PE6/TRACED3 PB9.7—25MHZ pS RSTJtaPI r init可 5 I INITIIA8DBV-5 ....4 D5_RST_CPU PA2 __PA? 26GNTD 27C524D3_GNU312jrnCANLCAN-GbD J7G6K-2F-5VCON3~ MMBT9013LT1XS508JC0N3R500R500R500R500K2B o」I4虻师层 佬忍? r>5_R«T_“「)5 ITQGVBAT PB8PC13-ANTI_T&®WT(r PC14-OSC32JNPB7 PC15-OSC32ZOIPB6 VSS_5 PB5VDD15 PB4/JNTRS OSC_IN PB3/JTDC OSC_OUT PD7 NRST PD6PC0/ADCJN10 PD5 PCl/ADCZlNl 1 PD4 PC2/ADCJN12 PD3 PC3/ADCJN13 PD2 VSSA PD1VREF- PDOVREF+ PC12VDDA PCllPAO-WKUP PC10 PAI PA2PA14 PA3 —VSS_4VDD14PA4 PA13/JTMS/SW PA5 PA 12/C AN”PA6 PAI 1/CANIOC PA7 PA10/USART1 PC4 PA9/USART1 PC5 …PBO PB1 PB2/BOOT1PE7 PE8 PE9 PE10 PE11 PE12 PE13 PE14PE15 一一PB1O/USART3_TK15 PB11/USART3ZRK14 PB13 PB1234(u -7 (156104_GND—4S-+3.3v 50「_X_VREF+ T C521T C522luF lOnVREF- 36_ ds BoonP.A4 ?9PASPA6PA710uF/l^-MDS.BOOTO_92D5_PB6—9J_2 90D5_.INTRST;lL84D5ZJTDOR7PD686PD5 S5PD484P【)38?PD2 —82EDJ —8LPD0L L+3.3V11OU1RUN]3P5_TKn?3?8 D5ZRXD232.DlPB6®^+^()00-GNDTJ3EANHRXO-WLCANC79Z8—PA8PC9PC8PC7PC6 PD15 PD14 PD13 PD12 PD11PD10PD9PD8T1IHINVALI1:R1OU1FOFF+33VG6K-2F-5VG6K-2F-5V^2C_o^L-图1电原理图内部晶振:32KHZ;外部晶振:8MHZ;管脚配置:PA12为CAN_TX, PA11 为CAN_RX,PA10为USART_RX, PA11为USART_TX;复位电路模块:D54部分,MAX809R作为复位电路芯片;双CAN模块:D51部分,XS509和XS510是两路CAN, XS510是CANT路,为高时通,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 l;USART_InitStructure. USART_Parity 二 USART_Parity_No;USART InitStrueture. USART HardwareF1owControl = USART HardwareFlowControl_None;USART_InitStructure. USART_Mode 二 USART_Mode_Rx | USART_Mode_Tx;CAN初始化设置:ttdefine USART_FRAME_HEAD OxFEttdefine USART_FRAME_HEAD1 OxFFif ((UsartRxBuffer [i]. Data[0])二二 USART_FRAME_HEAD) //设置CAN{ //此处举例帧格式if (UsartRxBuffer[i]. Data[5] = OxFE) {TxMessage. IDE = CAN_ID_STD;} //扩展帧else if (UsartRxBuffer [i]. Data[5] == OxFE) { TxMessage. IDE = CAN ID EXT; } //标准帧}CAN转换成串:if (RxMessage. IDE == CAN_ID_STD) //标准帧UsartTxBuffer[i]. Data[3] = (uint32_t)RxMessage. Stdld & OxFF;UsartTxBuffer[i]. Data[2] = (uint32_t)(RxMessage. Stdld >> 8) & 0x07;UsartTxBuffer[i]. Data[l] = 0;UsartTxBuffer[i]. Data[0] = 0;else {•・• } //扩展帧。