MCP2515滤波配置_第1页
MCP2515滤波配置_第2页
MCP2515滤波配置_第3页
MCP2515滤波配置_第4页
MCP2515滤波配置_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、MCP2515的接收滤波功能相关的寄存器以及滤波逻辑滤波寄存器EXIDE: 0报文滤波仅用于标准帧 1报文滤波仅用于扩展帧对扩展帧进行滤波的时候,EXIDE位必须设置为1,对标准帧滤波时设置为0屏蔽寄存器对标准帧滤波时,即对标准帧的11bit标识符按比特进行滤波;对扩展帧进行滤波的时候,即是对扩展帧的29位标识符按比特进行滤波。当新报文符合验收滤波条件并被载入接收缓冲器时,使能报文接收的滤波器编号将被装载到RXBnCTRL寄存器FILHIT位中。接收到的信息首先在RXB0中进行滤波匹配,不满足的话则到RXB1中进行滤波匹配。只要满足一个滤波寄存器的条件,则接收该报文。如果将RXB0CTRL寄存

2、器的BUKT位置1,则将使能接收滚存功能(接收缓冲器0满之后可以将新接收到的数据滚存到缓存器1),打开接收滤波功能之后,如果缓冲器0已满,同时又收到一个符合缓冲器0滤波条件的报文,那么该报文将滚存到缓冲器1,不管是否满足缓冲器1的滤波条件。2515位定时相关配置标称比特率(Nominal Bit Rate, NBR)定义为在不需要再同步的情况下,理想发送器每秒发送的位数,它可用下面的公式来表示:标称位时间(Nominal Bit Time, NBT)(tbit)由互不重叠的段时间段组成(图5-1)。因此NBT 为下列时间段之和:组成位时间的每个段都由时间份额(TQ)组成。每个时间份额的长度取决

3、于振荡器周期(tOSC)。通常TQ为两个振荡器周期。图5-2 显示了如何从TOSC 和TQ推导出位周期。TQ 的长度等于一个TQ 时钟周期(tBRPCLK),利用称为波特率预分频器(BRP)的可编程预分频器对它进行编程设置。以下公式对此进行了阐述:#include <reg52.h>#include <2510.h>#include <absacc.h>#include <intrins.h>#include <main.h>unsigned char board_addr=0x01;/接口板地址unsigned char contr

4、oler_addr=100;/控制器地址unsigned char transmit_dat13=0x40,0x08,100,0x01,0x08,1,2,3,4,5,6,7,8;/can发送数据缓存unsigned char receive_dat13=0;/can接收数据缓存unsigned char cnt=0;unsigned char m_data=0;bit report_register_inf_flag=0;bit loop_register_over_flag=1;unsigned char code register_inf255=0x01,0x02,0xFF,0x05,0x

5、06,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,0x

6、06,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,0

7、x06,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,0

8、x06,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,

9、0x06,0x01,0x02,0x03,0x05,0x06,0x01,0x02,0x03,0x05,0x06;void main() unsigned char register_inf_cnt=0; unsigned char loop_cnt=0; TMOD=0x11; /使用定时器T0,设为16位定时器(工作方式1),晶振11.0592M,中断时间T=(216-19456)×12/11.0592=50ms TH0=0x4C;/设置定时器T0初值194564C00H TL0=0x00; PT0=1;/设置定时器T0中断为高优先级 TR0=1;/定时0开始 ET0=1;/允许定时器

10、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_MOD

11、E();/进入回环模式 /m_data=spi_read_register(CANCTRL); EA=1;/开总中断 delay_1ms(200); /transmit_dat0=PRIORITY5| TI_SignalBoardRegister; /mcp2515_TX(); while(1) if(report_register_inf_flag=1) if(loop_register_over_flag=1) transmit_dat0=PRIORITY5 | TI_RegisterInfReport; transmit_dat1=0x08; transmit_dat2=board_ad

