表1、各终端的消息标识符
  采用CAN扩展帧的29位标识符进行定义,其中P为3位优先级;R为保留扩展位;8位的BW为报文类型代码;8位的BD为目标地址或报文类型扩展码;8位的BY为发送报文源地址。部分设备节点名称和分配地址如下:主驾驶员终端地址10、副驾驶员终端地址20、联合制动单元地址30。
2.2.2 各消息类型和命令值内容的定义
  驾驶员计算机终端对联合制动单元的控制消息内容为2个字节——命令类型和命令值。命令类型包括:状态查询命令(数据0x1,命令值0x0)、前/后驱制动命令(数据0x2/0x3,命令值0x0)、联合制动单元前/后驱制动信息确认(数据0x4/0x5,命令值0x0)等。
  联合制动单元提供给驾驶员计算机终端的消息内容包括:联合制动单元状态信息(7字节,分别为液力制动扭矩、机械制动扭矩、合成扭矩、速度以及紧急回路和正常油压的数值,以及正常制动回路油位和紧急制动回路油位的报警状态)、联合制动单元报警信息(2字节,分别为正常制动回路油位报警和紧急制动回路油位的报警)、联合制动单元制动返回消息(2字节,分别为收到的前驱或后驱制动命令的命令数据和命令值)等。
2.3软件设计(CAN总线通讯部分)
2.3.1初始化部分
  初始化前将CAN通用控制寄存器的最高位置1(复位模式)。完成后,回到操作模式。
  下面给出了CAN控制器的初始化程序:
  void  CAN_INIT ( void )
  {
  CANGCON = 0x80 ;  /*进入复位模式并且复位MOb*/
  while  ( ENFG == 1 ) ;  /*测试CANGSTA中的ENFG位是否为0*/
  CANGIE = 0xB0 ;  /*使能所有中断及接收、发送中断*/
  CANIE2 = 0xFF ;  /*MOb 0~7中断使能*/
  CANIE1 = 0x00 ;  /*MOb 8~14中断禁止*/
  CANBT1 = 0x02 ;  /*设置波特率为500kbps*/
  CANBT2 = 0x20 ;
  CANBT3 = 0x01 ;
  CANTCON = 0x8F ;  /*设置定时器预定标*/
  /*以“联合制动单元状态查询消息”为例*/
  CANPAGE = TX_PAGE ;  /*指定此消息的MOb页(寄存器中的高4位)*/
  CANCDMOB = 0x17 ;  /*禁止状态,IDE位为1表示扩展帧,数据长度代码为7*/
  CANIDT1 = 0x84 ;  /*标识符设置*/
  CANIDT2 = 0xB1 ;
  CANIDT3 = 0x18 ;
  CANIDT4 = 0xF2 ;
  CANIDM1 = 0xFF ;  /*标识符屏蔽设置*/
  CANIDM2 = 0xFF ;
  CANIDM3 = 0xFF ;
  CANIDM4 = 0xFF ;
  CANGCON = 0x02 ;  /*进入操作模式*/
  While  ( ENFG == 0 ) ;  /*测试CANGSTA中的ENFG位是否为1*/
  }
2.3.2消息的发送部分
  消息的发送均采用中断方式实现。首先通过设置CANPAGE寄存器来指定被发送的页数,将数据装载到CANMSG寄存器中,然后由CANCDMOB寄存器来控制发送动作,将消息发送出去,同时将触发CANSTMOB中的TXOK中断。
  下面以协议中的“联合制动单元状态查询命令”为例,给出了发送程序:
  void  CAN_TX ( void )
  {
  CANPAGE = TX_PAGE ;  /*指定此消息的MOb页(寄存器中的高4位)*/
  CANMSG = 0x01 ;  /*装载消息数据*/
  CANMSG = 0x00 ;  /*装载消息命令值*/
  CANCDMOB = 0x52 ;  /*发送状态,IDE位为1表示扩展帧,数据长度代码为2*/
  }
  void  CAN_TX_INTER ( void )  /*发送中断子程序*/
  {
  If  ( ( CANSTMOB & 0x40 ) == 0x40 )  /*发送中断*/
  {
  CANSTMOB & = 0xBF ;  /*清TXOK位*/
  CANCDMOB = 0x12;  /*停止发送*/
  }
  }
2.3.3消息的接收部分
  消息的接收同样采用中断方式实现。先设置CANPAGE寄存器来指定接收的页数,随后由CANCDMOB寄存器来控制接收动作,当有消息到达时,将触发CANSTMOB中的RXOK中断,消息中的数据将被装载到CANMSG寄存器中。
  下面以协议中的“接收联合制动单元状态信息”为例,给出了接收程序:
  void  CAN_RX ( void )
  {
  CANPAGE = RX_PAGE ;  /*指定此消息的MOb页(寄存器中的高4位)*/
  CANCDMOB = 0x97 ;  /*接收状态,IDE位为1表示扩展帧,数据长度代码为7*/
  }
  void  CAN_RX_INTER ( void )  /*接收中断子程序*/
  {
  If  ( ( CANSTMOB & 0x20 ) == 0x20 )  /*接收中断*/
  {
  CANSTMOB & = 0xDF ;  /*清RXOK*/
  For ( i = 0 ; i < 7 ; i++ )
  {
  MObData [ RX_PAGE ] [ i ] = CANMSG ;  /*装载数据*/
  }
  }
  }
3.结束语
      与目前同类型的单片机相比较,AT90CAN128在数据采集、PWM(快速PWM模式)等设计中都有其明显的优势,特别是内置了CAN控制器,这让它在现代自控领域的发展前景十分乐观。通过实践证明,该车载CAN总线系统运行良好,完全可以达到预期的功能。