基于dsPIC33EP256MC504的CAN总线数据传输的小结

2019-04-15 14:08发布

本文是建立在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