12、dr; transmit_dat3=controler_addr; transmit_dat4=0x07; transmit_dat12=0xFF; for(loop_cnt=1;loop_cnt<=4;loop_cnt+) transmit_dat5=loop_cnt;/回路编号 for(register_inf_cnt=0;register_inf_cnt<51;register_inf_cnt+) transmit_dat6=register_inf_cnt*5+1; transmit_dat7=register_infregister_inf_cnt*5; transmit

13、_dat8=register_infregister_inf_cnt*5+1; transmit_dat9=register_infregister_inf_cnt*5+2; transmit_dat10=register_infregister_inf_cnt*5+3; transmit_dat11=register_infregister_inf_cnt*5+4; mcp2515_TX(); register_inf_cnt=0; /上报登记结束命令 transmit_dat0=PRIORITY5 | TI_RegisterOver; transmit_dat1=0x08; transmi

14、t_dat2=board_addr; transmit_dat3=controler_addr; transmit_dat4=0x00; mcp2515_TX(); report_register_inf_flag=0; /=/ T0定时器中断服务程序,喂看门狗/=void Timer0_Int() interrupt 1 using 0static unsigned char count=0; TR0=0;/定时0停止 ET0=0;/关闭定时器T0中断/设置定时初值1945654C05H (弥补中断响应及重新赋值间的时间间隔5)TH0=0x4C;TL0=0x05;UP_DOWN = 0;if

15、(count%2=0)PC_8255 = 0x00;elsePC_8255 = 0x10;count+;TR0=1;/定时0开始ET0=1;/允许定时器T0中断/=/ 功能:外部中断1,2510中断服务程序/ 入口:无/ 出口:无/ 接收数据放在,receive_dat数组中/=void int1_can_RX() interrupt 2 using 0 unsigned char int_data;/中断标志位寄存器的值 unsigned char buffer_no;/接收到报文的缓冲区的编号 unsigned char priority,ti; EX1=0;/关闭单片机外部中断1 /读取

16、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; else if( (int_data&0x02)!=0 )/RX1 buffer_no=0x

17、01; spi_read_RX_buffer(receive_dat,buffer_no); /清除接收中断标志位 spi_bit_modify(CANINTF,buffer_no+1,0x00); /*从此处开始进行数据处理*/ priority=receive_dat0&0xE0; ti=receive_dat0&0x1F; if(priority=PRIORITY0) else if(priority=PRIORITY1) else if(priority=PRIORITY2) if(ti=TI_BroadcastRegister) /收到控制器广播的登记命令,接口板开始

18、登记下面回路 else if(priority=PRIORITY3) else if(priority=PRIORITY4) else if(priority=PRIORITY5) if(ti=TI_SignalBoardRegister) /收到控制器发送的“单接口板请求登记信息命令”,首先回复一个确认,然后待接口板下面回路登记完毕,开始上报登记信息 transmit_dat0=PRIORITY4 | TI_Ack; transmit_dat1=0x08; transmit_dat2=board_addr; transmit_dat3=controler_addr; transmit_dat

19、4=0x00; mcp2515_TX(); report_register_inf_flag=1; EX1=1;/打开单片机外部中断1#ifndef _MAIN_H_#define _MAIN_H_sbit UP_DOWN = P13;/=/ 宏定义/=#define TRUE 1#define FALSE0#define PA_8255 XBYTE0xE000#define PB_8255 XBYTE0xE001#define PC_8255 XBYTE0xE002#define Control_8255 XBYTE0xE003/协议中can数据帧优先级定义#define PRIORITY0

20、0x00#define PRIORITY10x20#define PRIORITY20x40#define PRIORITY30x60#define PRIORITY40x80#define PRIORITY50xA0/协议中TI类型码定义#defineTI_BroadcastRegister0x00#define TI_Ack 0x04#define TI_SignalBoardRegister0x11#define TI_RegisterInfReport0x12#define TI_RegisterOver 0x13#endif#include <reg52.h>#inclu

21、de <intrins.h>#include <2510.h>extern unsigned char transmit_dat13;static unsigned char spi_read_byte(void);static void spi_write_byte( unsigned char out_byte);unsigned char code RTS3=SPI_CMD_RTS_TXB0,SPI_CMD_RTS_TXB1,SPI_CMD_RTS_TXB2;#define STRAT_TRANSMIT(x) sclk=0;scs=0; spi_write_byt

