你的位置:大电流电感 > 交流中心

基于单片机的某车型CAN总线系统设计

2020-03-08 07:55:23      点击:
上一篇:基于nRF905模块和C8051F单片机的无线收发系统设计

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*/