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

📄 can_adc.c

📁 完成AD数据采集和CAN总线通信
💻 C
字号:
#include "register.h"       				// 引用头部文件
int          CAN_FLAG;					    // 定义标志寄存器
int          ADRESULT[16];                  //define an array for conserving the result of AD             
volatile     unsigned   int *j;             //define a variable pointer 
int          i=0x00 , cesi , k;    




void inline disable() 						// 中断屏蔽子程序
{
	asm(" setc INTM");
}
void inline enable()						// 中断使能子程序 
{
	asm(" clrc INTM");
}


//系统初始化子程序
void sytem_init()
{
    asm(" setc INTM");
	asm(" setc SXM");
	asm(" clrc OVM");
	asm(" clrc CNF");
	*IMR=0x0011;						// 开中断优先级5和中断优先级1
	*IFR=0xFFFF;						// 清中断标志位
    *SCSR1=0x81FE;                 
    *WDCR=0xE8;  
}
//CAN初始化子程序
void CAN_INIT()
{
	*MCRB=*MCRB|0X0C0;      			// 设置IOPC6、IOPC7 为 CANRX,CANTX
	*CANIFR=0XFFFF;					// 清所有CAN中断标志
	*CANLAM1H=0X7FFF;					// 设置邮箱2、3的屏蔽ID寄存器
	*CANLAM1L=0XFFFF;					// 0则ID必须匹配
	*CANMCR=0X1040;						//  CCR=1 改变配置请求
	while(*CANGSR&0X0010==0)continue;		// 当CCE=1 时即可配置 BCR2,BCR1 寄存器
	*CANBCR2=0X01;						// 波特率预分频寄存器
	*CANBCR1=0X033;						// 波特率设置为1M
	*CANMCR=*CANMCR&0XEFFF;				//  CCR=0 改变配置结束请求
	while(*CANGSR&0X0010!=0)continue; 		// 只有当CEE=0时,BCR2,BCR1 寄存器配置成功
	*CANMDER=0X040;  					// 不使能邮箱,邮箱2设为接收方式
	*CANMCR=0X0143;            			//  CDR=1,数据区改变请求
	*CANMSGID2H=0X2447;					// 设置邮箱2的控制字及ID
									//  IDE=0, AME=0, AAM=0
									// 标准方式为MSGID2H[12-2]
	*CANMSGID2L=0XFFFF;
	*CANMSGCTRL2=0X08; 					// 设置控制域
									// 数据长度DCL = 8,RTR=0 数据帧
	*CANMBX2A=0X0000;					// 邮箱2信息初始化
	*CANMBX2B=0X0000;
	*CANMBX2C=0X0000;
	*CANMBX2D=0X0000;
	*CANMSGID3H=0X2447;					// 设置邮箱3的标识符
	*CANMSGID3L=0XFFFF;
	*CANMSGCTRL3=0X08;					//  RTR=0,DCL=8
	*CANMBX3A=0X2211;					// 邮箱3信息初始化
	*CANMBX3B=0X4433;
	*CANMBX3C=0X6655;
	*CANMBX3D=0X8877;
	*CANMCR=0X04C0;						//  DBO=1,ABO=1,STM=1设置为自测试模式
	*CANMDER=0X4C;						//  ME3=1,MBX3 发送, ME2=1 接收
	*CANIMR=0XF7FF;					// 中断MBX3 不使能 ,MBX2使能, 低中断优先级
	*CANIFR=0XFFFF;					// 清全部中断标志
}
/*initialization A/D subprogram*/ 
void ADINT()
{
    *T4CNT=0X0000;
    *T4CON=0X170C;
    *T4PR=0X075;
    *GPTCONB=0X400;
    *EVBIFRB=0X0FFFF;
    *ADCTRL1=0X10;  
    *ADCTRL2=0X8404;                      /*1000010000000100  */
    *MAXCONV=0X0F;
    *CHSELSEQ1=0X3210;
    *CHSELSEQ2=0X7654; 
    *CHSELSEQ3=0X0BA98; 
    *CHSELSEQ4=0X0FEDC;
}
//start a/d transform subprogram
void ADsoc()
{
    *T4CON=*T4CON|0X40;
}
//stop a/d transform subprogram
void ADstop()
{
    *T4CON=*T4CON&0X0FFBF;
}
void CAN_T()
{
    *CANTCR=0X20;					    // MBX3请求发送 
	while(*CANTCR&0X2000==0)			// 等待发送应答
    continue; 
	*CANTCR=0X2000; 					// 清 TA3 和MIF3标志位
}
void CAN_R()
{
    while(CAN_FLAG==0)
    continue;						    // 等待接收数据
	CAN_FLAG=0;				     	    // 清接收到标志
}


void CANMBX_ISR()						// 邮箱2接收中断服务子程序
{
  	*CANRCR=0X040;						// 复位 RMP2 和 MIF2
  	 CAN_FLAG=1;						// 置用户接收标志
}

void data_configure()
{
     k=1;
     for(i=1;i++;i<=4)
        {
        *CANMDER=0X0000;       			// 邮箱不使能
	    *CANMCR=0X0140;       			//  CDR=1,数据改变请求
	    *CANMBX3A=ADRESULT[k];
	    k++;
	    *CANMBX3B=ADRESULT[k];
	    j++;
	    *CANMBX3C=ADRESULT[k];
	    k++;
	    *CANMBX3D=ADRESULT[k];
	    k++;
        }
        *CANMCR=0X04C0;					//  DBO=1,CDR=0,ABO=1,STM=1
	    *CANMDER=0X04C;   				//  ME2=ME3=1,MBX2接收, MBX3发送
}
main()
{
  disable();
  sytem_init();
  CAN_INIT();
  ADINT();
  enable();
  CAN_R();
  ADsoc();
  while(i==0x10)
  continue;
  ADstop();
  data_configure();
  CAN_T();  
  while(1)
  {
  ;
  }
}

void interrupt GRIS5() 						//CAN邮箱2接收中断入口程序
{ 
	switch(*PIVR)
	{
		case 64:
		*CANRCR=0X040;						// 复位 RMP2 和 MIF2
  	    CAN_FLAG=1;						    // 置用户接收标志
	    break;
    }
    enable(); 
    return;   
}  


/* a/d iterrupt subprogram */
void interrupt adint()
{
  asm(" clrc SXM ");
  j=RESULT0; 
  for(i=0;i<=15;i++,j++)
   {
     ADRESULT[i]=*j&0X03FF; 
     cesi=ADRESULT[i];
   }           
   *ADCTRL2=*ADCTRL2|0X4200;
   enable(); 
   return;
}

void interrupt nothing()
{
   enable();
   return;
}    

⌨️ 快捷键说明

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