单片机和MCP2510的CAN总线通信模块设计Word格式.docx

上传人:b****2 文档编号:13561112 上传时间:2022-10-11 格式:DOCX 页数:17 大小:171.59KB
下载 相关 举报
单片机和MCP2510的CAN总线通信模块设计Word格式.docx_第1页
第1页 / 共17页
单片机和MCP2510的CAN总线通信模块设计Word格式.docx_第2页
第2页 / 共17页
单片机和MCP2510的CAN总线通信模块设计Word格式.docx_第3页
第3页 / 共17页
单片机和MCP2510的CAN总线通信模块设计Word格式.docx_第4页
第4页 / 共17页
单片机和MCP2510的CAN总线通信模块设计Word格式.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

单片机和MCP2510的CAN总线通信模块设计Word格式.docx

《单片机和MCP2510的CAN总线通信模块设计Word格式.docx》由会员分享,可在线阅读,更多相关《单片机和MCP2510的CAN总线通信模块设计Word格式.docx(17页珍藏版)》请在冰豆网上搜索。

单片机和MCP2510的CAN总线通信模块设计Word格式.docx

支持CANV2.0A/B;

具有SPI接口,支持SPI模式0,0和1,1;

内含3个发送缓冲器和2个接收缓冲器,可对其优先权进行编程;

具有6个接收过滤器,2个接收过滤器屏蔽;

具有灵活的中断管理能力;

采用低功耗CMOS工艺技术,其工作电压范围为3.0~5.5V,有效电流为5mA,维持电流为10μA;

工作温度范围为-40~+125℃。

1.2结构及工作原理

MCP2510有PDIP、SOIC和TSSOP三种封装形式。

图2是MCP2510的内部结构框图。

CAN协议机负责与CAN总线的接口,SPI接口逻辑用于实现同MCU的通信,而寄存、缓冲器组与控制逻辑则用来完成各种方式的设定和操作控制。

现结合其工作过程将各部分的功能、原理作一介绍。

(1)收发操作

MCP251O的发送操作通过3个发送缓冲器来实现。

这3个发送缓冲器各占据14字节的SRAM。

第1字节是控制寄存器TXBNCTRL,该寄存器用来设定信息发送的条件,且给出了信息的发送状态;

第2~6字节用来存放标准的和扩展的标识符以及仲裁信息;

最后8字节则用来存放待发送的数据信息。

在进行发送前,必须先对这些寄存器进行初始化。

(2)中断管理

MCP25lO有8个中断源,包括发送中断、接收中断、错误中断及总线唤醒中断等。

利用中断使能寄存器(CANINTE)和中断屏蔽寄存器(CANINTF)可以方便地实现对各种中断的有效管理。

当有中断发生时,INT引脚变为低电平并保持在低电平,直到MCU清除中断为止。

(3)错误检测

CAN协议具有CRCF错误、应答错误、形式错误、位错误和填充错误等检测功能。

MCP2510内含接收出错计数器(REC)和发送出错计数器(TEC)两个错误计数器。

因而对网络中的任何一个节点来说,都有可能因为错误汁数器的数值不同而使其处于错误一激活、错误一认可和总线-脱离3种状态之一。

2.MCP2510在智能节点中的应用实例

利用MCP2510和CAN总线收发器TJA1050可构成一个CAN总线分布式测控网络。

系统可包括一个主控制器和多个节点控制器,这种节点控制器可对电动机的电流、电压及周围的温度进行监控,其结构如图3所示。

这种网络拓扑结构采用了总线式结构和无源抽头连接,且结构简单、成本低,因而系统的可靠性较高。

其信息传输采用CAN通信协议,通信介质采用双绞线。

由于CAN总线是基于发送报文的编码,不对CAN控制节点进行编码,故系统的可扩充性比较好,同时增删CAN总线上的控制节点不会对系统的其余节点造成任何影响。

节点控制器的MCU可选用具有SPI接口的微处理器,也可采用不带SPI接口的微处理器。

本系统采用的是不带SPI接口的微处理器AT89C51。

AT89C51可通过P1口与CAN控制器的SPI接口直接相连,并用软件算法来实现SPI接口协议。

CAN总线收发器TJA1050则作为MCP25l0与物理总线的接口。

如果需要进一步提高系统的抗干扰能力,则可在MCP2510和TJAl050之间再加一个光电隔离器。

智能节点电路原理图如图4所示。

2.1软件设计

