微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 我用的是PIC18F66K80,一直进入不了接收中断,有红包酬谢,谢谢了

我用的是PIC18F66K80,一直进入不了接收中断,有红包酬谢,谢谢了

时间:10-02 整理:3721RD 点击:

#include "pic18.h"       /* PIC18系列的头文件 */
char CAN_TX_Adress_H,CAN_TX_Adress_L; /* CAN 发送邮箱标识符高低字节 */
char CAN_RX_Adress_H,CAN_RX_Adress_L; /* CAN 接收邮箱标识符高低字节 */
int CAN_FLAG;       /* =1收到CAN 数据,=0未收到数据 */
/* ****************************************************************
** 函 数 名: initial()
** 功能描述: 系统初始化子程序,放在程序首部
*************************************************************** */
void initial()
{
INTCON=0x00;    /* bit7-bit0:关总中断 */
ADCON1=0X07;    /* 设置数字输入输出口 */
PIE1=0;      /* PIE1 的中断不使能 */   
PIE2=0;      /* PIE2 的中断不使能 */
PIE3=0;      /* PIE3 的中断不使能 */
PIE4=0;
PIE5=0;   

}
/* ****************************************************************
** 函 数 名: initcan()
** 功能描述: CAN初始化子程序,采用标准标识符,正常工作模式
*************************************************************** */
void initcan()
{
/* 设置发送邮箱0标识符 :10011001010=0x04CA */
CAN_TX_Adress_L=0x55;  //CAN低地址标识符
CAN_TX_Adress_L=CAN_TX_Adress_L&0xe0;
CAN_TX_Adress_H=0x99;  //CAN高地址标识符,应与发送方标识符相同
/* 设置接收邮箱0标识符 :00110011111=0x019F */
CAN_RX_Adress_H=0x33;  //CAN高地址标识符
CAN_RX_Adress_L=0xe0;  //CAN低地址标识符,应与发送方标识符相同
CAN_RX_Adress_L=CAN_RX_Adress_L&0xe0;
/* ************设置对CAN进行配置***************  */
TRISBbits.TRISB2=0;     //设置CANRX/RB3为输入,CANTX/RB2为输出
TRISBbits.TRISB3=1;
PORTBbits.RB1=0;
TRISBbits.TRISB1=0;
CANCON=0X80;          /* CANCON,bit7-5:1XX请求配置 */
while((CANSTAT&0X80)==0) /* CAN状态寄存器。bit7-5:100配置方式 */
{      
  ;
}       /* 等待进入CAN配置模式OPMODE=100 */
/*************波特率设置   250k ****************************/

BRGCON1=0X01;   
BRGCON2=0X98;
BRGCON3=0X41;   

/*  ******设置发送邮箱0和初始发送的数据*****  */
TXB0CON=0X03;    /* bit1-0:发送优先级,设置TXB0为最高优先级3 */
TXB0SIDL=CAN_TX_Adress_L&0xe0; /*bit3=0标准标识符,bit7-5:标准标识符2-0位*/
TXB0SIDH=CAN_TX_Adress_H;  /* 标准标识符的10-3位*/
TXB0DLC=0X08;     /* 设置数据长度为8个字节 */
TXB0D0=0X00;     /* 写发送缓冲器数据区数据初值 */
TXB0D1=0X01;     /* 写发送缓冲器数据区数据初值 */
TXB0D2=0X02;
TXB0D3=0X03;
TXB0D4=0X04;
TXB0D5=0X05;
TXB0D6=0X06;
TXB0D7=0X07;
RXB0SIDL=CAN_RX_Adress_L&0xe0; /*bit3=0标准标识符,bit7-5:标准标识符2-0位*/
RXB0SIDH=CAN_RX_Adress_H;  /* 标准标识符的10-3位 */
RXB0CON=0X20;     /* bit6-5=01只接收有效的标准标识符信息 */
RXB0DLC=0X08;     /* 设置接收缓冲器0数据区长度8个字节 */
RXB0D0=0X02;     /* 初始化接收缓冲器0的数据区数据 */
RXB0D1=0X03;     /* 初始化接收缓冲器0的数据区数据 */
RXB0D2=0X04;
RXB0D3=0X05;
RXB0D4=0X00;
RXB0D5=0X00;
RXB0D6=0X00;
RXB0D7=0X00;
/* *******初始化接收滤波器0和接收屏蔽**************** */
RXF0SIDH=CAN_RX_Adress_H;  
RXF0SIDL=CAN_RX_Adress_L&0xe0; /*高3位为标识符低3位,低5位是配置 */

RXM0SIDH=0Xff;
RXM0SIDL=0Xe0;    /* 11个1表示接收11位标识符进行滤波,标识符不同不接收;若全为0,若正确信息,全部接收*/

/* *******设置CAN工作模式**************************** */
CANCON=0X00;    //=0X40,进入自测试模式;=0x00,正常操作模式
while((CANSTAT&0XE0)!=0)  /* 检测CAN配置完成 */
{
  ;
}
/* 初始化CAN的中断,PIR5为CAN的外围中断标志寄存器 */
PIR5=0X00;    /* 清所有CAN中断标志 */
PIE5=0X01;    /* 使能接收缓冲器0的接收中断 */
IPR5=0X01;    /* 接收缓冲器0的接收中断为最高优先级 */
}
//****************主程序******************
void Init_CAN()
{
    initial();       /* 系统初始化子程序 */
    initcan();       /* CAN设置初始化 */
    IPEN=1;          /* 使能中断高低优先级 */
    INTCON=0xc0;     /*1100 0000 开总中断、开外围接口中断 */
    TXB0REQ=0;       /* 关发送,TXB0REQ=0; */
}
void CAN()//在主循环中
{
  if(CAN_FLAG==1)
  {
   CAN_FLAG=0;              /* 清接收到标志 */
   TXB0CON=0xf7;            /* TXB0REQ=0关发送 */
   TXB0D0=RXB0D0+1;      /* 用接收数据加1来更新发送数据 */
   TXB0D1=RXB0D1+1;
   TXB0D2=RXB0D2+1;
   TXB0D3=RXB0D3+1;
   TXB0D4=RXB0D4+1;
   TXB0D5=RXB0D5+1;
   TXB0D6=RXB0D6+1;
   TXB0D7=RXB0D7+1;
   TXB0CON=0x08;       /* bit3(TXREQ)=1请求发送 */
  }
}

void interrupt high_isr(void)           //高优先级
{
    if(PIR5bits.RXB0IF!=1)
    {
        CAN_FLAG=1;
        PIR5bits.RXB0IF=0;   //清接收中断标志
        RXB0CONbits.RXFUL=0; //打开接收缓冲器来接收新信息      
    }
}

咨询下你这个程序高度成功了没有

没有啊

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top