CAN总线控制器的初始化程序
| ||
摘 要:介绍了can总线控制器sja1000芯片,并给出用c51语言编写sja1000总线控制器的初始化程序,方便使用者学习和掌握。 关键词:sja1000;can总线;c51;寄存器
0 引 言 随着自动化底层设备通信的需要,使现场总线技术得到了迅速的发展,各厂家都纷纷推出自己的总线控制器。sja1000 就是philips公司推出的一种高性能的can总线控制器,它得到了广泛的应用,但是有关sja1000初始化的文章比较少见,介绍的程序也不完全,这给使用者增加了难度。为了方便使用者掌握和使用can总线,本文作者成功地运用c51语言初始化sja1000为核心的can总线控制器,缩短了程序开发周期,提高了工作效率。
1 sja1000的新功能与内部结构 1.1 sja1000的主要新功能 sja1000是philips公司早期can总线控制器pca82c200的替代品,功能更强大,与pca82c200相比,具有许多优点,详见文献[4]. 1.2 sja1000的内部寄存器 sja1000的寄存器和管脚配置允许它使用于各种各样的集成的或分立的can 收发器,这使不同微控制器之间的接口能够被灵活运用。若要正确、灵活的运用sja1000,就必须了解内部寄存器的地址、功能和作用。sja1000内部寄存器的结构如表1所示(具体每一位的作用,请参阅文献[2]). 1.3 sja1000与89c52的连线原理 为了连接到主控制器,sja1000提供一个复用的地址/数据总线和附加的读/写控制信号,见图1.sja1000能被看作外围存储器并为主控制器映射i/o设备。为了保证系统的同步,本电路使用了一个24 mhz的晶振作为sja1000的振荡器,用它的7号引脚(clkout)作为89c52的时钟脉冲。本文中sja1000的片选由微控制器的p2.7口控制,其内部寄存器的地址由p0口和p2口共同来决定,p0口为低8位,p2口为高8位。 图1 原理接线图
2 程 序
缓冲器的寄存器和一部份ram的地址窗口,就象是外围的寄存器。 sja1000初始化的流程图如图2所示。 为了让工程技术人员更加深入的学习和使用can总线,这里完整的给出了sja1000的初始化程序。 程序如下: #define crxbyte[0x8000] // 控制寄存器地址 #define cmrxbyte[0x8001] // 命令寄存器地址 #define srxbyte[0x8002] // 状态寄存器地址 #define irxbyte[0x8003] // 中断寄存器地址 #define acrxbyte[0x8004] // 验收码寄存器地址 #define amrxbyte[0x8005] // 验收屏蔽寄存器地址 #define btr0xbyte[0x8006] // 总线定时寄存器0地址 #define btr1xbyte[0x8007] // 总线定时寄存器1地址 #define ocrxbyte[0x8008] // 输出控制寄存器地址 #define trxbyte[0x8009] // 测试寄存器地址 #define transbuffer1xbyte[0x800a] // 发送缓冲器 #define transbuffer2xbyte[0x800b] #define transbuffer3xbyte[0x800c] #define transbuffer4xbyte[0x800d] #define transbuffer5xbyte[0x800e] #define transbuffer6xbyte[0x800f] #define transbuffer7xbyte[0x8010] #define transbuffer8xbyte[0x8011] #define transbuffer9xbyte[0x8012] #define transbuffer10xbyte[0x8013] #define rxbuffer1xbyte[0x8014] // 接收缓冲器 #define rxbuffer2xbyte[0x8015] #define rxbuffer3xbyte[0x8016] #define rxbuffer4xbyte[0x8017] #define rxbuffer5xbyte[0x8018] #define rxbuffer6xbyte[0x8019] #define rxbuffer7xbyte[0x801a] #define rxbuffer8xbyte[0x801b] #define rxbuffer9xbyte[0x801c] #define rxbuffer10xbyte[0x801d] #define cdrxbyte[0x801f] // 时钟频分寄存器 #include “at89x52.h” #include “stdio.h” #include “math.h” #include “intrins.h” #include “ctype.h” #include “mylib.h” #include “absacc.h” void init­_can(void) // 初始化sja1000主控制器子函数 { cr=0x01; // 控制寄存器为复位 cdr=0; // 设置时钟分频器 acr=0; // 验收码寄存器 amr=0xff; // 验收屏蔽寄存器 btr0=0x31; // 总线定时寄存器0 btr1=0x18; & |
文章版权归西部工控xbgk所有,未经许可不得转载。