打印
[PIC®/AVR®/dsPIC®产品]

求助,pic18f26k80的CAN工作模式怎么设置不了?

[复制链接]
2056|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
血刀老祖|  楼主 | 2017-1-13 10:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 血刀老祖 于 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中断允许

}
评论
ljfljf0401 2018-10-9 14:21 回复TA
历程不错哦 
沙发
Latin_newday| | 2017-1-13 21:36 | 只看该作者
        CANCON=0x80;               
        while((CANSTAT&0x80)==0);

这样设置进入配置模式!!

使用特权

评论回复
板凳
kfawj| | 2017-1-14 21:54 | 只看该作者
配置后才可以转入正常模式!!pic的单片机好多功能都会有时序性的问题。

使用特权

评论回复
地板
血刀老祖|  楼主 | 2018-9-19 21:55 | 只看该作者
Latin_newday 发表于 2017-1-13 21:36
CANCON=0x80;               
        while((CANSTAT&0x80)==0);

多谢

使用特权

评论回复
5
血刀老祖|  楼主 | 2018-9-19 21:55 | 只看该作者
kfawj 发表于 2017-1-14 21:54
配置后才可以转入正常模式!!pic的单片机好多功能都会有时序性的问题。

多谢

使用特权

评论回复
6
youngfencer| | 2018-10-9 20:35 | 只看该作者
嗯??

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

73

帖子

2

粉丝