引 言
随着信息技术的飞速发展,32位ARM微控制器以其低功耗、高性能以及小体积等特性,得到了广泛的应用。在汽车、消费娱乐、仪器仪表、工业控制、海量存储、网络、安保和无线等领域,随处可见其应用实例。因而,基于ARM的技术方案是最具市场前景和市场优势的解决方案。
现场总线是当前工业通信领域中应用最广的技术之一。作为现场总线之一的CAN总线,以其高性能、高可靠性以及灵活的设计越来越受到人们的重视,越来越多的ARM微控制器带有CAN控制器。Philips 2000系列ARM微控制器是基于ARM7的集成有2个或4个CAN控制器的微控制器,在工业通信网络中有广泛的应用。
1 CAN总线的硬/软件设计简述
1.1 硬件设计
LPC22000系列ARM内置CAN控制器,每一个CAN控制器都与SJA1000有相似的寄存器结构,只是寄存器访问由8位字节访问转变为32位双字访问,因而使得硬件连接相对变得简单。CAN总线驱动器使用82C250或TJA1050。为增强节点的抗干扰能力,CAN控制器与总线驱动器可不直接相连,而足通过高速光耦6N137连接。光耦部分采用的两个电源应隔离,故采用电源隔离模块。
1.2 软件设计
CAN节点的基本软件设计包括CAN节点初始化、报文发送、报文接收3部分。在这3部分程序的基础上可编出CAN总线通信的一般应用程序。当然,要将CAN总线应用于通信任务比较复杂的系统中,还需要编写CAN总线异常处理、验收滤波设置等内容。
2 验收滤波器的设置及工作原理
当CAN控制器接收一完整的标识符时,将通知验收滤波器。验收滤波器响应这个信号,并读出标识符,与AF(验收滤波)RAM中的标识符表格进行匹配,以决定接收或放弃此帧信息。
AF RAM是一个容量为512×32位(2 KB)的RAM。通过软件设置,可在RAM中存放1~5个标识符表格。图1为一个完整的AF RAM内部表格分布。
为方便编程实现,把AF RAM的内容按32位模式排列,每个32位称为一个"cell"。表格就是cell的集合。前两种表格中每个cell包含2个标识符,且配置时每个cell中高位标识符小于低位标识符,否则会引起验收滤波器执行失败。接下来的2个表格,每一对范围或每一个标识符占用1个cell,而合法的扩展标识符范围表格必须以偶数个cell出现。每个表格均需按升序排列,每种表格可根据应用需要适当裁减。
3 验收滤波编程实现
程序用C语言编制,在ADS1.2开发环境下通过JTAG接口进行实时调试、仿真和下载,并在实际应用中得到了验证。要说明的是,Fullcan模式应用较少,程序未涉及它的设置;设置了独立标准标识符和标准标识符范围表格,对标准ID{1,2,0x10,0x20}和指定范围{{90<=ID<=100}及{0x300<=ID<=0X400}}的信号进行接收,独立扩展标识符表格和扩展标识符范围表格未设置。需要设置时,可参考前两种表格的设置程序。
在CANREG.H中,定义验收滤波模式寄存器结构如下:
另有如下寄存器地址定义:
另有如下定义:
②初始化一个独立标准标识符表格的内容。
③初始化一个标准标识符组表格的内容。
④用独立标准标识符表格内容初始化LUT的独立标准标识符表格。
⑤用标准标识符范围表格内容初始化LUT的标准标识符范围表格。
⑥模式2,启动全局验收滤波器。
在main.c中所含的4个相关函数略。
结 语
在SJA1000的应用中,验收滤波器只能对一些规律性较强的ID和个数较少的ID进行滤波。当需要设计复杂的验收滤波器时,以上的验收滤波模块能起到一定的作用。当然,在具体的应用场合,还需要考虑通信协议、CAN总线异常处理、CAN初始化、接收和发送等程序。
关键字:干扰 隔离 电源 程序
引用地址:
LPC2000系列CAN验收滤波的编程及应用
推荐阅读最新更新时间:2024-05-13 18:35
AVR单片机(ATMEGA16)外部中断程序
#include iom16v.h #include macros.h #define uchar unsigned char #define uint unsigned int #pragma interrupt_handler exter1:3 void delay(uint x) { uint y,z; for(y=x;y 0;y--) for(z=1111;z 0;z--); } void main(void) { uchar i,temp; MCUCR=0x00; //外部中断低电平触发 //MCUCR=0x08; //外部中断1下降沿触发 GI
[单片机]
程序员搅动方周大战 方舟子不是一个人在战斗
方舟子针对互联网企业360的安全问题展开的打假,已经从微博喊话演变成一场声势浩大的技术攻防战争。这场战争,掀开了中国互联网史上的新一页。以个人程序员为代表的人群率先站出来,从技术分析角度,把复杂的网络安全知识深入浅出的对大众进行了普及,促使越来越多的普通网民开始觉醒。 周鸿祎在微博表示方舟子的指责毫无根据,随便引用来源不明的不实材料。他没有想到,这一句话成为激发程序员们不断分析代码、抓包数据、逆向分析,寻找技术证据的导火索。有参与技术攻防的程序员表示,虽然360产品的安全性一直在圈内广受质疑,技术圈里的专业人士也基本不会使用360的产品,但这次方舟子站出来公开质疑,为程序员了一个施展拳脚的大好机会,所以都非常愿意借此机会将过去的猜
[家用电子]
开关式稳压电源工作原理
本文对各类开关电源的工作原理作一阐述。
传统的线性稳压电源虽然电路结构简单、工作可靠,但它存在着效率低(只有40% -50%)、体积大、铜铁消耗量大,工作温度高及调整范围小等缺点。为了提高效率,人们研制出了开关式稳压电源,它的效率可达85% 以上,稳压范围宽,除此之外,还具有稳压精度高、不使用电源变压器等特点,是一种较理想的稳压电源。正因为如此,开关式稳压电源已广泛应用于各种电子设备中。
一、开关式稳压电源的基本工作原理
开关式稳压电源接控制方式分为调宽式和调频式两种,在实际的应用中,调宽式使用得较多,在目前开发和使用的开关电源集成电路中,绝大多数也为脉宽调制型。因此下面就主要介绍调宽式开关
[电源管理]
诠释LED电源拓扑如何完美提升LED照明能效
随着发光二极管( LED )生产成本下降,使用也越来越普遍,应用范围由手持装置到汽车、建筑照明等领域。LED的可靠度高(使用寿命超过五万小时),效率佳(每瓦超过120流明),并具有近乎实时反应的特性,成为极具吸引力的 光源 。LED可在5奈秒的时间内产生光,而白热灯泡的反应时间则是200毫秒,因此汽车工业已将LED运用于煞车灯上。本文将针对LED特性以及驱动LED的折冲情形进行介绍,深入探讨适合 LED驱动 及调光的各种切换式电源拓扑,并详细说明相关优点。 稳定电流驱动LED维持固定亮度 LED驱动仍面临许多挑战,要维持固定的亮度,需要以稳定电流驱动LED,且不受到输入电压的影响,相较于白热灯泡单纯接上电池作为电源的挑
[电源管理]
51单片机长按键测试程序
#include reg52.h #include stdio.h /* 程序功能: 本程序用于测试4X4矩阵键盘; 且具有长按测能力. 当按下按键后,在LCD1602上显示出按下的键号如:K1 K2.... K16; 当按下一个按键 超过1S时间时,每250MS就返回一个键值;实现长按键的功能; 同时把键值通过串口发送到口上显示; 程序说明:这是一种传通的采用延时来进行按键扫描按键驱动与测试程序;这种方法在 实际项目编程中是不使用的。 用在教学中 ,学生刚开始学习单片机时。 注意:在此程序中只显示了K4长按凳时情况。若要想对其它铵键长按处理,只需要增加 相关的
[单片机]
优恩车载电源端口系统-24V电源系统静电放电及脉冲过电压防护 I
方案简介: 随着信息技术、汽车工业的大力发展,大量的车载电子设备应用于汽车之中如:车载影音娱乐系统、车载导航系统、防盗系统、自动温区空调系统等,众所周知,车载电子设备正常工作的前提条件就是需要拥有一个稳定的供电系统;由于汽车内部的电磁环境极其恶劣,汽车在正常运行时会产生大量的电磁干扰,通过耦合、传导、辐射的方式,传播到电源系统,影响汽车电子设备工作,最糟糕的是车辆本身所产生的干扰,如点火系统、发电机和整流器系统的干扰脉冲苛刻的要求;此方案采用符合 AEC-Q101 认证的车规级 TVS 管做防护,175℃的高温运行条件,适用于汽车应用领域的各种严酷条件,满足汽车专用测试最新标准 ISO7637-2、ISO16750-2 的测试需求
[嵌入式]
【盘点】照明用LED驱动电源关键词
由于 LED 具有环保、寿命长、光电效率高(目前光效已经达到100LM/W)、抗震等众多优点,近年来在各行业应用得以快速发展,理论上,LED的使用寿命在10万小时左右,但在实际应用过程中,有些LED灯具设计人员对 LED驱动 电源认识不足或选用不当或一味追求低成本,结果使LED灯具产品寿命大大缩短,使LED灯具的优势得不到很好的发挥。 LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。而LED驱动电源的输出则大多数为可随LED正向压降值变化而改变电压的恒定电流源。LED电源核心元件包括开关控
[电源管理]
TJA1020+51单片机实现的LIN总线通讯源程序(master+slave)
LIN mater的51单片机代码 /**************master*****************/ #include REGX52.H #include intrins.h sbit p31=P3^1; sbit k1=P1^0; sbit k2=P1^1; sbit p20=P2^0; unsigned char t; unsigned char sendflag, flag; void delay(unsigned int i) { while(i--); } void send() { // 同步 ID data1 data2 data
[单片机]