| 
 
| 本帖最后由 血刀老祖 于 2017-1-13 10:56 编辑 
 PIC18F26K80做CAN通信,进行CAN初始化,完成后,从配置模式进入到工作模式,用仿真器观察,CANCON设置成功了,CANSTAT却不变,在那里死循环了,到底是什么原因呢,谢谢各位了
 
 void canInit(void)
 {
 TRISB2 = 0;                             //设置CANRX/RB3输入
 TRISB3 = 1;                             //设置CANTX/RB2输出
 //设置CAN的波特率为500kbps,在Fosc=32MHz时,Tbit=2us
 //假设BRP=03H为000011
 //则Tq=[2*(1+BRP)]/Fosc=2*(1+3)/(32MHz)=250ns。
 //normal bit rate=8Tq
 //SJW=1Tq,SJW为00
 //Sync_Seg=1Tq
 //Prog _Seg=1Tq,PRSEG为000
 //Phase_Seg1=3Tq,SEG1PH为010
 //Phase_Seg2=3Tq,SEG2PH为010
 //位时间=(1+1+3+3)=8Tq
 ECANCON &= 0x3F;                        //模式0
 CANCON = 0xE0;                                //请求进入CAN配置模式REQOP=111
 while ((CANSTAT & 0x80) == 0)           //等待进入配置模式
 {
 ;
 }                                       //等待进入CAN配置模式OPMODE=100
 
 //波特率设置
 BRGCON1 = 0x03;                                //设置SJW和BRP
 BRGCON2 = 0x90;                                //设置SEG2PH,SEG2PH和PRSEG
 BRGCON3 = 0x42;                                //设置SEG2PH和总线唤醒
 
 //设置接收邮箱0的标识符和初始化数据
 RXB0SIDH = 0xFF;                        //设置接收缓冲器0的标识符,标准标识符1111 1111 111
 RXB0SIDL = 0xE0;
 RXB0CON = 0x20;                         //仅仅接收标准标识符的有效信息,FILHIT0=0表示RXB0采用filter0
 RXB0DLC = 0x08;                         //设置接收缓冲器0的数据区长度为8个字节
 
 RXB0D0 = 0x00;                          //初始化接收缓冲器0的数据区数据
 RXB0D1 = 0x00;
 RXB0D2 = 0x00;
 RXB0D3 = 0x00;
 RXB0D4 = 0x00;
 RXB0D5 = 0x00;
 RXB0D6 = 0x00;
 RXB0D7 = 0x00;
 
 //初始化接收滤波器0,接收标准标识符1111 1111 111
 RXF0SIDH = 0xFF;
 RXF0SIDL = 0xE0;
 //初始化接收屏蔽器0,所有报文ID均接收
 RXM0SIDH = 0x00;
 RXM0SIDL = 0x00;
 
 //初始化CAN模块的I/O控制寄存器
 //CIOCON = 0x00;
 
 
 //这里出现问题//////////////////////////////////////////
 //使CAN进入某种工作模式模式
 CANCON = 0x00;                          //正常操作模式      这里设置成功
 while ((CANSTAT & 0xE0) != 0)           //等待进入正常模式     这里寄存器CANSTAT不变化,不进入正常模式
 {
 ;
 }
 
 //初始化CAN的中断
 PIR5 = 0x00;                            //CAN中断标志清零
 IPR5bits.RXB0IP = 1;                    //CAN接收缓冲区0的接收中断为高优先级
 PIE5bits.RXB0IE = 1;                    //CAN接收缓冲区0中断允许
 
 }
 
 | 
 评论 |