22、e(RTSx); scs=1;sclk=1; #define SPI_RESET_2515() sclk=0;scs=0; spi_write_byte(SPI_CMD_RESET); scs=1;sclk=1; /* * fn spi_bit_modify * * brief spi command ,modify 2515's register by bit * * param addr- register's addressmask- bit maskdat- dat to modify * * return none */void spi_bit_modify(unsi

23、gned char addr, unsigned char mask, unsigned char dat)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;/* * fn spi_get_2515_status * * brief spi command ,get 2515's "Read Status" or "RX Status" * * param

24、 cmd - 2515 spi instruction (SPI_CMD_READ_STATUS or SPI_CMD_RX_STATUS) * * return status register */unsigned char spi_get_2515_status(unsigned char cmd) unsigned char status; sclk=0;scs=0; spi_write_byte(cmd); status=spi_read_byte(); scs=1;sclk=1; return status;/* * fn mcp2510_init * * brief init 25

25、15,config some registers * * param none * * return none */void mcp2515_init(void)/2510硬件复位canrest=0;delay_1ms(10);canrest=1;delay_1ms(10); /软复位2510SPI_RESET_2515();SPI_RESET_2515(); /配置引脚控制和状态寄存器spi_write_register(BFPCTRL,0x00);/RXnBF(禁止引脚功能)spi_write_register(TXRTSCTRL,0x07);/TXnRTS引脚控制和状态寄存器 /配置位定

26、时寄存器配置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(TXB0CT

27、RL,0x03);spi_write_register(TXB1CTRL,0x00);spi_write_register(TXB1CTRL,0x00); /配置接收缓冲器的控制寄存器spi_write_register(RXB0CTRL,0x64);spi_write_register(RXB1CTRL,0x60);ENTER_NORMAL_MODE();/* * fn mcp2510_TX * * brief transmit the data in global array "transmit_dat13",if the 2515's transmit *bu

28、ffer is full,then return * * param none * * return none */void mcp2515_TX(void)unsigned char TX_Buf_Number;/检测可用缓冲区if( ( spi_read_register(TXB0CTRL) & 0x08 )=0 )/使用发送缓冲器TX0TX_Buf_Number=0;else if( ( spi_read_register(TXB1CTRL) & 0x08 )=0 )/使用发送缓冲器TX1TX_Buf_Number=1;else if( ( spi_read_regist

29、er(TXB2CTRL) & 0x08 )=0 )/使用发送缓冲器TX2TX_Buf_Number=2;elsereturn;/都不可用,返回/装填数据spi_write_TX_buffer(transmit_dat, TX_Buf_Number);/启动发送 STRAT_TRANSMIT(TX_Buf_Number);unsigned char code mask_config8=0xC0,/* RXM0SIDH 对2bit滤波 */0x00,/* RXM0SIDL */0xFF,/* RXM0EID8 对8bit滤波 */0x00,/* RXM0EID0 */0x00,/* RXM

30、1SIDH */0x00,/* RXM1SIDL */0xFF,/* RXM1EID8 对8bit滤波 */0xFF,/* RXM1EID0 对8bit滤波 */;void init_filter(unsigned char controlerAddr,unsigned char boardAddr)unsigned char filter_config4;/进入配置模式ENTER_CONFIG_MODE();/配置验收滤波屏蔽寄存器spi_write_register_continue(mask_config, RXM0SIDH, 8);/配置BUFFER 0 的验收滤波寄存器filter_

31、config0=0x40;/RXF0-1SIDHfilter_config1=0x08;/RXF0-1SIDL,报文滤波应用于扩展帧filter_config2=controlerAddr;/RXF0-1EID8,设置为控制器地址filter_config3=0x00;/RXF0-1EID0spi_write_register_continue(filter_config, RXF0SIDH, 4);spi_write_register_continue(filter_config, RXF1SIDH, 4);/配置BUFFER 1 的验收滤波寄存器filter_config0=0x00;/R

