CAN接口芯片MCP2515的波特率和滤波器设置问题

来源:互联网 发布:济南java工资线 编辑:程序博客网 时间:2024/06/01 10:54
配置波特率代码:
    MCP2515ByteWrite(CNF1, 3);
    MCP2515ByteWrite(CNF2, 0x80|PHSEG1_3TQ|PRSEG_1TQ);
    MCP2515ByteWrite(CNF3, PHSEG2_3TQ);
功能:波特率的设置非常灵活,通过设置CNF1、CNF2、CNF3寄存器实现。
其中:
a)CNF1中的bit5~0为分频数BRP,其对晶振频率FOSC进行分配得到TQ(时间份额)。
TQ=2*(BRP+1)/FOSC
当BRP=3,FOSC=8M,则TQ=2*(3+1)/8M=1us
b)CNF2的bit7取1,bit5~3(PHSEG1)+1为相位缓冲段PS1的TQ数,bit2~0(PRSEG)+1为传播段PRSEG的TQ数。
c)CNF3的bit2~0(PHSEG2)+1位相位缓冲段PS2的TQ数。

如为达到BRT=125kbps,位时间Tbit为波特率的倒数,Tbit=1/BRT=8us,上图4段加起来总数应等于8(当TQ=1us时)。

同步段固定为1;若PPRSEG取1;S1和PS2占大多数,分别为3。则采样点位置为(1+1+3)/8=62.5%,采样点位置应确保在60%~90%。

设置接收滤波器
a)滤波过程说明
接收到的帧数据先与RXB0的滤波器进行匹配,如果成功数据进行如RXB0,产生中断INT(L);如果匹配不成功再与RXB1的滤波器进行匹配,如果成功数据进行如RXB1,产生中断INT(L)。可查询CANSTAT或CANINTF判断数据来自于RXB0还是RXB1。
CANSTAT的bit3~1:110为RXB0;111位RXB1。
CANINTF:bit0为RXB0;bit1位RXB1。为了能产生中断,需使能设置CANINTE的bit1和bit0。
b)标准帧结构分析
设置滤波器首先要了解CAN数据帧(标准帧和扩展帧)的结构。下面只分析标准帧。
标准帧包含11位标识符,位于标准帧数据的第一个字节8bit和第二个字节高3位,对应芯片的TX寄存器为:TXB0SIDH(8位)+TXB0SIDL(高3位);对应RX寄存器为:RXB0SIDH(8位)+RXB0SIDL(3位)。(假设使用TXB0和RXB0)
c)滤波器设置
如果要对这11位都进行滤波器,步骤为:
aa、设置RXM0SIDH(8位)+RXM0SIDL(3位),分别为0xFF和0xE0。
bb、设置RXF0SIDH(8位)+RXF0SIDL(3位),分别为想要接收的标准帧标识符。
cc、设置RXF1SIDH(8位)+RXF1SIDL(3位),分别为想要接收的标准帧标识符。如果只接收一个标识符,RXF1和RXF0设置为一样的。
dd、写RXB0CTRL的bit6~5:11为接收所有帧(不滤波);01为只接收标准帧;10为直接收扩展帧;00为接收标准帧和扩展帧。
如果不需要对11位都进行滤波,将RXM0的相应位置写0,如0x00为对所有位都不滤波。
RXB0和RXB1分开设置:RXB0可设置RXF0和RXF1;RXB1可设置RXF2~5。
设置滤波器的代码参考:
MCP2515ByteWrite( RXM0SIDH, 0xFF );    // 1111 1111 滤波器0对11位都进行滤波
MCP2515ByteWrite( RXM0SIDL, 0xE0 );        // 111X XXXX
MCP2515ByteWrite( RXF0SIDH, 0xAA );// 1010 1010 标识符应为10101010101的标准帧
MCP2515ByteWrite( RXF0SIDL, 0xA0 );    // 101X XXXX
MCP2515ByteWrite( RXF1SIDH, 0xAA );     // 1010 1010 RXF1和RXF0相同
MCP2515ByteWrite( RXF1SIDL, 0xA0 );    // 101X XXXX
MCP2515ByteWrite( RXM1SIDH, 0xFF );    // 1111 1111 滤波器1对11位都进行滤波
MCP2515ByteWrite( RXM1SIDL, 0xE0 );         // 111X XXXX
    MCP2515ByteWrite( RXF2SIDH, 0xAB );    // 1010 1011 标识符应为10101011101的标准帧
    MCP2515ByteWrite( RXF2SIDL, 0xA0 );    // 101X XXXX 
MCP2515ByteWrite( RXB0CTRL, 0x20 );        // RXB0只接收标准帧
MCP2515ByteWrite( RXB1CTRL, 0x20 );        // RXB1只接收标准帧


转载自http://bbs.mydigit.cn/read.php?tid=1994140