1课程设计课程名称车载总线题目名称学生学院专业班级学号学生姓名指导教师20年月日2摘要:通过iCAN协议,设计单片机对SJA1000连接,进行控制收发器TJA1050的收发,通过iCAN-4050数字I/O产品进行流水灯输出试验。关键词:CAN总线、SJAl000、TJA1050、AT89C521引言CAN(ControllerAreaNetwork)是控制器局域网,主要用于各种设备检测及控制的现场总线。CAN总线是德国BOSCH公司20世纪80年代初为解决汽车中众多控制与测试仪器间的数据交换而开发的串行数据通信协议。这是一种多主总线,无论是在高速网络还是在低成本的节点系统,应用都很广泛。由于采用了许多新技术及独特的设计,与一般的通信总线相比,CAN总线的数据通信具有突出的可靠性、实时性和灵活性,其主要特点如下:●通信方式灵活,可以多主方式工作,网络上任意一个节点均可以在任意时刻主动向网络上的其他节点发送信息,不分主从。●CAN节点只需对报文的标识符滤波即可实现点对点、点对多点及全局广播方式发送和接收数据,其节点可分成不同的优先级,节点的优先级可通过报文标识符进行设置,优先级高的数据最多可在134μs内传输,可以满足不同的实时要求。●CAN总线通信格式采用短帧格式,每帧字节数量多为8个字节,可满足一般工业领域中控制命令、工作状态及测试数据的要求,同时,8个字节不会占用总线时间过长,保证了通信的实时性。●采用非破坏性总线仲裁技术,当多个节点同时向总线发送信息出现冲突时,优先级低的节点会主动退出数据发送,而优先级高的节点可不受影响地继续传输数据,大大节省了总线冲突仲裁时间,在网络重载的情况下也不会出现网络瘫痪。●直接通信距离最大可达10km(速率在5kb/s以下),最高通信速率可达1Mb/s(此时距离最长为40m);节点数可达110个,通信介质可以是双绞线、同轴电缆或光导纤维。●CAN总线采用CRC检验并可提供相应的错误处理功能,保证数据通信的可靠性,其节点在错误严重的情况下具有自动关闭输出功能,使总线上其他节点的操作不受影响。32CAN总线系统结构由于CAN总线采用多主方式工作,所以具有与DCS(分布式控制系统)不一样的拓扑结构。其控制系统由计算机和智能节点组成,如图1所示。该系统最大的特点是所有的节点都能以平等的地位挂接在总线上。1个总线节点通常至少包括3部分:控制节点任务的单片机、总线控制器及总线驱动器。本文主要介绍CAN总线智能节点的简单设计。智能节点由89C5l型单片机、SJA1000型总线控制器、82C250型总线驱动器及PC构成。在实际应用中可以连接不同的传感器件,完成数据的采集和传输。3硬件电路设计4协议控制器向收发器的TxD引脚输出一个串行的数据流收发器的内部上拉功能将TxD引脚置为逻辑高电平即总线输出驱动器在开路时是无源的在隐性状态中见图2.3CANH和CANL输入通过典型内部阻抗为25k的接收器连接入网络偏置到Vcc/2的电平电压另外如果TxD是逻辑低电平将激活总线的输出级并在总线上产生一个显性信号电平见图2.3输出驱动CANH由Vcc提供一个源输出而CANL则向GND提供一个下拉输出图2.2用TJA1050方框图作为一个例子如果没有总线节点发送一个显性位则总线处于隐性状态如果一个或多个总线节点发送一个显性位总线就会覆盖隐性状态而进入显性状态线与特性接收器比较器将差动的总线信号转换成逻辑电平信号并在RxD输出总线协议控制器将接收到的串行数据流译码接收器比较器总是激活的即当总线节点发送一个报文时它同时监控总线这个功能可以用于支持CAN的非破坏性逐位仲裁策略典型的总线采用一对双绞线考虑到ISO11898中定义的线性拓扑结构总线两端都端接一个120的额定电阻这就要求总线额定负载是60终端电阻和电缆阻抗的紧密匹配确保了数据信号不会在总线的两端反射5整个系统电源采用+5V电源输入,上电复位芯片(CAT810L)可保证上电时正确的启动系统。微处理器采用PHILIPS的P89C52单片机,该系列单片机是80C51微控制器的派生器件,采用先进的CMOS工艺制造,指令系统与80C51完全相同。CAN控制器采用PHILIPS的SJA1000,SJA1000是一款独立的控制器,用于汽车和一般工业环境中的控制器局域网络。它是PHILIPS半导体PCA82C200CAN控制器(BasicCAN)的替代产品。而且,它增加了一种6新的工作模式(PeliCAN),这种模式支持具有很多新特性的CAN2.0B协议,是目前市面上用的最广的一款CAN控制器。该电路中采用了隔离CAN收发器模块,以确保在CAN总线遭受严重干扰时控制器能够正常运行CAN总线接口设计:4软件设计在软件编写之前需先确定SJA1000的基地址及复位引脚,然后正确的初始化SJA1000,填写要发送的CAN报文,使能发送请求,即可进行CAN自发自收实验。本例程仅为简单的自发自收CAN报文程序,如图1.5所示为操作SJA1000自发自收流程图,其中加阴影框内是必需的初始化部分。7程序的总体流程图:8SJA1000c初始化9传输框图:10中断接受框图:4.1网络通信规则CAN总线为多主工作方式,网络上任一节点均可在任意时刻主动向网络上其他节点发送信息而不分主从,通信方式灵活。为禁止总线冲突,CAN总线采用非破坏性总线仲裁技术,根据需要将各个节点设定为不同的优先级,并以标识符ID标定,其值越小,优先级越高。总线的节点之间可以进行实时相互通信,当1个节点需要接收另1个节点的数据时,只需把其代码寄存器的内容设置成和另1节点的标识符一致即可。如果对于标识符和其代码寄存器的内容设置不一致,则节点所发的数据不予理会。4.2SJAl000的工作模式设置SJAl000有二种工作模式:复位模式和工作模式。在复位模式下可对接收代码、接收屏蔽、总线时序寄存器O和1及输出控制寄存器进行设置。一般在CAN初始化时完成对以上寄存器的设置,当CAN进入工作模式后,它们的值就不再变化。在工作模式下可进行数据的发送和接收。特别要注意的是:当硬件复位或控制器掉线时会自动进入复位模式,这样就不能11进行正常的CAN通信,这就要求对复位位进行监控。当发生硬件复位或控制器掉线而进入复位模式时,要求把复位位置为0并进入工作模式,这样CAN就能进行正常发送和接收。4.3基于C语言的软件编程//main函数:voidmain(void){//CPU初始化SJA_CS=0;//CAN总线片选有效SJA_RST=0;//软件复位SJA1000delaynms(3);SJA_RST=1;//alowvoltagemakeitresetTJA_CS=0;//打开TJA1050spin//---------mcu中断部分设置--------IT0=0;//外部中断0电平触发EX0=1;//打开外部中断0EA=1;//打开总中断//-----------------//------CAN初始化-----SJA_CS=1;//片选无效,进入设置内容的操作CAN_init();//SJA1000初始化_nop_();_nop_();CAN_TXD();while(1){TBSR6=0xfe;CAN_TXD1();TBSR6=0xfd;CAN_TXD1();TBSR6=0xfb;12CAN_TXD1();TBSR6=0xf7;CAN_TXD1();TBSR6=0xef;CAN_TXD1();TBSR6=0xdf;CAN_TXD1();TBSR6=0xbf;CAN_TXD1();TBSR6=0x7f;CAN_TXD1();}}//SJA1000初始化:voidCAN_init(void){//SJA1000的初始化ucharJudge;ucharACRR[4];ucharAMRR[4];ACRR[0]=0x00;ACRR[1]=0x07;ACRR[2]=0x09;ACRR[3]=0x03;//接收代码寄存器,节点1AMRR[0]=0x00;AMRR[1]=0X00;AMRR[2]=0x00;AMRR[3]=0x03;//接收屏蔽寄存器。全部接收主机发送的信息do{MODR=0x01;Judge=MODR;13}while(!(Judge&0x01));//.0=1---resetMODRe,进入复位模式,以便设置相应的寄存器//防止未进入复位模式,重复写入//----------复位模式下的设置---------------/*1.时钟分频寄存器设置*/CDR=0xc8;//CDR.3=1--时钟关闭,.7=0---basicCAN,.7=1---PeliCAN,旁路输入比较器,//只有RX1起作用,TX1管脚14输出模式,/*2.总线定时寄存器*/BTR0=0x00;//总线波特率选择,总线定时寄存器。BTR1=0x1c;//总线波特率设定,500kb/s/*3.关CAN中断*/IER=0x01;//.0=1--接收中断使能;.1=0--关闭发送中断使能/*4.输出控制寄存器*/OCR=0x1a;//配置输出控制寄存器(本来是aa)CMR=0x04;//释放接收缓冲器/*5.验收码寄存器和验收屏蔽寄存器*/ACR=ACRR[0];ACR1=ACRR[1];ACR2=ACRR[2];ACR3=ACRR[3];//初始化标示码AMR=AMRR[0];AMR1=AMRR[1];AMR2=AMRR[2];AMR3=AMRR[3];//初始化掩码//-------------------------------------do{MODR=0x10;Judge=MODR;14}while(!(Judge&0x10));//确保进入自接收模式,AFM=0.SJA_CS=0;//片选有效,SJA开始工作}//SJA1000的初始化连接函数:voidCAN_TXD(void){ucharJudge;ucharTX_buffer[N_can];//N_can=13,1/4/8//初始化标示码信息/*1Byte帧信息*///addrTX_buffer[0]=0x83;//10000011.7=0扩展帧;.6=0数据帧;.3=1数据长度16D/*4Byte标识符字*/TX_buffer[1]=0x00;//本节点地址ID.28-ID.2117DTX_buffer[2]=0x01;//ID.20-ID.1318DTX_buffer[3]=0x27;//ID.12-ID.519DTX_buffer[4]=0xb8;//ID.4-ID.0XXX20D//初始化标示码信息//初始化发送数据单元/*3bytedata*/TX_buffer[5]=0x00;//Data.0TX_buffer[6]=0x00;//Data.1TX_buffer[7]=0x00;//Data.2//TX_buffer[8]=0x44;////TX_buffer[9]=0x55;////TX_buffer[10]=0x66;////TX_buffer[11]=0x77;////TX_buffer[12]=0x88;//EA=0;//关中断CMR=0x0C;//清除数据溢出状态位和释放接收缓冲器do{15Judge=SR;}while(Judge&0x10);//SR.4=1正在接收,等待do{Judge=SR;}while(!(Judge&0x08));//SR.3=0,发送请求未处理完,等待do{Judge=SR;}while(!(Judge&0x04));//SR.2=0,发送缓冲器被锁。等待//---------加载发送的数据------发送缓冲寄存器-------------TBSR=TX_buffer[0];TBSR1=TX_buffer[1];TBSR2=TX_buffer[2];TBSR3=TX_buffer[3];TBSR4=TX_buffer[4];TBSR5=TX_buffer[5];TBSR6=TX_buffer[6];TBSR7=TX_buffer[7];//16