32、XF2-5SIDHfilter_config1=0x08;/RXF2-5SIDL,报文滤波应用于扩展帧filter_config2=controlerAddr;/RXF2-5EID8,设置为控制器地址filter_config3=boardAddr;/RXF2-5EID0,设置为接口板地址spi_write_register_continue(filter_config, RXF2SIDH, 4);spi_write_register_continue(filter_config, RXF3SIDH, 4);spi_write_register_continue(filter_config,

33、RXF4SIDH, 4);spi_write_register_continue(filter_config, RXF5SIDH, 4);/配置接收缓冲器的控制寄存器spi_write_register(RXB0CTRL,0x04);/使能buffer0的接收滤波功能spi_write_register(RXB1CTRL,0x00);/使能buffer1的接收滤波功能/进入正常模式ENTER_NORMAL_MODE();/* * fn spi_write_TX_buffer * * brief write TX buffer 0 or 1 or 2 * * param buffer- data

34、 buffer * bufferNo - buffer number * * return none */unsigned char code TX_BUFFER_HEAD_ADDR3=TXB0SIDH,TXB1SIDH,TXB2SIDH;void spi_write_TX_buffer(unsigned char* buffer, unsigned char bufferNo) unsigned char i; sclk=0;scs=0; spi_write_byte(SPI_CMD_WRITE); /发送写指令 spi_write_byte(TX_BUFFER_HEAD_ADDRbuffe

35、rNo);/指定起始地址 /写取帧头 spi_write_byte(buffer0); spi_write_byte(buffer1); spi_write_byte(buffer2); spi_write_byte(buffer3); spi_write_byte(buffer4); /写帧数据域 for(i=1;(i<=buffer4)&&(i<=8);i+) spi_write_byte(buffer4+i); scs=1;sclk=1;/* * fn spi_read_RX_buffer * * brief read RX buffer 0 or 1 * *

36、 param buffer- data buffer * bufferNo - buffer number * * return the data of the register */unsigned char code RX_BUFFER_HEAD_ADDR2=RXB0SIDH,RXB1SIDH;void spi_read_RX_buffer(unsigned char* buffer, unsigned char bufferNo) unsigned char i; sclk=0;scs=0; spi_write_byte(SPI_CMD_READ); /发送读命令 spi_write_b

37、yte(RX_BUFFER_HEAD_ADDRbufferNo);/指定起始地址 /先读取帧头数据 buffer0=spi_read_byte(); buffer1=spi_read_byte(); buffer2=spi_read_byte(); buffer3=spi_read_byte(); buffer4=spi_read_byte(); /读取帧数据域 for(i=1;(i<=buffer4)&&(i<=8);i+) buffer4+i=spi_read_byte(); scs=1;sclk=1;void spi_write_register(unsign

38、ed char addr,unsigned char dat) sclk=0;scs=0; spi_write_byte(SPI_CMD_WRITE);/发送写指令 spi_write_byte(addr);/地址 spi_write_byte(dat);/数据 scs=1;sclk=1;/* * fn spi_write_register_continue * * brief write n bytes to 2515's register with continuous address * * param buffer- data buffer *addr- the start a

39、ddress *cnt- the number of the bytes to write * * return none */void spi_write_register_continue(unsigned char* buffer, unsigned char addr, unsigned char cnt) unsigned char i; sclk=0;scs=0; spi_write_byte(SPI_CMD_WRITE);/发送写命令 spi_write_byte(addr);/指定地址 for(i=0;i<cnt;i+) spi_write_byte(bufferi);/

40、写数据 scs=1;sclk=1;unsigned char spi_read_register(unsigned char addr) unsigned char read_dat; sclk=0;scs=0; _nop_ (); spi_write_byte(SPI_CMD_READ);/发送读命令 spi_write_byte(addr);/指定地址 read_dat=spi_read_byte();/读取数据 _nop_ (); scs=1;sclk=1; return(read_dat);/* * fn spi_read_register_continue * * brief read n bytes from 2515's register

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论