MCP2510正常工作之前,需要进行正确的初始化,包括设置SPI接口的数据传输速率、CAN通信的波特率、MCP2510的接收过滤器和屏蔽器以及发送和接收中断允许标志位等。

与SJA1000不同的是,单片机对MCP2510的接收缓冲器和发送缓冲器的操作,必须通过SPI接口用MCP2510内置读写命令来完成。

其读、写命令时序图如图5和图6所示。

本文中MCP2510主要采取中断模式进行总线数据的接收和发送。

整个系统主序提供两种中断:

定时器中断和外部中断。

定时器中断的中断子程序主要负责处理来自模拟通道AIN0~AIN7的A/D数据,向MCP2510发送“数据发送请求命令”以及发送数据。

外部中断的中断处理子程序主要包括CAN总线错误处理子程序和数据接收子程序。

2.2软件主体设计流程

软件主体设计流程如图7所示。

软件设计时需要注意以下问题:

①因为MCP2510在初始化完成后处于默认Config-uration模式下,所以就需要在MCP2510的初始化完后将其置为Normal模式,否则MCP2510将一直停留在Configuration模式下,不能正常进行工作。

将MCP2510置Normal模式可通过使用MCP2510内置的BitModify(位修改)4指令向CANCTRL控制字写入一个0字节来实现。

②在对MCP2510进行任何操作之前,都要由微处理器向MCP2510的片选CS输出一个低电平,使得MCP2510选通。

③在执行MCP2510的“读”操作时,发送完读指令及其地址码之后,仍然需要向MCP2510提供时钟,以接收“读”到的数据。

可以通过向MCP2510发送一个0字节来实现。

④在对MCP2510完成任意操作后,都要延时一段时间,使其有足够的时间来准备接收下次操作的命令,防止出现MCP2510“忙”的情况。

3.总结

CAN总线已被公认为是最有前途的几种现场总线之一。

因其性价比高、实现简单等突出优点深受越来越多的研发人员的青睐。

本文的智能节点可联结多个集散控制系统,其软硬件电路的设计方法同样适合于其他基于CAN总线的分布式控制系统的节点设汁。

<

上一页

//========CAN通信程序=======

#include<

PIC.h>

PIC16f87x.h>

mcp2510.h>

//MCP2510寄存器定义

//=========常数和变量定义=========

#defineREAD0x03//读MCP2510指令代码

#defineWRITE0x02//写MCP2510指令代码

#defineRESET0xC0//复位MCP2510指令代码

#defineRTS0x80//MCP2510请求发送指令代码

#defineSTA25100xA0//读MCP2510状态指令代码

#defineBITMOD0x05//MCP2510位修改指令代码

inta[12];

//SPI发送或接收数据寄存器

intb[8];

//发送或接收的数据

intc[8];

inti;

//临时变量

intcount;

//发送接收计数器

intcount1=0;

//fortest

intRecID_H=0;

intRecID_L=0;

intDLC=8;

voidSPIINT();

voidTMR1INT();

voidCCP1INT();

voidSPIEXCHANGE(intcount);

voidWAIT_SPI();

voidRESET2510();

intRD2510(intadress,intn);

voidWR2510(intadress,intn);

voidRTS2510(intRTSn);

intGETS2510();

voidBM2510(intadress,intmask,intdata);

voidSETNORMAL();

voidTXCOMPLETE(intadress);

voidTXMSG(intDLC);

intRXMSG();

voidINIT2510();

voidINIT877();

voidINITSPI();

voidACK();

voidwait();

//========主程序=======

main(void)

{

intl,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=0x04;

while

(1){

RXMSG();

TXMSG(8);

}

}

//========中断服务程序=======

//SPI中断服务子程序

voidSPIINT()

SSPIF=0;

a[i++]=SSPBUF;

//数据暂存a[]中

count-=1;

if(count>

0)SSPBUF=a[i];

//未发送完,继续

elseRE2=1;

//否则,片选信号置高电平

return;

//TMR1中断服务子程序

voidTMR1INT()

TMR1IF=0;

T1CON=0;

if(!

flag1){

TMR1H=0xfe;

//512μs脉冲宽度

TMR1L=0x00;

T1CON=0x01;

PORTD=0xff;

//输出所有通道

flag1=1;

else{

PORTD=0;

//CCP1中断服务子程序

voidCCP1INT()

CCP1IF=0;

//CCP2中断服务子程序

voidCCP2INT()

CCP2IF=0;

//中断入口,保

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1