打印

PIC18F66K80用CAN通信无法发送

[复制链接]
1337|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
caoxuanwei|  楼主 | 2020-8-12 15:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
芯片是PIC18F66K80,调试can通信,可以正常接收信息,无法正常发送
这是初始化函数
void CAN_Init(void)
{
    TRISB=(TRISB|0x08)&0xFB;        //设置CANRX/RB3为输入,CANTX/RB2为输出

    CANCON=0x80;                                //请求进入CAN配置模式REQOP=100       
        while(CANSTAT&0x80==0){;}        //等待进入CAN配置模式OPMODE=100
   
    //250 Kbps @ 64MHz
    BRGCON1 = 0x0D; //0000 1101    //SJW=1TQ     BRP  14
    BRGCON2 = 0x98; //1001 1000     //SEG2PHTS 1    sampled once  PS1=4TQ  PropagationT 1TQ  
    BRGCON3 = 0x02; //0000 0010     //PS2  3TQ
   
    //设置发送邮箱0标识符号和发送的数据
        TXB0CON=0X03;                                //发送优先级为最高优先级,TXPRI=11
    //扩展ID:11000111 111 11 01010000 11100101   0x18ff50e5
    TXB0SIDLbits.EXIDE = 1;
    TXB0SIDHbits.SID = 0b11000111;
    TXB0SIDLbits.SID = 0b111;
    TXB0SIDLbits.EID = 0b11;
    TXB0EIDHbits.EID = 0b01010000;
    TXB0EIDLbits.EID = 0b11100101;
   
    TXB0DLC=0x08;                                // 设置数据长度为8个字节
        TXB0D0=0x10;                                         /* 写发送缓冲器数据区数据初值 */
        TXB0D1=0x11;                                       
        TXB0D2=0x12;                                          
        TXB0D3=0x13;       
        TXB0D4=0x14;       
    TXB0D5=0x15;       
    TXB0D6=0x16;       
    TXB0D7=0x17;

   
    RXB0CON=0x40;                //仅仅接收标准标识符的有效信息,FILHIT0=0表示RXB0采用接收过滤器RXF0
        RXB0DLC=0x01;                //设置接收缓冲器0的数据区长度为8个字节
        RXB0D0=0x00;                //初始化接收缓冲器0的数据区数据
        RXB0D1=0x00;
        RXB0D2=0x00;
        RXB0D3=0x00;
        RXB0D4=0x00;
        RXB0D5=0x00;
        RXB0D6=0x00;
        RXB0D7=0x00;
   
    //初始化接收滤波器0,Id = 0x1806E5F4 = 0b 1 1000 000 001 10 1110 0101 1111 0100
        RXF0SIDH=0b01001101;//1 1000 000
        RXF0SIDL=0b00101010;///001 0 1 0 10
    RXF0EIDH=0b11100101;
    RXF0EIDL=0b11110100;
   
    // 初始化接收屏蔽器0,所有29位都比较滤波
    RXM0SIDH=0x00;
    RXM0SIDL=0x00;//1110 1011
    RXM0EIDH=0x00;
    RXM0EIDL=0x00;
   
     //初始化CAN模块的I/O控制寄存器
        CIOCON=0x00;
    ECANCON=0x00;
   
    //使CAN进入某种工作模式模式
    //CANCON=0x40;                        //=0X40,进入自测试模式;=0x00,正常操作模式
    CANCON=0x00;
   
        while(CANSTAT&0xE0!=0){;}
   
    //初始化CAN的中断
        PIR5=0x00;                        //清所有中断标志
        PIE5=0x05;                        //使能接收缓冲器0的接收中断
        IPR5=0x01;                        //接收缓冲器0的接收中断为最高优先级
    printf("CAN初始化完成\n");
}
这是发送函数
void CAN_Send_Bytes(unsigned char *Buf,unsigned char Len)
{   
           unsigned char i;
        TXB0CONbits.TXREQ=0;                   //禁止发送
    TXB0DLC=Len;                                   //设置发送字节个数
    // 载入待发送数据
    for(i=0;i<Len&&i<8;i++)
        {
            *(&TXB0D0+i)=Buf;  //待发送数据写入发送缓冲器数据区的数据
        }
              
        TXB0CONbits.TXREQ=1;                   //请求发送报文
        while(PIR5bits.TXB0IF!=1);//等待发送完成
    PIR5bits.TXB0IF=0;
}
会一直卡在这一行while(PIR5bits.TXB0IF!=1);不知道为什么无法成功发送
接收信息正常

使用特权

评论回复
沙发
xuanhuanzi| | 2020-8-12 19:58 | 只看该作者
那边是不是也没有收到

使用特权

评论回复
板凳
caoxuanwei|  楼主 | 2020-8-12 21:41 | 只看该作者
xuanhuanzi 发表于 2020-8-12 19:58
那边是不是也没有收到

pic没法发送,上位机没收到
上位机发送,pic正常接收

使用特权

评论回复
地板
梦幻的帅帅| | 2021-4-29 23:52 | 只看该作者
楼主解决了嘛,我也遇到了这个问题,一直卡在等待发送完成

使用特权

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

本版积分规则

4

主题

10

帖子

0

粉丝