MCP2515滤波配置.docx
- 文档编号:3295600
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:34
- 大小:496.28KB
MCP2515滤波配置.docx
《MCP2515滤波配置.docx》由会员分享,可在线阅读,更多相关《MCP2515滤波配置.docx(34页珍藏版)》请在冰豆网上搜索。
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();
}
/************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MCP2515 滤波 配置