宋富强++熊武++冯宇飞++彭思苑++黄海波
摘要:飞思卡尔MC9S12(X)单片机的控制器局域网(MSCAN)是一种通信控制器,介绍基于使用该单片机的MSCAN模块构建小型网络的研究,实现三块单片机的实时交互通信。三块单片机包括一块主控制器和两块辅控制器,系统将两块辅控制器挂在主控制器的CAN总线上,与主控制器进行数据交换。其中,数据包括采集的环境温度和用电压模拟的车速。
关键词:MC9S12(X);CAN总线;通信
中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2016)20-0210-03
CAN全称为Controller Area Network,即控制器局域网,是国际上应用最广泛的现场总线之一。最初,CAN是由德国的Bosch公司提出,被设计为汽车环境中的微控制器通信,在车载各电子控制装置ECU之间交换信息,形成汽车电子控制网络。本文按照CAN总线协议设计了一个小型的CAN总线网络,正文从硬件设计和软件流程来进行阐述。
1 硬件电路设计
1.1 CAN接口电路
本文采用TJA1050作为CAN总线的接口芯片,它是一种标准的高速CAN收发器,可以为总线提供差动发送性能和为CAN控制器提供差动接收性能。
TJA1050的3引脚和2引脚分别为电源的正极和负极,连接5V电源和地。1引脚和4引脚为CAN模块的发送和接收引脚,分别用于从CAN总线控制器中输入发送到总线上的数据和将从总线接收的数据发送给CAN总线控制器,连接单片机的PM1和PM0引脚。7引脚和6引脚连接到CAN总线的CANH和CANL线上,信号使用差分电压传送,因此两条信号线被称为CAN_L和CAN_H。8引脚是工作模式选定引脚,该CAN接口芯片一共有高速、斜率控制和待机3种工作模式,把该引脚直接接地可选择高速工作模式。在总线接口部分还要接一个120欧姆的匹配电阻。J_CAN是与CAN总线连接的接口。CAN总线接口电路见图1:
1.2 电源模块
电源模块采用LM2940稳压芯片,将电压从12V稳到5V。原理图中C11、C12、C13、C14、C15、C16分别为滤波电容,F11为滤波电感,D12是电源指示灯,防止指示灯被烧,串联一个1K的电阻。其中PAD02接MC9S12(X)单片机的71引脚PAD02,采用固定电压的AD转换输入。电源模块电路图见图2:
1.3 AD采集电路
本文所设计的CAN小型网络只用到两路AD采集。因此电路图中PAD00和PAD01分别接MC9S12(X)单片机的67脚和69脚,R44和R47采用1K的电阻,而R43和R46采用10K的电位器来进行分压调节。AD采集电路见图3:
1.4 温度传感器模块
设计中,我们用的温度传感器是DS18B20。用DS18B20有以下几个优点:①独特的单线接口方式,只需一个接口引脚即可通信;②可用数据线供电,电压范围:+3.0V—+5.5V;③测温范围:-55℃—+125℃,在-10℃—+85℃围内精度为范围内精度为+0.5℃,分辨率为0.0625℃;④通过编程可实现9-12位的数字读数方式。⑤多个DS18B20可以并联在惟一的三线上,实现多点测温。温度传感器模块原理图见图4:
1.5 LED显示模块
本设计的显示模块采用LCD12864液晶显示屏,显示的内容有两个辅控制器采集到的温度和经过两个辅控制器AD转换以及计算模拟出来的车速。经过液晶屏的显示,可以方便的知道CAN总线上的数据传输是否正确。LED显示模块原理图见5:
2 软件设计
2.1 MSCAN初始化程序的编写
初始化按照下列过程实现:
1)首先检测MSCAN是否处于工作模式;
2)进入初始化模式中,正在进行的任何发送或接收都会立即中止,与CAN总线失去同步。在进入初始化模式时,必须要保证MSCAN不在工作状态,否则中止正在发送的报文可能导致错误发生。在初始化模式中,虽然MSCAN被停止,但是其接口寄存器仍然可以访问;
1)设置相应寄存器,依次设置CAN总线波特率、接收滤波方式、标识符接收寄存器和标识符掩码寄存器;
2)使能CAN模块,设置运行模式(初始化、睡眠和工作三种模式)。MACAN初始化流程图见图6。
2.2 MSCAN发送程序的编写
MACAN用报文来发送数据,首先选择空闲的发送缓冲区,然后向该空闲缓冲区写入数据,最后设置改缓冲区的发送标志位来将报文发送至CAN总线上。因此,用户在发送报文缓存区写入数据前,只需要通过相应的寄存器(CANTBSEL)设置一个指针来访问任何一个缓冲区。此算法不仅简化了发送缓冲器选择功能,而且这种机制还使程序软件处理更为简单。
MSCAN的发送流程:
首先,在发送前要检测判是否存在可用缓冲区的寄存器(CANTDLG&7)是否为0。若该寄存器(CANTDLG&7=0),则说明三个缓冲区已满,并且报文未被发出。此时若继续选择向缓冲区装填数据,将导致先前发送的报文丢失。在没出现问题的情况下,寄存器CANTDLG&7的值都为1,即存在可用的缓存区。检测到CANTDLG&7=0,原因可能为:
①MSCAN还没来得及将报文发出;
②总线上的节点出现问题,没有及时应答,导致报文发送不成功。
⑴若没有可用的缓存区,检查硬件系统和程序是否出现问题,直到报文能顺利发出;
⑵若有可用的缓冲区,则使用对应的选择缓冲区语句“CANTBSEL=CANTFLG”,选择相应的发送缓冲区。若有多个缓冲区空闲时,选择的缓冲区的序号是最小的,即用“CANTBSEL=CANTFLG”和“CANTBSEL=1”语句,MSCAN会自动选择了第一个发送缓冲区。
接着,要向缓存区写入数据,具体有:CPU标识符、数据段长度和需要发送的数据。数据是以报文形式装入的,而且用何种方式写的报文,接收也会用同样的方式,并且还要检测发送或者接收数据是否有误。
最后,将已选择的缓冲区标记为发送,即置位发送标志“CANTFLG=CANTBSEL”,与此同时,TXE标志也会被清零。
此后MSCAN会自动把数据装入传送队列,传送成功后将TXE置1,若用户在先前使能发送中断,则在此这个过程中会产生一个发送中断。当然,在这个中断过程中,发送用户还可以继续加载数据到发送缓冲区并重新发送。
当然,在发送数据时也会出现同时有多个缓存区准备发送,这时候如果同时发送必然导致错误。为了解决这个问题,MSCAN模块就给每个缓存区分配了一个8位的优先级域,这就决定了在数据建立之前,用户首先要对此域写入优先级。通过判断域内的优先级即可判断数据的优先级,优先级的值越小,则表示此缓冲区的优先级越高。当MSCAN每次参与总线仲裁和发生发送错误时,都会进行内部的数据排列。若准备发送的缓冲区不止一个,则MSCAN模块会使用内部的优先级来决定先发送哪个缓冲区。
当用户有重要的数据需要发送时,就必须给该数据较高的优先级。如果MSCAN的三个缓存区都在发送数据。此时,就需要三个缓存区中优先级比较低的数据停止发送来让优先级比较高的数据先发送。如果优先级低的数据发送过程不能终止,用户就需要对相应的寄存器中的相应位进行设置(本单片机为CANTARQ寄存器中的ABTRQ位)来强行终止发送。
发送流程图见图7:
2.3 MSCAN 接收程序的编写
同MSCAN有3个发送缓冲区的发送机制类似,MSCAN有5个接收缓冲区,而且这5个接收缓冲区被交替映射到单个存储器区域CANRXFG中。同发送缓存区一样,这种机制也简化了应用软件的编写,提高了接收数据的效率。
接收已满标志CANRFLG寄存器的RXF位指示了前台接收缓冲区的状态,当缓冲区中有正确的报文被接收时就设置接收已满标志,即将RXF置1。报文的接收有两种方式:中断接收和查询接收。接收时,首先要检查每条报文的标识符是否通过滤波器。如果标识符通过了滤波器,就将有效的报文写入后台接收缓存器中,MSCAN将后台接收缓冲器中的报文内容转移到前台接收缓冲器中,并设置接收已满标志(CANRFLG寄存器的RXF位)。而接收报文时必须从前台接收缓冲器读取报文,接收完后,将接收器已满标志(CANRFLG寄存器的RXF位)清零来释放前台接收缓冲器。而背景台接收缓冲器接收到无效的报文时,该报文会被下一条覆盖。用户的中断服务程序可以把数据从前台缓冲区读出,并置位RXF标志以响应中断并释放前台缓冲区。
MSCAN接收流程:
①首先,要检测接收器已满标志(CANRFLG寄存器的RXF位),当接收器已满标志(CANRFLG寄存器的RXF位)置1时,表示接收缓冲器接收到了正确的报文;
②然后,检测 CAN协议报文的模式,读标识符,读取数据长度,读取数据;
③最后,清接收器已满标志(CANRFLG寄存器的RXF位),以便接收下一个报文。
注意:对报文的检测和读取一定要在清接收器已满标志(CANRFLG寄存器的RXF位)之前进行,否则该报文会被下一个报文覆盖,从而丢失信息。读取报文流程图见图8:
3 系统测试与总结
经过一段时间的研究与设计,终于将“利用飞思卡尔MC9S12(X)单片机构建CAN总线小型网络”这个课题做完并经过了测试。测试过程中,利用了CAN总线构建了3个节点的小型网络,实现了对温度和用电压模拟的速度这些数据进行了测量、传输和显示。测量工具有:示波器、万用表、温度计、秒表等。经过测试,利用飞思卡尔MC9S12(X)单片机CAN总线构建的小型网络工作状态良好,通信无误且具有实时性,达到了预期的目标。
参考文献:
[1]冯冲,段晓敏.飞思卡尔MC9S12(X)开发必修课[M].北京航空航天大学出版社,2014.
[2]罗峰,孙泽昌.汽车CAN总线系统原理、设计与应用[M].电子工业出版社,2010.