⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 can.c

📁 TMSLF2407局部控制器模块(CAN)程序
💻 C
字号:
#include "f2407_c.h"                 //引用头部文件   
int CAN_FLAG;                        //定义标志寄存器
void system_init();                  //声明在程序中需要用到是函数
void CANMBX_ISR();
void CAN_INIT();
void inline disable()
{
   asm(" setc INTM");
}                    
void inline enable()
{
   asm(" clrc INTM");
}                    

//(1)主程序
main()
{
 system_init();                      //系统初始化子程序
 CAN_FLAG=0x00;                      //清CAN用户标志,CAN_FLAG=0表示收到数据
 CAN_INIT();                         //CAN初始化子程序
 enable();
 for(;;)
 {
   TCR=0x20;                        //MBX3请求发送
   while(TCR&0x2000==0)             //等待发送应答
   continue;
   TCR=0x2000;                      //清TA3和MIF3标志位
   while(CAN_FLAG==0)                
   continue;                         //等待接收数据
   CAN_FLAG=0x0000;                  //清接收到标志
   MDER=0x0000;                     //邮箱不使能
   MCR=0x0140;                      //CDR=1,数据改变请求
   MBX3A=MBX2A+1;                  //邮箱3中数据加1用来更新2中的数据
   MBX3B=MBX2B+1;
   MBX3C=MBX2C+1;
   MBX3D=MBX2D+1; 
   
  }
} 

//(2) 系统初始化子程序

void system_init()
{
    asm(" setc	SXM");					// 抑制符号位扩展
	asm(" clrc	OVM");					// 累加器中结果正常溢出
	asm(" clrc	CNF");					// B0被配置为数据存储空间
	asm(" setc	INTM");					// 禁止所有中断    
	SCSR1=0x81FE;					    // CLKIN=6M,CLKOUT=4CLKIN=24M
	WDCR=0x0E8;					    // 不使能看门狗,因为SCSR2中的WDOVERRIDE
		     						    // 即WD复位后的缺省值,故可以用
		      						    // 软件禁止看门狗
	IMR=0x0010;						// 开中断优先级5           
	IFR=0x0FFFF;					    // 清除全部中断标志,"写1清0"
}   

//(3)CAN初始化子程序
 void CAN_INIT()
 {
   MCRB=MCRB|0x0C0;                   //设置IOPC6、IOPC7为CANRX,CANTX
   CAN_IFR=0x0FFFF;                    //清所有中断标志
   LAM1_H=0x7FFF;                      //设置邮箱3、2的屏蔽ID寄存器
   LAM1_L=0x0FFFF;                     //0则ID必须匹配
   MCR=0x1040;                         //CCR=1改变配置请求
   while(GSR&0x0010==0) continue;      //CCE=1时即可配置BCR2、BCR1寄存器
   BCR2=0x01;                          //波特率预分频寄存器
   BCR1=0x033;                         //波特率设置为500Kbps
   MCR=MCR&0x0EFFF;                   //CCR=0改变配置请求
   while(GSR&0x0010!=0) continue;      //只有当CCE=0时,配置BCR2、BCR1寄存器成功
   MDER=0x040;                         //不使能邮箱2,邮箱2改为接收方式
   MCR=0x0143;                         //CDR=1,数据区改变请求
   MSGID2H=0x2447;                     //设置邮箱2的控制字及ID
                                        //IDE=0,AME=0,AAM=0
                                        //标准方式为MSGID2H[12~2]
   MSGID2L=0x0FFFF;
   MSGCTRL2=0x08;                      //设置控制哉
                                        //数据长度DCL=8,RTR=0数据帧
   MBX2A=0x0000;                       //邮箱2信息初始化
   MBX2B=0x0000;
   MBX2C=0x0000;
   MBX2D=0x0000;   
   MSGID3H=0x2447;                     //设置邮箱3的标识符
   MSGID3L=0x0FFFF;
   MSGCTRL3=0x08;                      //RTR=0,DCL=8
   MBX3A=0x2211;                       //邮箱3信息初始化
   MBX3B=0x4433;
   MBX3C=0x6655;
   MBX3D=0x8877; 
   CAN_IMR=0x0F7FF;
   CAN_IFR=0x0FFFF;
   MCR=0x04c0;                         //DB0=1,AB0=1,STM=1设置为自测试模式
   MDER=0x04C;                         //使能邮箱2和3,邮箱2为接收方式
 
 }                  
 
//(4)中断程序
void interrupt GRIS5()
{
  switch(PIVR)
  {
    case 64:CANMBX_ISR();
    break;
  }
}         
void CANMBX_ISR()
{
  RCR=0x040;                          //复位RMP2和MIF2
  CAN_FLAG=1;                          //置用户接收标志
  
}

    // 直接返回中断服务程序
void interrupt nothing( ) 
{
 	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -