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;//接收缓冲区允许位 }
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 */ }