MCP2515滤波配置.docx

上传人:b****5 文档编号:3295600 上传时间:2022-11-21 格式:DOCX 页数:34 大小:496.28KB
下载 相关 举报
MCP2515滤波配置.docx_第1页
第1页 / 共34页
MCP2515滤波配置.docx_第2页
第2页 / 共34页
MCP2515滤波配置.docx_第3页
第3页 / 共34页
MCP2515滤波配置.docx_第4页
第4页 / 共34页
MCP2515滤波配置.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

MCP2515滤波配置.docx

《MCP2515滤波配置.docx》由会员分享,可在线阅读,更多相关《MCP2515滤波配置.docx(34页珍藏版)》请在冰豆网上搜索。

MCP2515滤波配置.docx

MCP2515滤波配置

MCP2515的接收滤波功能相关的寄存器以及滤波逻辑

滤波寄存器

EXIDE:

0报文滤波仅用于标准帧

1报文滤波仅用于扩展帧

对扩展帧进行滤波的时候,EXIDE位必须设置为1,对标准帧滤波时设置为0

屏蔽寄存器

对标准帧滤波时,即对标准帧的11bit标识符按比特进行滤波;

对扩展帧进行滤波的时候,即是对扩展帧的29位标识符按比特进行滤波。

当新报文符合验收滤波条件并被载入接收缓冲器时,使能报文接收的滤波器编号将被

装载到RXBnCTRL寄存器FILHIT位中。

接收到的信息首先在RXB0中进行滤波匹配,不满足的话则到RXB1中进行滤波匹配。

只要满足一个滤波寄存器的条件,则接收该报文。

如果将RXB0CTRL寄存器的BUKT位置1,则将使能接收滚存功能(接收缓冲器0满之后可以将新接收到的数据滚存到缓存器1),打开接收滤波功能之后,如果缓冲器0已满,同时又收到一个符合缓冲器0滤波条件的报文,那么该报文将滚存到缓冲器1,不管是否满足缓冲器1的滤波条件。

2515位定时相关配置

标称比特率(NominalBitRate,NBR)定义为在不需要再同步的情况下,理想发送器每秒发送的位数,它可用下面的公式来表示:

标称位时间(NominalBitTime,NBT)(tbit)由互不重叠的段时间段组成(图5-1)。

因此NBT为下列时间段之和:

组成位时间的每个段都由时间份额(TQ)组成。

每个时间份额的长度取决于振荡器周期(tOSC)。

通常TQ为两个振荡器周期。

图5-2显示了如何从TOSC和TQ推导出位周期。

TQ的长度等于一个TQ时钟周期(tBRPCLK),利用称为波特率预分频器(BRP)的可编程预分频器对它进行编程设置。

以下公式对此进行了阐述:

#include

#include<2510.h>

#include

#include

#include

unsignedcharboard_addr=0x01;//接口板地址

unsignedcharcontroler_addr=100;//控制器地址

unsignedchartransmit_dat[13]={0x40,0x08,100,0x01,0x08,1,2,3,4,5,6,7,8};//can发送数据缓存

unsignedcharreceive_dat[13]={0};//can接收数据缓存

unsignedcharcnt=0;

unsignedcharm_data=0;

bitreport_register_inf_flag=0;

bitloop_register_over_flag=1;

unsignedcharcoderegister_inf[255]=

{

0x01,0x02,0xFF,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,

0x01,0x56,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,

0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,

0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,

0x01,0x02,0xFF,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,

0x01,0x02,0xFF,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,

0x01,0x02,0xFF,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,

0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,

0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,

0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,

0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,

0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,

0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06

};

voidmain()

