houcs 发表于 2022-10-20 20:34

PIC18F66K80用CAN通信无法发送

芯片是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   BRP14
    BRGCON2 = 0x98; //1001 1000   //SEG2PHTS 1    sampled oncePS1=4TQPropagationT 1TQ
    BRGCON3 = 0x02; //0000 0010   //PS23TQ
   
    //设置发送邮箱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);不知道为什么无法成功发送
接收信息正常

dingy 发表于 2022-10-20 20:36

那边是不是也没有收到

houcs 发表于 2022-10-20 20:39

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

lizye 发表于 2022-10-20 20:41

楼主解决了嘛,我也遇到了这个问题,一直卡在等待发送完成

houcs 发表于 2022-10-20 20:44


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

Bowclad 发表于 2022-11-2 20:16

可以分享一下什么错误吗
页: [1]
查看完整版本: PIC18F66K80用CAN通信无法发送