




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单片机和MCP2510的CAN总线通信模块设计 单片机和MCP2510的CAN总线通信模块设计 CAN(Controller Area Network)总线,即控制器局域网。由于具有高性能、高可靠性以及独特的设计,CAN总线越来越受到人们的重视。德国的Bosch公司最初为汽车监控和控制系统设计了CAN总线,现在,其应用已面向过程工业、机械工业、纺织工业、农用机械、机器人、数控机床、医疗器械及传感器等领域发展。CAN总线已经形成国际标准,并已经公认为是最有前途的现场总线之一。CAN总线规范已经被国际标准化组织制订为国际标准ISO11898,并得到众多半导体器件厂商的支持,推出各种集成有CAN协议
2、的产品。CAN总线系统智能节点是网络上报文的接收和发送站,一般由单片机和CAN控制器或二者合二为一组成。 MCP25l0是Microchip公司生产的一种独立的可编程CAN控制器芯片。本文将介绍新型的独立CAN通信控制器MCP2510,并给出其在CAN总线系统智能节点中的应用实例。 1.MCP2510芯片介绍 MCP25lO是一种带有SPI接口的CAN控制器,DIP封装如图1所示。它支持CAN技术规范V2.OA/B,能够发送或接收标准的和扩展的信息帧,同时具有接收滤波和信息管理的功能。MCP2510通过SI接口与MCU进行数据传输,最高数据传输速率可达5 Mbps,MCU可通过MCP2510与
3、CAN总线上的其他MCU单元通信。MCP2510内含3个发送缓冲器和2个接收缓冲器,同时还具有灵活的中断管理能力,这些特点使得MCU对CAN总线的操作变得非常简便。 1.1 MCP2510的主要特点 支持CANV 2.0A/B; 具有SPI接口,支持SPI模式0,0和1,1; 内含3个发送缓冲器和2个接收缓冲器,可对其优先权进行编程; 具有6个接收过滤器,2个接收过滤器屏蔽; 具有灵活的中断管理能力; 采用低功耗CMOS工艺技术,其工作电压范围为3.05.5 V,有效电流为5 mA,维持电流为10A; 工作温度范围为-40+125。 1.2 结构及工作原理 MCP2510有PDIP、SOIC和
4、TSSOP三种封装形式。图2是MCP2510的内部结构框图。CAN协议机负责与CAN总线的接口,SPI接口逻辑用于实现同MCU的通信,而寄存、缓冲器组与控制逻辑则用来完成各种方式的设定和操作控制。现结合其工作过程将各部分的功能、原理作一介绍。 (1) 收发操作 MCP251O的发送操作通过3个发送缓冲器来实现。这3个发送缓冲器各占据14字节的SRAM。第1字节是控制寄存器TXBNCTRL,该寄存器用来设定信息发送的条件,且给出了信息的发送状态;第26字节用来存放标准的和扩展的标识符以及仲裁信息;最后8字节则用来存放待发送的数据信息。在进行发送前,必须先对这些寄存器进行初始化。 (2) 中断管理
5、 MCP25lO有8个中断源,包括发送中断、接收中断、错误中断及总线唤醒中断等。利用中断使能寄存器(CANINTE)和中断屏蔽寄存器(CANINTF)可以方便地实现对各种中断的有效管理。当有中断发生时,INT引脚变为低电平并保持在低电平,直到MCU清除中断为止。 (3) 错误检测 CAN协议具有CRCF错误、应答错误、形式错误、位错误和填充错误等检测功能。MCP2510内含接收出错计数器(REC)和发送出错计数器(TEC)两个错误计数器。因而对网络中的任何一个节点来说,都有可能因为错误汁数器的数值不同而使其处于错误一激活、错误一认可和总线-脱离3种状态之一。 2.MCP2510在智能节点中的应
6、用实例 利用MCP2510和CAN总线收发器TJA1050可构成一个CAN总线分布式测控网络。系统可包括一个主控制器和多个节点控制器,这种节点控制器可对电动机的电流、电压及周围的温度进行监控,其结构如图3所示。 这种网络拓扑结构采用了总线式结构和无源抽头连接,且结构简单、成本低,因而系统的可靠性较高。其信息传输采用CAN通信协议,通信介质采用双绞线。由于CAN总线是基于发送报文的编码,不对CAN控制节点进行编码,故系统的可扩充性比较好,同时增删CAN总线上的控制节点不会对系统的其余节点造成任何影响。节点控制器的MCU可选用具有SPI接口的微处理器,也可采用不带SPI接口的微处理器。本系统采用的
7、是不带SPI接口的微处理器AT89C51。AT89C51可通过P1口与CAN控制器的SPI接口直接相连,并用软件算法来实现SPI接口协议。CAN总线收发器TJA1050则作为MCP25l0与物理总线的接口。如果需要进一步提高系统的抗干扰能力,则可在MCP2510和TJAl050之间再加一个光电隔离器。 智能节点电路原理图如图4所示。 2.1 软件设计 MCP2510正常工作之前,需要进行正确的初始化,包括设置SPI接口的数据传输速率、CAN通信的波特率、MCP2510的接收过滤器和屏蔽器以及发送和接收中断允许标志位等。与SJA1000不同的是,单片机对MCP2510的接收缓冲器和发送缓冲器的操
8、作,必须通过SPI接口用MCP2510内置读写命令来完成。其读、写命令时序图如图5和图6所示。 本文中MCP2510主要采取中断模式进行总线数据的接收和发送。整个系统主序提供两种中断:定时器中断和外部中断。定时器中断的中断子程序主要负责处理来自模拟通道AIN0AIN7的A/D数据,向MCP2510发送“数据发送请求命令”以及发送数据。外部中断的中断处理子程序主要包括CAN总线错误处理子程序和数据接收子程序。 2.2 软件主体设计流程 软件主体设计流程如图7所示。软件设计时需要注意以下问题: 因为MCP2510在初始化完成后处于默认Config-uration模式下,所以就需要在MCP2510的
9、初始化完后将其置为Normal模式,否则MCP2510将一直停留在Configuration模式下,不能正常进行工作。将MCP2510置Normal模式可通过使用MCP2510内置的BitModify(位修改)4指令向CANCTRL控制字写入一个0字节来实现。 在对MCP2510进行任何操作之前,都要由微处理器向MCP2510的片选CS输出一个低电平,使得MCP2510选通。 在执行MCP2510的“读”操作时,发送完读指令及其地址码之后,仍然需要向MCP2510提供时钟,以接收“读”到的数据。可以通过向MCP2510发送一个0字节来实现。 在对MCP2510完成任意操作后,都要延时一段时间,
10、使其有足够的时间来准备接收下次操作的命令,防止出现MCP2510“忙”的情况。 3.总结 CAN总线已被公认为是最有前途的几种现场总线之一。因其性价比高、实现简单等突出优点深受越来越多的研发人员的青睐。本文的智能节点可联结多个集散控制系统,其软硬件电路的设计方法同样适合于其他基于CAN总线的分布式控制系统的节点设汁。上一页 / =CAN通信程序= #include #include #include / MCP2510寄存器定义 / =常数和变量定义= #define READ 0x03 / 读MCP2510指令代码 #define WRITE 0x02 / 写MCP2510指令代码 #def
11、ine RESET 0xC0 / 复位MCP2510指令代码 #define RTS 0x80 / MCP2510请求发送指令代码 #define STA2510 0xA0 / 读MCP2510状态指令代码 #define BITMOD 0x05 / MCP2510位修改指令代码 int a12; / SPI发送或接收数据寄存器int b8; / 发送或接收的数据int c8; / 发送或接收的数据int i; / 临时变量int count; / 发送接收计数器int count1=0; / for testint RecID_H=0;int RecID_L=0;int DLC=8;void
12、 SPIINT();void TMR1INT();void CCP1INT();void SPIEXCHANGE(int count);void WAIT_SPI();void RESET2510();int RD2510(int adress,int n);void WR2510(int adress,int n);void RTS2510(int RTSn);int GETS2510();void BM2510(int adress,int mask,int data);void SETNORMAL();void TXCOMPLETE(int adress);void TXMSG(int
13、DLC);int RXMSG();void INIT2510();void INIT877();void INITSPI();void ACK();void wait();/ =主程序= main(void) int l,detect=0; SSPIE=1; TMR1IE=1; CCP1IE=1; CCP2IE=1; PEIE=1; ei(); / 开中断 INIT877(); / 初始化PIC16F877芯片 INITSPI(); / 初始化SPI接口 INIT2510(); / 初始化MCP2510芯片 flag1=0; flag2=0; CCP1CON=0x05; CCP2CON=0x0
14、4; while(1) RXMSG(); TXMSG(8); / =中断服务程序= / SPI中断服务子程序 void SPIINT() SSPIF=0; ai+=SSPBUF; / 数据暂存a中 count-=1; if(count0) SSPBUF=ai;/ 未发送完,继续 else RE2=1; / 否则,片选信号置高电平 return;/ TMR1中断服务子程序 void TMR1INT() TMR1IF=0; T1CON=0; if(!flag1) TMR1H=0xfe; / 512 s 脉冲宽度 TMR1L=0x00; T1CON=0x01; PORTD=0xff; / 输出所有通
15、道 flag1=1; else flag1=0; PORTD=0; T1CON=0; return;/ CCP1中断服务子程序 void CCP1INT() CCP1IF=0; T1CON=0x01; return;/ CCP2中断服务子程序 void CCP2INT() CCP2IF=0; T1CON=0x01; return;/ 中断入口,保护现场,判中断类型 void interrupt INTS() di(); if(TMR1IF) TMR1INT(); / 定时器TMR1中断 else if(CCP1IF) CCP1INT(); / 电压过零捕捉中断1 else if(CCP2IF)
16、 CCP2INT(); / 电压过零捕捉中断2 else if(SSPIF) SPIINT(); / SPI接口中断 ei();/ =子程序= / 启动SPI传送 void SPIEXCHANGE(count) int count; if(count0) / 有数据可送? i=0; RE2=0; / 片选位置低电平 SSPBUF=ai; / 送数 else ; / 否则,空操作,并返回 return;/ 等待SPI传送完成 void WAIT_SPI() do ; while(count0); / 当count!=0时,等待 to add CLRWDT return;/ 对MCP2510芯片进
17、行复位 void RESET2510() a0=RESET; count=1; SPIEXCHANGE(count); / 送复位指令 WAIT_SPI(); return;/ 读取从地址adress开始的寄存器中的数据,共n个,存放在数组bn中 int RD2510(adress,n) int adress; int n; int j; a0=READ; a1=adress; for(j=0;jn;j+) aj+2=0; count=n+2; / 指令、地址和要得到的数据量n SPIEXCHANGE(count); WAIT_SPI(); for(j=0;jn;j+) bj=aj+2;/ 数
18、据存到数组b中 return;/ 向从地址adress开始的寄存器写入数据,共n个,数据存放数组bn中 void WR2510(adress,n) int adress; int n; int j; a0=WRITE; a1=adress; for(j=0;jn;j+) aj+2=bj; count=n+2; / 指令、地址和要写入的数据量n SPIEXCHANGE(count); WAIT_SPI(); return;/ MCP2510芯片请求发送程序 void RTS2510(RTSn) int RTSn; a0=RTSRTSn; count=1; SPIEXCHANGE(count);
19、/ 发送MCP2510芯片,请求发送指令 WAIT_SPI(); return;/ 读取MCP2510芯片的状态 int GETS2510() a0=STA2510; a1=0; count=2; SPIEXCHANGE(count); / 读取MCP2510芯片状态 WAIT_SPI(); b0=a1; / 状态存到数组b中 return;/ 对MCP2510芯片进行位修改子程序 void BM2510(adress,mask,data) int adress; int mask; int data; a0=BITMOD; / 位修改指令 a1=adress; / 位修改寄存器地址 a2=m
20、ask; / 位修改屏蔽位 a3=data; / 位修改数据 count=4; SPIEXCHANGE(count); WAIT_SPI(); return;/ 设置MCP2510芯片为正常操作模式 void SETNORMAL() int k=1; BM2510(CANCTRL,0xe0,0x00); / 设置为正常操作模式 do RD2510(CANSTAT,1); k=b0&0xe0; while(k); / 确认已进入正常操作模式 return;/ 对MCP2510进行初始化 void INIT2510() RESET2510(); / 使芯片复位 b0=0x02; b1=0x90;
21、b2=0x07; WR2510(CNF3,3); / 波特率为 125 kbps b0=0x00; b1=0x00; WR2510(RXM0SIDH,2); b0=0x00; b1=0x00; WR2510(RXF0SIDH,2); / RX0接收,屏蔽位为0,过滤器为0 b0=0x00; WR2510(CANINTE,1); / CAN中断不使能 SETNORMAL(); / 设置为正常操作模式 return;/ MCP2510芯片发送完成与否判断,邮箱号为adress void TXCOMPLETE(adress)int adress; int k=1; do RD2510(adress,1); k=b0&0x08; while(k); / 确认是否已发送完毕 to add CLRWDT return;/ 初始化PIC16F877芯片 void INIT877() PORTA=0; PORTB=0; P
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 毕业课题申报书范例
- 区级教师课题申报书
- 合同范本修订
- 合伙分红合同范本
- 微课题申报书
- 教改课题申报书怎么填
- 衔接课题申报书范文
- 员工持股合同范本
- 国家申报书课题名称结构
- 个人购酒合同范本
- GB/T 42828.1-2023盐碱地改良通用技术第1部分:铁尾砂改良
- 工资条(标准模版)
- 第四讲 搜索引擎检索
- 法语的发音规则及法语单词分类记忆
- 水库移民安置档案分类大纲与编号方案
- 卫生和微生物基础知识培训-
- 外径千分尺检定证书
- ICU轮转护士培训计划和手册
- GB/T 9787-1988热轧等边角钢尺寸、外形、重量及允许偏差
- GB/T 17614.1-2015工业过程控制系统用变送器第1部分:性能评定方法
- 财务工作督导检查记录表
评论
0/150
提交评论