CAN接口芯片MCP2515的波特率和滤波器设置问题
2017-11-06 15:04
579 查看
配置波特率代码:
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
4000
)。可查询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
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
4000
)。可查询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
相关文章推荐
- 设置CAN波特率时出现问题
- 浪潮各机型管理芯片BMC IP(智能平台管理接口)设置
- python写入mysql时候 出现'latin-1' codec can't encode character 问题解决方法 以及python设置utf-8
- 使用setsockopt()接口,设置TCP的接收与发送超时,Invalid argument错误问题
- STM8S的can波特率设置
- 浪潮各机型管理芯片BMC IP(智能平台管理接口)设置
- STM32 CAN 波特率、采样点设置
- STM32 CAN 通信 滤波设置问题
- 基于STM32的CAN网络开发笔记之滤波器配置和ID设置
- 关于波特率的设置中M的单位问题
- CAN 波特率设置
- CAN波特率设置时的参数计算
- 关于CnComm波特率设置的问题
- PCI9054芯片接口设计中若干问题的深入研究
- 学习Java中所遇到问题,关于为什么List为什么会设置成接口
- ADO接口_ConnectionPtr中Open打开SQl server中的参数设置问题
- STM32 CAN 波特率设置及采样点设置
- [org.springframework.context.annotation.ComponentScanBeanDefinitionParser] are only available on JDK 1.5 and higher 问题--MyEclipse设置JDK版本
- VS2013中附加进程的方式调试IIS接口,设置断点不会命中的问题记录
- 使用setsockopt()接口,设置TCP的接收与发送超时,Invalid argument错误问题