• 1.33 MB
  • 2022-04-29 14:27:10 发布

最新CAN接口要点课件PPT.ppt

  • 62页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'CAN接口要点 CAN总线是德国BOSCH公司为解决现代汽车中众多的控制与测试仪器之间的数据交换而开发的一种串行数据通讯协议,是交通运载工具电气系统中应用较广的总线。现在向过程工业,机械工业,机器人,数控机床,传感器等方面发展。1993年11月,ISO正式颁布CAN为国际标准ISO11898。支持CAN协议的公司有Intel、Motorola、Philips、Siemens、NEC、Honeywell等公司。第十二章控制器局域网(CAN总线) 传输速率:可达到1Mbps(40米以内)传输距离:10千米(5kbps以下)支持的介质:铜线,光纤媒体访问控制方式:CSMA/冲突按优先权解决可挂接的最大节点数:110第十二章控制器局域网(CAN总线)基本特性: 数据帧结构数据帧组成第十二章控制器局域网(CAN总线) 远程帧结构帧间空间仲裁场控制场CRC场帧结束远程帧帧起始应答场帧间空间或过载帧远程帧的组成第十二章控制器局域网(CAN总线) 第十二章控制器局域网(CAN总线)错误帧结构错误帧的组成 第十二章控制器局域网(CAN总线)过载帧结构过载帧的组成 第十二章控制器局域网(CAN总线)CAN协议一般用来管理控制器、传感器、执行器和人机接口之间的数据传输;使用双绞线,给用户提供了一种低成本的系统连网方案。由于协议本身的优点,总线上的数据绝对不会发生冲突、数据遗失等现象,使得CAN广泛用于环境恶劣的工业现场和自动化生产线。LF24xx系列DSP控制器作为第一个具有片上CAN控制模块的DSP芯片,给用户提供一个设计分布式或网络化运动控制系统的无限可能。LF240X配置了一个符合CAN2.0B协议的CAN模块。 第十二章控制器局域网(CAN总线)CAN总线是一种多主总线,通信介质可以是绞线、同轴电缆或光导纤维,通信速率可达1Mbps,通信距离可达10km。CAN协议的个最大特点是废除了传统的站地址编码,而代之以对通信数据块进行编码,使网络内的节点个数在理论上不受限制。由于CAN总线具有较强的纠错能力,支持差分收发,因而适合高干扰环境,并具有较远的传输距离。CAN协议对于许多领域的分布式测控是很有吸引力的,目前CAN已成为IS011898标准,其特性如下:(1)CAN是一种有效支持分布式控制和实时控制的串行通信网络。 第十二章控制器局域网(CAN总线)(2)CAN协议遵循ISO/OSI模型,采用了其中的物理层、数据链路层与应用层。(3)CAN可以多主模式工作,本质上也是—种CSMA/CD方式,网络上任意一个节点均可以在任意时刻主动地向网络上的其它节点发送信息,而不分主从,节点之间的优先级之分,因而通信方式灵活。(4)CAN采用非破坏性位仲裁技术,优先级发送,可以大大节省总线冲突仲裁时间,在重负荷下表现出良好的性能。(5)CAN可以点对点、一点对多点(成组)及全局广播等几种方式传送和接收数据。 第十二章控制器局域网(CAN总线)(6)CAN的直接通信距离最远可达10km(传输速率为5Kbps);最高通信速率可达1Mbps(传输距离为40m)。(7)CAN上的节点数实际可达110个。(8)CAN数据链路层采用短帧结构,每一帧为8个字节,易于纠错。可满足通常工业领域中控制命令工作状态及测试数据的一般要求。同时,8个字节不会占用总线时间过长,从而保证了通信的实时性。(9)CAN每帧信息都有CRC校验及其它检错措施,有效地降低了数据的错误率。(10)CAN节点在错误严重的情况下,具有自动关闭的功能,使总线上其它节点不受影响。 第十二章控制器局域网(CAN总线)(11)信号调制解调方式采用NBZ(非归零)编码解码方式,并且采用插入填充位(位填充)技术。(12)数据位具有支配“0”(Dominantbit)和退让“1”(Recessivebit)两种逻辑值,采用时钟同步技术,具有硬件自同步和定时时间自动跟踪功能。CAN协议支持用于通信的4种不同的帧类型:•数据帧:从发送节点到接收节点传送数据。•远程帧:通过一个节点,使用相同的标志符请求一个数据帧的发送。•错误帧:在总线检测错误时,任意一个节点所发送的帧。 第十二章控制器局域网(CAN总线)•过载帧:在前面的和后面的数据帧之间提供一个额外的延时。CAN标准数据帧包含44到108位,而CAN扩展数据帧包含64到128位,另外,多达23个填充位可以插入到一个标准的数据帧中,多达28个填充位可以插入到扩展数据帧中,这要根据数据流的代码来定。数据帧的最大长度为131位,扩展数据帧的最大长度为156位。如下图所示,数据帧包含如下内容: •帧的起始;•包含标志符和被发送信息类型的仲裁域:•包含数据位数的控制域;•多达8个字节的数据;•循环冗余检查(CRC);•应答;•帧的结束CAN总线所具有的卓越性能、极高的可靠性,设计独特,特别适合工业设备测控单元相连。因此,备受工业界的重视,并已被公认为工业界最有前途的现场总线之一。第十二章控制器局域网(CAN总线) CAN总线一般用双绞线,传输速率取绝于总线长度,总线长度小于40m时,传输速率可达1Mb/s。CAN总线的连接如下图所示,DSP需要通过一个CAN收发器连接到CAN总线上。第十二章控制器局域网(CAN总线) 第十二章控制器局域网(CAN总线)12.1CANControllerArchitecture 第十二章控制器局域网(CAN总线)12.2MemoryMap 第十二章控制器局域网(CAN总线) 第十二章控制器局域网(CAN总线) 第十二章控制器局域网(CAN总线)CAN总线系统结构 第十二章控制器局域网(CAN总线)CAN总线接口部分电路举例 第十二章控制器局域网(CAN总线) 第十二章控制器局域网(CAN总线) 第十二章控制器局域网(CAN总线)CAN总线与单片机(AT89C52)的接口举例:SJA1000 PCA82C250第十二章控制器局域网(CAN总线) TMS320LF2407A,CAN总线接口应用程序举例:;------------------CAN初始化程序------------------CAN_INIT:LDP#DP_PF2LACLMCRBOR#0C0HSACLMCRB;IOPC6,IOPC7配置为特殊功能:CANRX,CANTX;------------------CAN位定时器配置--------------LDP#DP_CANSPLK#0040H,MDER;MD3=0,MD2=1邮箱2接收,3发送SPLK#0FFFFH,CAN_IFR;清全部CAN中断标志SPLK#07FFFH,LAM1_H;0则ID必须匹配SPLK#0FFFFH,LAM1_LSPLK#1000H,MCR;CCR=1改变配置请求第十二章控制器局域网(CAN总线) WAIT_CCE:BITGSR,#0BH;等待改变配置使能BCNDWAIT_CCE,NTC;当CCE=1时即可以配置BCR1,BCR2寄存器SPLK#0001H,BCR2;波特率预分频寄存器SPLK#0033H,BCR1;波特率=1MLACLMCRAND#0EFFFHSACLMCR;CCR=0改变配置结束请求WAIT_NCEE:BITGSR,#0BHBCNDWAIT_NCEE,TC;只有CEE=0时,寄存器BCR2,BCR1配置才成功第十二章控制器局域网(CAN总线)DSP、CAN总线接口应用程序举例(续) ;-----------------写CAN邮箱内容前寄存器设置----------------LDP#DP_CANSPLK#0040H,MDER;不使能邮箱,邮箱2设为接收方式SPLK#0103H,MCR;CDR=1,数据区改变请求;----------------------------写CAN邮箱内容-------------------LDP#DP_CAN2SPLK#2447H,MSGID2H;设置邮箱2的控制字及ID;IDE=0,AME=0,AAM=0;标准方式为MSGID2H[12~2]SPLK#0FFFFH,MSGID2LSPLK#02H,MSGCTRL2;设置控制域;数据长度DCL=8,RTR=0数据帧SPLK#00000H,MBX2A;邮箱2信息初始化第十二章控制器局域网(CAN总线)DSP、CAN总线接口应用程序举例(续) ;---------------------写CAN邮箱内容后寄存器设置---------------SPLK#0480H,MCR;DBO=1,ABO=1,STM=0SPLK#04CH,MDER;ME3=0,MBX3发送,ME2=1接收SPLK#07FFFH,CAN_IMR;中断MBX3使能,MBX2使能,高中断优先级SPLK#0FFFFH,CAN_IFR;清全部中断标志RET;==================================================================第十二章控制器局域网(CAN总线)DSP、CAN总线接口应用程序举例(续)CAN初始化程序结束 ;---------------------------------------------------;CANMB_INT子程序GISR1LDP#0E0H;保护现场LACCPIVR,1ADD#PVECTORSBACC;跳转到相应服务子程序;---------------------------------------------------CANMB_ISR:……CLRCINTMRET第十二章控制器局域网(CAN总线) 特性RS-485CAN-bus成本低高网络特性单主网络多主网络容错机制无多重错误处理和检错机制总线利用率低高节点错误的影响大无通讯距离<1.5km<10km通讯速率低高第十二章控制器局域网(CAN总线)CAN总线和RS-485的比较 校园网计算机二级C语言培训教案第三讲35 1、位运算符(~、<<、>>、&、^、|)2、位运算注意事项(1)对象只能是整数或字符型数据。(2)进行位运算前,一定要先将数据转换成二进制数。(3)各个位运算符的优先级注:字符型数据参与位运算时,采用其ASCII码进行运算。第九节位运算36 3、位运算的规则(1)~:0变1,1变0。(2)<<:a<>:a>>i表示a向右移动i位,左补符号位。(4)&:a&ba、b对应的二进制位,同时为1,则结果即为1,否则为0。(5)|:a|ba、b对应的二进制位,只要有一个为1,则结果即为1,否则为0。(6)^:a^ba、b对应的二进制位,相同为0,不同为1。注意:<<左移一位表示乘以2;>>右移一位表示除以237 (7)位数不同的运算数之间的运算规则a将两个运算数右端对齐b再将位数短的一个运算数往高位扩充,即:无符号数和正整数左侧用0补全,负数左侧用1补全,然后对补齐后位数相等的两个数按位进行位运算38 本章考点:考点考核几率分值printf函数(难点)100%3~4putchar函数60%1~2scanf函数(难点)100%3~4getchar函数60%1~2第二章数据输出与输入39 第一节数据输出1、printf函数的一般格式:printf(格式输出控制,输出列表)(1)格式输出控制:需用一对双引号括起来,双引号内包含“格式说明”和“普通字符”两部分。(2)输出列表:需要输出的数据,多个数据之间用逗号隔开。printf(“%d,%on”,m,n);printf(“m=%d,n=%on”,m,n);40 2、格式说明“格式说明”由“%”和格式字符组成,如%d,%c,更多格式说明请参考P34,表2-1。它的作用是把输出数据转换为指定格式输出。注:在printf函数中,若格式说明的个数少于输出项的个数,多余的输出项则忽略不输出,这是二级C考试中经常出现的题目,(参考P34,例2)41 3、普通字符普通字符会原样输出,转义字符需要输出对应的字符。注:printf函数输出数据时,学生做题很容易忽略普通字符的输出。在二级C考试中,这类题目常出现。例:main(){inta,b;a=10;b=15;printf("a+b=%d",a+b);}42 说明:(1)可以在%和格式字符之间加入一个整数来控制输出数据所占的宽度,如果整数指定的宽度大于实际输出数据的宽度,数据的输出采用右对齐的方式,左边自动补空格;反之,则以输出数据的实际宽度输出。输出语句输出结果printf(“%d”,258);258printf(“%2d”,258);258printf(“%4d”,258);□258printf(“%f”,1.25);1.250000printf(“%10f”,1.25);□□1.25000043 (2)当在%和格式字符f之间加入“整数1.整数2”来控制输出数据的格式时,“整数1”用于指定输出数据占的总宽度,“整数2”用于指定输出实数的小数部分的个数,当输出数据的小数个数多余“整数2”指定的个数时,截去多余的数据,并对截去的第一位小数做四舍五入处理,当输出数据的小数个数少于“整数2”指定的个数时,在小数的右边添0补足。输出语句输出结果printf(“%4.4f”,3.15);3.1500printf(“%7.4f”,3.15);□3.1500printf(“%2.0f”,3.15);□344 (3)如果在输出的八进制前添加0,或在输出的十六进制前添加0x,可在%号和格式字符0和x之间插入#号(注意:#号对其他格式字符通常不起作用)。输出语句输出结果printf(“%o”,207);317printf(“%#o”,207);0317printf(“%#x”,207);0xce45 特别说明:如果要输出“%”时,则应该在格式控制中用两个连续的“%”,即“%”来表示,也就是在格式控制中出现两个连续的“%”,则此时“%”不再用来代表格式说明。例如:printf(“%%d”,258);不会输出整数258,在屏幕上看到的结果为“%d”。因为“%%”会输出一个“%”,“d”会按原样输出,这时因为没有格式说明,整数258无法输出到屏幕上46 4、数据输出实例(已知inta=66;floatb=123.56;)通过以下各输出语句,讲解输出函数的各种格式。(1)printf("%d",a);66(2)printf("%3d",a);□66(3)printf("%-3d",a);66□(4)printf("%f",b);123.560000(5)printf("%7.2f",b);□123.56(6)printf("%-7.2f",b);123.56□(6)printf("%c",a);B(7)printf("%x",a);4247 5、putchar函数格式为:putchar(c)这里的c只能是字符型变量或字符型常量,即putchar函数只能输出字符型数据。例如putchar(‘C’)知指输出一个大写字母C到大屏幕上48 1、scanf函数的一般格式:scanf(格式输入控制,输入数据列表)格式输入控制与printf函数的格式输出控制相同。输入数据列表必须是一个或者是多个合法的地址表达式。scanf(“%d”,&a);scanf(“%f”,&a);scanf(“%c”,&a);参考书39页表2-5第二节数据输入函数49 2.说明:(1)当从键盘中输入多个数值数据时,输入数值数据之间用分隔符(包括空格符、制表符和回车符,但是不包括逗号)隔开。例如:intx,y,z;scanf(“%d%d%d”,&x,&y,&z);如对x、y、z三个整型变量分别输入10、20、30,则数据的输入格式如下:10<间隔符>20<间隔符>30<回车>50 (2)在输入控制中,格式说明的类型与输入项的类型应该一一对应匹配。如果类型不匹配,系统并不给出出错信息,但不能得到正确的输入数据。当输入长整型数据(long)时,必须使用%ld格式;输入double数据时,必须使用%lf或%le,否则不能得到正确数据。(3)与printf相似,在scanf函数中的格式字符前可以用一个整数指定输入数据所占的宽度,但对实数不能指定小数的位数。51 (4)在输入控制中,格式说明的个数与输入项的个数应该相同。如果格式说明的个数少于输入项的个数,系统自动结束输入,多余的数据没有被读入,但可以作为下一个输入操作的输入数据;如果格式说明的个数多余输入项的个数,系统同样自动结束输入。例如:对于如下输入语句:intx,y,z;scanf(“%d%d”,&x,&y,&z);如采用如下的输入形式:10<间隔符>20<间隔符>30<回车>,由于在输入控制中只有两个格式说明%d,则只能对x和y变量分别输入10和20,而30不能被读入,只能作为以后其他输入的输入数据。52 (5)跳过输入数据的方法。可以在格式字符与%之间加入一个“*”使输入过程跳过输入的数据。例如如下程序:intx,y,z;scanf(“%d%*d%d%d”,&x,&y,&z);如采用如下的输入形式:10<间隔符>20<间隔符>30<间隔符>40<回车>,则系统会把10赋给变量x,跳过数据20,把30赋给变量y,把40赋给变量z。53 (6)若在scanf函数的输入控制中含有其他的字符,则在输入时要求按一一对应的位置原样输入这些字符。例如:intx,y,z;scanf(“x=%dy=%dz=%d”,&x,&y,&z);要求按如下的形式输入:X=10<间隔符>y=20<间隔符>z=30<回车>54 3注意:(1)scanf的输入分隔符不包含逗号,因此在使用键盘输入数据时,不能以逗号作为分隔符。如果需要以逗号作为分隔符,则应该在格式控制字符串中使用逗号,例如:scanf(“%d,%d,%d”&x,&y,&z);注意:在以上三个%d之间有逗号隔开。按要求输入格式如下:10,20,30<回车>55 (2)一般情况下,scanf的格式控制字符串中不要包含其它非格式控制符,否则往往容易让人混淆。也就是说,在scanf中只使用格式控制符,可以简化操作。列如:scanf(“%d%d%d”&x,&y,&z);注意:在scanf的双引号中除了有3个%d外,没有其他任何字符。按要求如数格式如下:102030<回车>也可以输入一个数据就使用一个回车符号:10<回车>20<回车>30<回车>56 3)使用scanf时,如果数据输入未能完成,则程序一直等待键盘输入,此时用户应该完成数据输入。许多初学者在未输入数据的情况下回车,程序没有任何反映,好象死机了一样。这样是没有输入数据的缘故,只要用户输入数据即可。57 (4)使用scanf给变量赋值和直接使用赋值语句给变量赋值,都能使变量的值发生改变,但二者具有本质的区别。使用赋值语句给变量赋值,是将某一个固定的值在程序源代码中写死,当源代码编译成可执行程序(即用户软件)后,用户无法改变变量的值,每次执行的结果均相同。而使用scanf给变量赋值,是在程序运行过程中,使用键盘动态的给变量赋值,这样当生成可执行程序后,用户可以根据自身的需求,给变量赋不同的值,得到不同的运行结果。58 总结scanf函数的注意事项(1)输入数值型数据时,各数值间的分隔符可以是:空格、Tab、回车。(2)输入字符型数据时,空格、Tab、回车都会被认为是字符,而不是分隔符。(3)“格式输入控制”中的普通字符,在输入数据时一定要原样输入。(4)跳过输入数据,在%和格式字符之间加一个“*”。59 4、数据输入实例(已知charc1,c2;intc,d,e;)(1)scanf("%d%d%d",&c,&d,&e);输入:5<空格>6<空格>7<回车>输入:567<回车>输入:5<回车>6<回车>7<回车>//以上三种输入方式,c、d、e的值分别都为5、6、7。(2)scanf(“%d,%d,%d”,&c,&d,&e);输入:5,6,7<回车>若输入第一个数据后,使用了任意一种分隔符,则只确定输入了c的值为5,d和e为本身的初始值,若没有初始值,则为不定值。注:在C语言中,没有指定值的任何类型的变量,在输出时为不定值。60 (3)scanf(“%d%*d%d%d”,&c,&d,&e);输入:2<空格>3<空格>4<空格>5<回车>//c、d、e的值分别为2、4、5(4)scanf("%c%*c%*c%c",&c1,&c2);输入:a<空格>b4<回车>//c1、c2的值分别为a、4(5)scanf("%2d%d%d",&c,&d,&e);输入:123<空格>456<回车>//c、d、e的值分别为12、3、456(6)scanf("%d",&c,&d,&e);输入:1<空格>2<空格>3<回车>//c的值为1、d、e为不定值61 谢谢大家62'