基于dsPIC33EP256MC504的CAN总线数据传输的小结
2014-04-28 10:08
295 查看
本文是建立在CAN总线可以接收、发送单个报文的基础上
连续发送:
对于连续发送,需要注意的地方是,每传输一个报文前,都需要重新设置ECAN模块,具体设置流程如下:
1、将ECAN模式设置在配置模式下(即C1CTRL1bits.REQOP = 4;)
2、SFR映射窗口使用缓冲区窗口(即C1CTRL1bits.WIN = 0;)
3、配置用于发送的报文缓冲区,并指定缓冲区的优先级
4、此时ECAN模块准备发送数据,应将ECAN模式设为正常工作模式(即C1CTRL1bits.REQOP = 0;)
5、将CAN报文写入位于器件RAM中的报文缓冲区
6、将缓冲区的发送请求位置1,以启动报文发送
其中1和2的作用是允许报文的连续发送,3、4、5和6项是每传输一个报文所需要的步骤
连续接收:
对于连续接收,首先需要主意的地方和连续发送类似;其次需要注意的地方是,在清零接收缓冲区标志位前,确定数据已传输完。具体流程如下:
1、将ECAN模式设置在配置模式下(即C1CTRL1bits.REQOP = 4;)
2、SFR映射窗口使用过滤器窗口(即C1CTRL1bits.WIN = 1;)
3、选择接收过滤寄存器器,并使能该过滤器
4、设置屏蔽器(确定需要过滤的位)
5、设置过滤器(只有传入的报文中包含相应的标识符时,其内容才能接收到相应的缓冲区中)
6、SFR映射窗口使用缓冲区窗口(即C1CTRL1bits.WIN = 0;)
7、此时ECAN模块准备接收数据,应将ECAN模式设为正常工作模式(即C1CTRL1bits.REQOP = 0;)
以上7步也是单个报文的接收流程。
对于清零接收缓冲区标志位,建议在事件中断里进行清零操作。如下:
/*CAN事件中断*/
void __attribute__((__interrupt__, no_auto_psv)) _C1Interrupt(void)
{
IFS2bits.C1IF = 0;
if(1 == C1INTFbits.TBIF)
{
C1INTFbits.TBIF = 0; //清零发送中断
}
if(1 == C1INTFbits.RBIF)
{
C1INTFbits.RBIF = 0; //清零接收中断
C1RXFUL1bits.RXFUL0 = 0; //清零接收缓冲区标志位
}
if(1 == C1RXOVF1bits.RXOVF0)
C1RXOVF1bits.RXOVF0 = 0; //清零溢出标志位
}
收发交替进行:
你的连续发送、连续接收都没问题,并不代表收发交替就是没问题的,往往是有问题的 …………
需要注意的暂时只有一点:在接收报文前,必须清零发送标志位,而该清零步骤不能随便加,必须加在连续接收的第6步与第7步之间(即C1TR01CONbits.TXEN0 = 0;)
刚刚接触CAN总线,如有不妥,请QQ联系,欢迎指点:375830746
连续发送:
对于连续发送,需要注意的地方是,每传输一个报文前,都需要重新设置ECAN模块,具体设置流程如下:
1、将ECAN模式设置在配置模式下(即C1CTRL1bits.REQOP = 4;)
2、SFR映射窗口使用缓冲区窗口(即C1CTRL1bits.WIN = 0;)
3、配置用于发送的报文缓冲区,并指定缓冲区的优先级
4、此时ECAN模块准备发送数据,应将ECAN模式设为正常工作模式(即C1CTRL1bits.REQOP = 0;)
5、将CAN报文写入位于器件RAM中的报文缓冲区
6、将缓冲区的发送请求位置1,以启动报文发送
其中1和2的作用是允许报文的连续发送,3、4、5和6项是每传输一个报文所需要的步骤
连续接收:
对于连续接收,首先需要主意的地方和连续发送类似;其次需要注意的地方是,在清零接收缓冲区标志位前,确定数据已传输完。具体流程如下:
1、将ECAN模式设置在配置模式下(即C1CTRL1bits.REQOP = 4;)
2、SFR映射窗口使用过滤器窗口(即C1CTRL1bits.WIN = 1;)
3、选择接收过滤寄存器器,并使能该过滤器
4、设置屏蔽器(确定需要过滤的位)
5、设置过滤器(只有传入的报文中包含相应的标识符时,其内容才能接收到相应的缓冲区中)
6、SFR映射窗口使用缓冲区窗口(即C1CTRL1bits.WIN = 0;)
7、此时ECAN模块准备接收数据,应将ECAN模式设为正常工作模式(即C1CTRL1bits.REQOP = 0;)
以上7步也是单个报文的接收流程。
对于清零接收缓冲区标志位,建议在事件中断里进行清零操作。如下:
/*CAN事件中断*/
void __attribute__((__interrupt__, no_auto_psv)) _C1Interrupt(void)
{
IFS2bits.C1IF = 0;
if(1 == C1INTFbits.TBIF)
{
C1INTFbits.TBIF = 0; //清零发送中断
}
if(1 == C1INTFbits.RBIF)
{
C1INTFbits.RBIF = 0; //清零接收中断
C1RXFUL1bits.RXFUL0 = 0; //清零接收缓冲区标志位
}
if(1 == C1RXOVF1bits.RXOVF0)
C1RXOVF1bits.RXOVF0 = 0; //清零溢出标志位
}
收发交替进行:
你的连续发送、连续接收都没问题,并不代表收发交替就是没问题的,往往是有问题的 …………
需要注意的暂时只有一点:在接收报文前,必须清零发送标志位,而该清零步骤不能随便加,必须加在连续接收的第6步与第7步之间(即C1TR01CONbits.TXEN0 = 0;)
刚刚接触CAN总线,如有不妥,请QQ联系,欢迎指点:375830746
相关文章推荐
- CAN总线——数据传输故障处理
- can总线(三)--如何通过波形解析can总线数据
- 基于libUSB的USB设备固件更新程序(数据传输部分)
- Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
- 基于android RPC网络框架的Camera数据传输
- 基于ARM的图像采集和数据传输系统
- Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
- 基于stm32的can总线彻底研究
- SylixOS NUC970平台 SPI总线数据传输
- PAST:基于对等网络节点协助的流媒体数据传输策略的研究与实现
- UDT协议-基于UDP的可靠数据传输协议(转)
- 基于1553B总线的ARINC 661指令传输(三)
- android wifi连接+基于socket的文件数据传输(上)
- 基于 Android NDK 的学习之旅-----数据传输二(引用数据类型)(附源码)
- UDT协议-基于UDP的可靠数据传输协议
- can总线(三)--如何通过波形解析can总线数据
- UDT协议-基于UDP的可靠数据传输协议
- 基于 JRTPLIB 库的 RTP 数据传输设计文档
- 基于JRTPLIB库的RTP数据传输设计文档
- C6000系列C64X DSP EDMA/QDMA小结——数据传输和优化