#include        "register.h" 
 
//Main.c 
//////////////////////////////////////////// 
void SystemInit(); 
void KickDog();   
void Can_Init(); 
void Can_Send();  
int CAN_FLAG;   
unsigned int ReceiveData[8]; 
/////////////////////////////////////////////////////////// 
void inline disable()  
{ 
        asm(" setc INTM"); 
} 
// 开总中断程序 
void inline enable() 
{ 
        asm(" clrc INTM");  
} 
 
///////////////////////////////////////////////////////// 
main() 
{   
    disable(); 
    SystemInit();          //系统初始化 
    CAN_FLAG=0x00;         //CAN接收标志位 
    Can_Init();            //CAN模块初始化 
    enable(); 
        for(;;) 
  {    
    while(CAN_FLAG==0x00); 
    CAN_FLAG=0x00; 
    Can_Send(); 
    MDER=0x0000;           //邮箱不使能 
  }    
} 
//////////////////////////////////////////////////// 
void SystemInit()  
{   
  
        asm(" SETC        INTM ");        // 关闭总中断  
        asm(" CLRC  SXM  ");        // 禁止符号位扩展  
        asm(" CLRC  CNF  ");    // B0块映射为 on-chip DARAM 
        asm(" CLRC  OVM  ");    // 累加器结果正常溢出*/ 
        SCSR1=0x87FE;                 // 系统时钟CLKOUT=20*1=20M  
                                                            // 打开ADC,EVA,EVB,CAN和SCI的时钟,系统时钟CLKOUT=40M */ 
        WDCR=0x006F;                        // 禁止看门狗,看门狗时钟64分频   
        KickDog();                            // 初始化看门狗 
        IMR=0x0010;             //开中断优先级5 
        IFR=0xFFFF;                                // 清除中断标志   
     
}   
/////////////////////////////////////////////////////   
void Can_Init() 
{  
        MCRB|=0x00C0;           //IOPC6,IOPC7配置为特殊功能 
        CAN_IFR=0xFFFF;                        // 清除全部CAN中断标志  
        LAM1_H=0xFFFF;                    // 使用LAM1  
        LAM1_L=0xFFFF;                    // 接收任何信息  
 
        MCR=0x1000;                            // 配置寄存器改变请求,正常模式  
 
        while((GSR & 0x0010)!=0x0010);  // CCE=1?  
         
        BCR2=0x0003;                // 设置数据传输率:500Kbps,20M * 
        BCR1=0x0023; 
     
       MCR=MCR&0xEFFF;                        // CPU正常工作请求            
      
       while((GSR & 0x0010)!=0x0000);        // CCE=0?          
         
        MDER=0x040;             /* 配置邮箱2为接收邮箱,且不使能 */ 
        MCR=MCR|0x0100;                        /* 数据场改变请求 */         
        MSGID2H=0x8000;         /*ID=0x1314,扩展帧,只有满足这个ID的CAN控制器才能接收本信息*/ 
        MSGID2L=0x1314; 
        MSGCTRL2=0x08;                /* 数据帧,发送8个字节 */ 
        MBX2A=0x0000; 
        MBX2B=0x0000; 
        MBX2C=0x0000; 
        MBX2D=0x0000;  
 
        MCR=0x0480;                        /* CPU正常工作请求0x0480 ,自测试为0x04C0*/  
        MDER=0x0044;        /* MessageBox2使能 */ 
        CAN_IMR=0xFFFF;         //中断屏蔽寄存器 
        CAN_IFR=0xFFFF;                        // 清除全部CAN中断标志  
 
}  
/////////////////////////////////////////////////////// 
void Can_Send() 
{         
 
        MCR=MCR|0x0100;                        /* 数据场改变请求 */ 
         
        MSGID4H=0x8000;         /*ID=0x1314,扩展帧,只有满足这个ID的CAN控制器才能接收本信息*/ 
        MSGID4L=0x1314; 
        MSGCTRL4=0x0008;                /* 数据帧,发送8个字节 */ 
        MBX4A=(ReceiveData[1]<<8) | ReceiveData[0]; 
        MBX4B=(ReceiveData[3]<<8) | ReceiveData[2]; 
        MBX4C=(ReceiveData[5]<<8) | ReceiveData[4]; 
        MBX4D=(ReceiveData[7]<<8) | ReceiveData[6];  
 
        MCR=0x0480;                        /* CPU正常工作请求0x0480 ,自测试为0x04C0*/  
        MDER=MDER | 0x0010;/* MessageBox4使能 */ 
                          
        asm(" SETC INTM "); 
        TCR=0x0040;                        /* MessageBox4, 发送请求 */ 
        while((TCR & 0x4000)!=0x4000);   
        asm(" CLRC INTM "); 
        CAN_IFR=0xFFFF;  
        TCR=0x4040;   
} 
//////////////////////////////////////////////////// 
void        interrupt CANINT() 
{ 
    if(PIVR!=0x40)         //高优先级的CAN接收中断 
                {          asm(" CLRC INTM "); 
                        return; 
                } 
    ReceiveData[0]=MBX2A & 0x00FF;  
    ReceiveData[1]=MBX2A>>8; 
    ReceiveData[2]=MBX2B & 0x00FF;  
    ReceiveData[3]=MBX2B>>8; 
    ReceiveData[4]=MBX2C & 0x00FF;  
    ReceiveData[5]=MBX2C>>8; 
    ReceiveData[6]=MBX2D & 0x00FF;  
    ReceiveData[7]=MBX2D>>8;   
    CAN_FLAG=0x01;        //收到标志位置1 
    RCR=0x0040;           //复位RMP2和MIF2 
    CAN_IFR=0xFFFF;       //清除CAN中断 
    IFR=0xFFFF;           //清除所有中断 
    asm(" CLRC INTM "); 
     
} 
 
//////////////////////////////////////////////////// 
void        interrupt nothing() 
{ 
        enable( );                                                // 允许总中断,因一进中断服务程序后总中断就自动关闭了 
        return;                                                // 中断返回 
} 
/////////////////////////////////////////////////////////////////////////////// 
void KickDog()                                //踢除看门狗  
{ 
        WDKEY=0x5555; 
        WDKEY=0xAAAA; 
} |   
     
  
 |