{

unsignedcharregister_inf_cnt=0;

unsignedcharloop_cnt=0;

TMOD=0x11;

//使用定时器T0,设为16位定时器(工作方式1),晶振11.0592M,中断时间T=(2^16-19456)×12/11.0592=50ms

TH0=0x4C;//设置定时器T0初值19456=4C00H

TL0=0x00;

PT0=1;//设置定时器T0中断为高优先级

TR0=1;//定时0开始

ET0=1;//允许定时器T0中断

UP_DOWN=0;//选中内部ram和8255地址空间

Control_8255=0x90;//方式0,A口输入,B口输出,C口输出

/*

//使用定时器T1,设为16位定时器(工作方式1),晶振11.0592M,中断时间T=70ms

TH1=0x04;//设置定时器T1初值

TL1=0x00;

TR1=1;//定时1开始

ET1=1;//允许定时器T1中断

*/

IT1=0;//设置INT1为电平触发

EX1=1;//允许外部INT1中断(2510)

mcp2515_init();

init_filter(controler_addr,board_addr);

//ENTER_LOOP_MODE();//进入回环模式

//m_data=spi_read_register(CANCTRL);

EA=1;//开总中断

delay_1ms(200);

//transmit_dat[0]=PRIORITY5|TI_SignalBoardRegister;

//mcp2515_TX();

while

(1)

{

if(report_register_inf_flag==1)

{

if(loop_register_over_flag==1)

{

transmit_dat[0]=PRIORITY5|TI_RegisterInfReport;

transmit_dat[1]=0x08;

transmit_dat[2]=board_addr;

transmit_dat[3]=controler_addr;

transmit_dat[4]=0x07;

transmit_dat[12]=0xFF;

for(loop_cnt=1;loop_cnt<=4;loop_cnt++)

{

transmit_dat[5]=loop_cnt;//回路编号

for(register_inf_cnt=0;register_inf_cnt<51;register_inf_cnt++)

{

transmit_dat[6]=register_inf_cnt*5+1;

transmit_dat[7]=register_inf[register_inf_cnt*5];

transmit_dat[8]=register_inf[register_inf_cnt*5+1];

transmit_dat[9]=register_inf[register_inf_cnt*5+2];

transmit_dat[10]=register_inf[register_inf_cnt*5+3];

transmit_dat[11]=register_inf[register_inf_cnt*5+4];

mcp2515_TX();

}

register_inf_cnt=0;

}

//上报登记结束命令

transmit_dat[0]=PRIORITY5|TI_RegisterOver;

transmit_dat[1]=0x08;

transmit_dat[2]=board_addr;

transmit_dat[3]=controler_addr;

transmit_dat[4]=0x00;

mcp2515_TX();

report_register_inf_flag=0;

}

}

}

}

 

//=======================================================================================

//T0定时器中断服务程序,喂看门狗

//=======================================================================================

voidTimer0_Int()interrupt1using0

{

staticunsignedcharcount=0;

TR0=0;//定时0停止

ET0=0;//关闭定时器T0中断

//设置定时初值19456+5=4C05H(弥补中断响应及重新赋值间的时间间隔+5)

TH0=0x4C;

TL0=0x05;

UP_DOWN=0;

if(count%2==0)

{

PC_8255=0x00;

}

else

{

PC_8255=0x10;

}

count++;

TR0=1;//定时0开始

ET0=1;//允许定时器T0中断

}

 

//==========================================================================

//功能:

外部中断1,2510中断服务程序

//入口:

//出口:

//接收数据放在,receive_dat数组中

//==========================================================================

voidint1_can_RX()interrupt2using0

{

unsignedcharint_data;//中断标志位寄存器的值

unsignedcharbuffer_no;//接收到报文的缓冲区的编号

unsignedcharpriority,ti;

EX1=0;//关闭单片机外部中断1

//读取2510中断标志位寄存器

int_data=spi_read_register(CANINTF);

if(int_data!

=0xff)

{

//报文错误中断

if((int_data&0x80)!

=0)

{

spi_bit_modify(CANINTF,0x80,0x00);

}

//接收中断

if((int_data&0x01)!

=0||(int_data&0x02)!

=0)

{

if((int_data&0x01)!

=0)//RX0

{

buffer_no=0x00;

}

elseif((int_data&0x02)!

=0)//RX1

{

buffer_no=0x01;

}

spi_read_RX_buffer(receive_dat,buffer_no);

//清除接收中断标志位

spi_bit_modify(CANINTF,buffer_no+1,0x00);

/*从此处开始进行数据处理*/

priority=receive_dat[0]&0xE0;

ti=receive_dat[0]&0x1F;

if(priority==PRIORITY0)

{}

elseif(priority==PRIORITY1)

{}

elseif(priority==PRIORITY2)

{

if(ti==TI_BroadcastRegister)

{

//收到控制器广播的登记命令,接口板开始登记下面回路

}

}

elseif(priority==PRIORITY3)

{}

elseif(priority==PRIORITY4)

{}

elseif(priority==PRIORITY5)

{

if(ti==TI_SignalBoardRegister)

{

//收到控制器发送的“单接口板请求登记信息命令”,首先回复一个确认,然后待接口板下面回路登记完毕,开始上报登记信息

transmit_dat[0]=PRIORITY4|TI_Ack;

transmit_dat[1]=0x08;

transmit_dat[2]=board_addr;

transmit_dat[3]=controler_addr;

transmit_dat[4]=0x00;

mcp2515_TX();

report_register_inf_flag=1;

}

}

}

}

EX1=1;//打开单片机外部中断1

}

 

#ifndef__MAIN_H__

#define__MAIN_H__

sbitUP_DOWN=P1^3;

 

//===========================================

//宏定义

//===========================================

#defineTRUE1

#defineFALSE0

#definePA_8255XBYTE[0xE000]

#definePB_8255XBYTE[0xE001]

#definePC_8255XBYTE[0xE002]

#defineControl_8255XBYTE[0xE003]

//协议中can数据帧优先级定义

#definePRIORITY00x00

#definePRIORITY10x20

#definePRIORITY20x40

#definePRIORITY30x60

#definePRIORITY40x80

#definePRIORITY50xA0

//协议中TI类型码定义

#defineTI_BroadcastRegister0x00

#defineTI_Ack0x04

#defineTI_SignalBoardRegister0x11

#defineTI_RegisterInfReport0x12

#defineTI_RegisterOver0x13

 

#endif

 

#include

#include

#include<2510.h>

externunsignedchartransmit_dat[13];

staticunsignedcharspi_read_byte(void);

staticvoidspi_write_byte(unsignedcharout_byte);

 

unsignedcharcodeRTS[3]={SPI_CMD_RTS_TXB0,SPI_CMD_RTS_TXB1,SPI_CMD_RTS_TXB2};

#defineSTRAT_TRANSMIT(x)\

{\

sclk=0;scs=0;\

spi_write_byte(RTS[x]);\

scs=1;sclk=1;\

}

 

#defineSPI_RESET_2515()\

{\

sclk=0;scs=0;\

spi_write_byte(SPI_CMD_RESET);\

scs=1;sclk=1;\

}

 

/**************************************************************************************************

*@fnspi_bit_modify

*

*@briefspicommand,modify2515'sregisterbybit

*

*@paramaddr-register'saddress

mask-bitmask

dat-dattomodify

*

*@returnnone

**************************************************************************************************/

voidspi_bit_modify(unsignedcharaddr,unsignedcharmask,unsignedchardat)

{

sclk=0;scs=0;

spi_write_byte(SPI_CMD_BITCHANGE);

spi_write_byte(addr);

spi_write_byte(mask);

spi_write_byte(dat);

scs=1;sclk=1;

}

 

/**************************************************************************************************

*@fnspi_get_2515_status

*

*@briefspicommand,get2515's"ReadStatus"or"RXStatus"

*

*@paramcmd-2515spiinstruction(SPI_CMD_READ_STATUSorSPI_CMD_RX_STATUS)

*

*@returnstatusregister

**************************************************************************************************/

unsignedcharspi_get_2515_status(unsignedcharcmd)

{

unsignedcharstatus;

sclk=0;scs=0;

spi_write_byte(cmd);

status=spi_read_byte();

scs=1;sclk=1;

returnstatus;

}

 

/**************************************************************************************************

*@fnmcp2510_init

*

*@briefinit2515,configsomeregisters

*

*@paramnone

*

*@returnnone

**************************************************************************************************/

voidmcp2515_init(void)

{

//2510硬件复位

canrest=0;

delay_1ms(10);

canrest=1;

delay_1ms(10);

//软复位2510

SPI_RESET_2515();

SPI_RESET_2515();

//配置引脚控制和状态寄存器

spi_write_register(BFPCTRL,0x00);//RXnBF(禁止引脚功能)

spi_write_register(TXRTSCTRL,0x07);//TXnRTS引脚控制和状态寄存器

//配置位定时寄存器配置

spi_write_register(CNF3,0x02);

spi_write_register(CNF2,0xD0);

spi_write_register(CNF1,0x04);//100k

//spi_write_register(CNF1,0x31);//10k

//配置中断相关的寄存器

spi_write_register(CANINTE,0x83);//打开报文接收接收、报文错误中断

spi_write_register(CANINTF,0x00);

spi_write_register(EFLG,0x00);

//配置发送缓冲器的控制寄存器

spi_write_register(TXB0CTRL,0x03);

spi_write_register(TXB1CTRL,0x00);

spi_write_register(TXB1CTRL,0x00);

//配置接收缓冲器的控制寄存器

spi_write_register(RXB0CTRL,0x64);

spi_write_register(RXB1CTRL,0x60);

ENTER_NORMAL_MODE();

}

 

/************

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

当前位置:首页 > 小学教育 > 其它课程

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

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