Ejemplo n.º 1
0
void Ecan1_Config_test(void)//CAN1模块配置
{
	C1CTRL1bits.REQOP=4;		 //请求配置模式
	while(C1CTRL1bits.OPMODE!=4);//等待进入配置模式
	
//波特率配置
	C1CTRL1bits.CANCKS = 0x1;  //CAN时钟为FCY
	C1CFG1bits.SJW = 0x3;	   //同步跳转宽度
	C1CFG1bits.BRP = 19;       //50K 波特率
	C1CFG2bits.SEG1PH=0x7; //相位缓冲段1:8 TQ
	C1CFG2bits.SEG2PHTS = 0x1;//相位缓冲段2:可自由编程
	C1CFG2bits.SEG2PH = 0x5;//相位缓冲段2:6 TQ
	C1CFG2bits.PRSEG = 0x4; //传播时间段位:5 TQ
	C1CFG2bits.SAM = 0x1;   //总线被采样三次
	
//分配缓冲区
	C1FCTRLbits.FSA=0b01000;	//FIFO区域从第8个缓冲区开始
	C1FCTRLbits.DMABS=0b110;	//使用DMA中的32个缓冲器
	
//配置接收缓冲区
	ecan1WriteRxAcptFilter(0,0x206,1,15,0);//过滤器配置,地址0x206,,fifo,屏蔽0
	
	ecan1WriteRxAcptMask(0,0x00,1,0);//屏蔽器配置
	
	C1CTRL1bits.REQOP=0;		  //请求正常工作模式
	while(C1CTRL1bits.OPMODE!=0); //等待进入正常工作模式
	
//**********************接收发送消息的控制******************
	C1RXFUL1=C1RXFUL2=C1RXOVF1=C1RXOVF2=0x0000;//接收缓冲器,满寄存器标志位,溢出寄存器标志位 清零
	
	//TR0~TR3为发送缓冲器,需要增加在这里加上
	C1TR01CONbits.TXEN0=1;			/* ECAN1, Buffer 0 is a Transmit Buffer */
	
	//优先级设为最高
	C1TR01CONbits.TX0PRI=0b11; 		/* Message Buffer 0 Priority Level */

	
//******中断设置***********************************************
	IEC2bits.C1IE = 1;//ECAN1事件中断使能位
	C1INTEbits.TBIE = 1;//发送缓冲区允许位
	C1INTEbits.RBIE = 1;//接收缓冲区允许位
	
}
Ejemplo n.º 2
0
void ecan1Init(void) {

    /* Request Configuration Mode */
    C1CTRL1bits.REQOP = 4;
    while (C1CTRL1bits.OPMODE != 4) ;

    ecan1ClkInit();

    C1FCTRLbits.FSA = 0 b01000;	/* FIFO Starts at Message Buffer 8 */
    C1FCTRLbits.DMABS = 0 b110;	/* 32 CAN Message Buffers in DMA RAM */

    /*	Filter Configuration

    	ecan1WriteRxAcptFilter(int n, long identifier, unsigned int exide,unsigned int bufPnt,unsigned int maskSel)

    	n = 0 to 15 -> Filter number

    	identifier -> SID <10:0> : EID <17:0>

    	exide = 0 -> Match messages with standard identifier addresses
    	exide = 1 -> Match messages with extended identifier addresses

    	bufPnt = 0 to 14  -> RX Buffer 0 to 14
    	bufPnt = 15 -> RX FIFO Buffer

    	maskSel = 0	->	Acceptance Mask 0 register contains mask
    	maskSel = 1	->	Acceptance Mask 1 register contains mask
    	maskSel = 2	->	Acceptance Mask 2 register contains mask
    	maskSel = 3	->	No Mask Selection

    */

    ecan1WriteRxAcptFilter(1, 0x1FFEFFFF, 1, 15, 0);

    /*	Mask Configuration

    	ecan1WriteRxAcptMask(int m, long identifierMask, unsigned int mide, unsigned int exide)

    	m = 0 to 2 -> Mask Number

    	identifier -> SID <10:0> : EID <17:0>

    	mide = 0 -> Match either standard or extended address message if filters match
    	mide = 1 -> Match only message types that correpond to 'exide' bit in filter

    	exide = 0 -> Match messages with standard identifier addresses
    	exide = 1 -> Match messages with extended identifier addresses

    */

    ecan1WriteRxAcptMask(1, 0x1FFFFFFF, 1, 1);

    /* Enter Normal Mode */
    C1CTRL1bits.REQOP = 0;
    while (C1CTRL1bits.OPMODE != 0) ;

    /* ECAN transmit/receive message control */

    C1RXFUL1 = C1RXFUL2 = C1RXOVF1 = C1RXOVF2 = 0x0000;
    C1TR01CONbits.TXEN0 = 1;	/* ECAN1, Buffer 0 is a Transmit Buffer */
    C1TR01CONbits.TXEN1 = 1;	/* ECAN1, Buffer 0 is a Transmit Buffer */
    C1TR23CONbits.TXEN2 = 1;	/* ECAN1, Buffer 0 is a Transmit Buffer */
    C1TR23CONbits.TXEN3 = 1;	/* ECAN1, Buffer 0 is a Transmit Buffer */
    C1TR45CONbits.TXEN4 = 1;	/* ECAN1, Buffer 0 is a Transmit Buffer */
    C1TR45CONbits.TXEN5 = 1;	/* ECAN1, Buffer 0 is a Transmit Buffer */

    C1TR01CONbits.TX0PRI = 0 b11;	/* Message Buffer 0 Priority Level */
    C1TR01CONbits.TX1PRI = 0 b11;	/* Message Buffer 0 Priority Level */
    C1TR23CONbits.TX2PRI = 0 b11;	/* Message Buffer 0 Priority Level */
    C1TR23CONbits.TX3PRI = 0 b11;	/* Message Buffer 0 Priority Level */
    C1TR45CONbits.TX4PRI = 0 b11;	/* Message Buffer 0 Priority Level */
    C1TR45CONbits.TX5PRI = 0 b11;	/* Message Buffer 0 Priority Level */

}