导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→求助一个P87c591中CAN网初始化的问题?[canglang008]

 *第29629篇: 求助一个P87c591中CAN网初始化的问题?

  
楼 主:canglang008 2005年2月18日09:24
 求助一个P87c591中CAN网初始化的问题?
我现在遇到一个问题:在调试Phillips的P87c591的can网时,发现进入不了can中断,

具体调试程序如下,希望大侠们帮我看看问题出在哪?谢谢.

串口和定时器都调通了,灯也调通了.我得调试思路是,在主程序中每隔10秒向can网发数据,同时产生can中断,在can中断中发数据,在can中断中点一个灯,结果发现在can中断中点的灯怎么也不亮,不知道问题出在哪,希望帮我看看下边的程序.

main()

{

init_can_controller();

......

ECAN=1;

while()

{

/*每隔10秒向CAN网发数据*/

CANCON = 0x01; /*发送中断*/

}

 

}

CAN网初始化函数
void init_can_controller(void)

/* 进入CAN控制器复位模式 */
CANMOD = 0x01;        /* 将CAN控制器设置为复位模式以启动初始化 */
/* TXDC Port (P1.1) 配置 */
/* 管脚TXDC 设置为推挽模式 */
P1M2 = P1M2 | 0x02; /* P1M2.1=’1’, P1M1.1 = ’0’ (默认) */
/* 配置与CAN有关的中断 */
CANSTA = 0x03; /* 使能接收和发送中断 */

/* CAN位定时的配置 */ 
CANADR = 0x06; /* BTR0和BTR1编程为125 kbit/s @12 MHz */
CANDAT = 0x45;
CANADR = 0x07; /* TSEG1 = 12, TSEG2 = 3, SJW = 2 */
CANDAT = 0x2B; /* Samples = 1 ->   sample point ~81 % */


/* 选择操作模式退出CAN控制器复位模式 */
CANMOD = 0x00;                
while (CANSTA & 0x80); /*等待总线激活*/
}

CAN网中断函数
void ECAN_int_service(void) interrupt 13 using 2    /* 高优先级 */
{
  
 unsigned char xdata CANADR_save; 

/*在此处点一个灯*/

        InterruptRegCopy = CANCON;          /* 读中断寄存器 */
        CANADR_save = CANADR;               /* 保存CANADR */
                                            /* CAN 发送中断 */
       if ((InterruptRegCopy & 0x02) == 0x02)
        {
                                            /* 发送中断处理 */
          TX_Service ();
          CanTraBufferFlag=0;               /*00表示发送can缓冲区没有数据,1表示发送缓冲区有数据*/

          CANCON=0x00;
        }
                                            /* CAN接收中断 */
      if ((InterruptRegCopy & 0x01) == 0x01)
        {
          do {
               RX_Service();
               Can_Identifer_Define();
               CanRecBufferFlag=1;            /*00表示接收can缓冲区没有数据,1表示接收缓冲区有数据*/
             } 
          while (RBS);                     /* 接收缓冲区是否清空 */ 
        }

CANADR = CANADR_save; /* 恢复CANADR */
/* ----- EX0_int_service结束 ----- */
}

 

 

  
2楼:fenggou80 2005年2月21日10:10
 你可以看看~~
P87C591单片机:
/******************************************
 单片机CAN寄存器初始化函数
******************************************/
void P87C591_CANRegInit_Config()
{
    REG_CANADR = REG_CAN_MOD;             //指针指向CAN寄存器MOD
    REG_CANDAT = 0x01;                    //置复位请求
    
    P1M2 = P1M2|0xC2;                     //将CAN总线TXDC置成推挽模式
    
    REG_CANADR = REG_CAN_IER;             
    REG_CANDAT = 0x83;                    //开CAN中断
    
    REG_CANADR = REG_CAN_BTR0;            //10K波特率 FOR 12M(CAN) 
    REG_CANDAT = 0xEF;
    REG_CANADR = REG_CAN_BTR1;
    REG_CANDAT = 0xFF;
    
    REG_CANADR = REG_CAN_ACF1_ACR0;       //设置验收代码滤波器(接收标志:0xAC)
    REG_CANDAT = 0xAC;
    REG_CANDAT = 0x00;
    REG_CANDAT = 0x00;
    
    REG_CANADR = REG_CAN_ACF1_AMR0;       //设置验收代码屏蔽器
    REG_CANDAT = 0x00;
    REG_CANDAT = 0xFF;
    REG_CANDAT = 0xFF;
    REG_CANDAT = 0xFF;
     
    REG_CANADR = REG_CAN_ACFMOD;          //设置验收滤波器工作模式(单滤波器,接收扩展帧)
    REG_CANDAT = 0x33;
    
    REG_CANADR = REG_CAN_ACFPRIO;         //设置所有滤波器优先级为高
    REG_CANDAT = 0xFF;
    
    REG_CANADR = REG_CAN_ACFEN;           //使能验收滤波器1
    REG_CANDAT = 0x01;
    
    REG_CANADR = REG_CAN_MOD;             //退出复位使能
    REG_CANDAT = 0x00;
}

    

/*************************************************
 CAN中断处理函数
*************************************************/
void ECAN_int_service(void) interrupt 13  
{
    
 REG_CANADR = REG_CAN_IR;
 InterruptRegCopy = REG_CANDAT;           //读出CAN中断状态
                CANADR_save = REG_CANADR;

               if((InterruptRegCopy & 0x01) == 0x01)
 {
          //接收中断       
 }  

 if((InterruptRegCopy & 0x02) == 0x02)
 {
         //发送中断处理
 }

               if((InterruptRegCopy & 0x80) == 0x80)
 {
        //总线出错处理
 }
    
    REG_CANADR = CANADR_save;

}

你试试先~~
都是跑通了的
初始化波特率写入的值那里我不太肯定,忘了,你自己查一下



>>>>>>对该主题发表你的看法

本主题贴数2,分页: [第1页]


[上一篇主题]:软件工程师招聘

[下一篇主题]:[求助]