打印

工作模式怎么设置不了

[复制链接]
362|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pengf|  楼主 | 2020-3-21 12:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PIC18F26K80做CAN通信,进行CAN初始化,完成后,从配置模式进入到工作模式,用仿真器观察,CANCON设置成功了,CANSTAT却不变,在那里死循环了

使用特权

评论回复
沙发
pangb| | 2020-3-21 12:38 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
pengf|  楼主 | 2020-3-21 12:39 | 只看该作者

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中断允许

}

使用特权

评论回复
地板
xxmmi| | 2020-3-21 12:40 | 只看该作者
CANCON=0x80;               
        while((CANSTAT&0x80)==0);

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

使用特权

评论回复
5
lium| | 2020-3-21 12:42 | 只看该作者
配置后才可以转入正常模式

使用特权

评论回复
6
hanwe| | 2020-3-21 12:43 | 只看该作者
pic的单片机好多功能都会有时序性的问题。

使用特权

评论回复
7
pengf|  楼主 | 2020-3-21 12:45 | 只看该作者

搞定了,呵呵,犯了低级错误……

使用特权

评论回复
8
testin| | 2020-3-22 11:36 | 只看该作者
时序没有匹配好

使用特权

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

本版积分规则

718

主题

10129

帖子

3

粉丝