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

📄 main.c

📁 motorola 集成CAN控制器
💻 C
字号:
#include <hidef.h>            /* common defines and macros */
#include <mc9s12d64.h>        /* derivative information */
#include <stdio.h>
#pragma LINK_INFO DERIVATIVE "mc9s12d64"
#pragma MESSAGE DISABLE C1106 // WARNING C1106: Non-standard bitfield type


/*采用9S12D64实现的CAN,发送时while(1){CAN_Transmit();}可实现发送,接收时用中断,接受ID=2的扩展贞,接受的字符用串口发送到计算机显示*/

//宏定义,如果采用自循环模式(CAN自发自收)时则打开宏定义 ,否则如果不采用自发自收则把下面的宏定义屏蔽
#define LoopMode


char buf[30];
uchar sig=0;

#define CAN_BUFFER_LNG 64 
uchar CANReceive[CAN_BUFFER_LNG]; 
char i;
uchar mask;


/* MSCAN初始化*/
void MSCAN_init(void)
{	CAN0CTL1_CANE = 1;  
	CAN0CTL0_INITRQ = 1; 
	while(CAN0CTL1_INITAK!=1); 
	CAN0CTL1_CLKSRC = 0; /* 选择晶振频率 */
	
	#ifdef LoopMode
	CAN0CTL1_LOOPB = 1;
	#else
	CAN0CTL1_LOOPB = 0;
	#endif
	
	CAN0CTL1_LISTEN = 0; 
	
  /* 用4M晶振125 kb rate */  
  CAN0BTR0_SJW =1;	  /* SJW=2tq*/
  CAN0BTR0_BRP =1;		/* 分频 2 */
  CAN0BTR1_SAMP =0;		/* one sample per bit */
  CAN0BTR1_TSEG_20 =5;  /* Tseg2=6 */
  CAN0BTR1_TSEG_10 =8; /* Tseg1=9 */
  
  CAN0IDAC  = 0; /* two 32bit acceptance filter*/
  /*下面仅配置为接受ID=02的扩展贞格式,此时Hit 0 命中,但对于ID=0的标准贞也接受,此时Hit 1命中*/
	CAN0IDAR0 =0x00; 
	CAN0IDAR1 =0x00; 
	CAN0IDAR2 =0x00;
	CAN0IDAR3 =0x04; //接受ID=2
	CAN0IDMR0 = 0x00; 
	CAN0IDMR1 =0x18;//屏蔽SRR和IDE
  CAN0IDMR2 = 0x00;
  CAN0IDMR3 = 0x01;//屏蔽RTR
	
	CAN0IDAR4 =0x00;//注意:如果标准贞ID设为1000,则也可接收到,因为1000已超出11位,所以此时的ID也为0
	CAN0IDAR5 =0x00;
	CAN0IDAR6 =0x00;
  CAN0IDAR7 =0x00;	
	CAN0IDMR4 = 0x00;
  CAN0IDMR5 = 0x00;
  CAN0IDMR6 = 0x00;
  CAN0IDMR7 = 0x00;

  CAN0CTL0_INITRQ = 0;
	while(CAN0CTL1_INITAK!=0);
	CAN0RIER_RXFIE = 1;	/* 接收中断使能,禁止发送中断 */
	CAN0TIER = 0;			
}

uchar CAN_Transmit(void)

{
	mask = CAN0TFLG;				 
  CAN0TBSEL= mask;        
  mask = CAN0TBSEL;        
  CAN0TXIDR0  = 0x00;			 
  CAN0TXIDR1  = 0x08;		//扩展桢
  CAN0TXIDR2  = 0x00;
  CAN0TXIDR3  = 0x04; //发送ID=2
  CAN0TXDSR0  = 200;	 
  CAN0TXDSR1  = 212;
  CAN0TXDSR2  = 111;
  CAN0TXDSR3  = 23;
  CAN0TXDSR4  = 89;
  CAN0TXDSR5	= 155;
  CAN0TXDSR6  = 199;
  CAN0TXDSR7  = 0;
  CAN0TXDLR		= 0x08;						 
  CAN0TXTBPR  = 0x00;						
  CAN0TFLG = mask; 
  return mask;								 
}


/**-------------------------------------------串口发送函数---*/
 //发送字符串,上位机可以以ASCII码形式接收
void TransmitT(char *text){SCI0SR1;
  while (*text != '\0'){
    while (!(SCI0SR1 & 0x80));  /* wait for output buffer empty */
    SCI0DRL = *text++;}
}
//发送一个字节的二进制,上位机要以HEX方式接收
void TransmitHex(unsigned char n)        //串行口输出
{ unsigned char a;
  a=SCI0SR1;
  while (!(SCI0SR1 & 0x80));
  SCI0DRL=n;
}

void Initial(void)    
{
/*----------------------------------------锁相环初始化---------------*/
 CLKSEL=0x00;             //disable pll;
 PLLCTL=0xe1;             //CLOCK MONITOR=ON,PLL=ON,AUTO SELECT,是默认设置
 SYNR=14;REFDV=2;         //bus clock =20M
 PLLCTL=0x60;             //自动锁定
 asm NOP;asm NOP;asm NOP;
 while(!CRGFLG_LOCK);
 CLKSEL=0x80;             //pll start
/*----------------------------------------串口初始化---------------*/ 
SCI0BDL=130;		//20M总线  //25M总线 :SCI0BDL=163;
 SCI0CR1=0;	 //无奇偶校验,1个起始位8个数据位1个停止位
 SCI0CR2 = 0x2c;  //允许接收中断
 
/*----------------------------------------定时中断初始化---------------*/ 
 RTICTL=0x1f;  //油门PID控制和离合器PID控制的定时中断频率,产生4ms定时中断
 CRGINT=0x80;     //允许RTI中断 
MSCAN_init();
EnableInterrupts; 

}


void main(void) {
Initial();

for(;;){
  if(sig==1){CAN_Transmit();sig=0;}

}

 }  


 interrupt void RTI_ISR (void) {
 CRGFLG_RTIF=1;
}
 
 //串口接收中断
interrupt void SCI0Recive_ISR(void){
unsigned char receivedata;
receivedata=SCI0SR1;  //清除标志
receivedata=SCI0DRL;  //读数据
if(receivedata==1)sig=1;
else {TransmitHex(receivedata);sig=0;}

}
  
/* MSCAN 接收中断*/
/*中断入口: VECTOR ADDRESS 0XFFB2 CANReceive_ISR*/
interrupt void CANReceive_ISR(void) {

	if (CAN0RXIDR1_IDE)
   {
   CANReceive[0]=CAN0RXIDR0;		 /* 扩展29位 */
   CANReceive[1]=CAN0RXIDR1;
   CANReceive[2]=CAN0RXIDR2;
   CANReceive[3]=CAN0RXIDR3;
   CANReceive[4]=CAN0RXDLR&0x0F; 
   CANReceive[5]=CAN0RXDSR0;     
   CANReceive[6]=CAN0RXDSR1;     
   CANReceive[7]=CAN0RXDSR2;     
   CANReceive[8]=CAN0RXDSR3;     
   CANReceive[9]=CAN0RXDSR4;     
   CANReceive[10]=CAN0RXDSR5;    
   CANReceive[11]=CAN0RXDSR6;    
   CANReceive[12]=CAN0RXDSR7;    
   }
  else
   {
   CANReceive[0]=CAN0RXIDR0;     /* 标准11位 */
   CANReceive[1]=CAN0RXIDR1;
   CANReceive[2]=CAN0RXDLR&0x0F; 
   CANReceive[3]=CAN0RXDSR0;     
   CANReceive[4]=CAN0RXDSR1;     
   CANReceive[5]=CAN0RXDSR2;     
   CANReceive[6]=CAN0RXDSR3;     
   CANReceive[7]=CAN0RXDSR4;     
   CANReceive[8]=CAN0RXDSR5;     
   CANReceive[9]=CAN0RXDSR6;    
   CANReceive[10]=CAN0RXDSR7;    
   } 
  for(i=0;i<13;i++){
sprintf(buf,"%d\n",CANReceive[i]);TransmitT(buf);}   //注意:调用Sprintf函数必须在头文件包含 #include <stdio.h>
	CAN0RFLG_RXF=1; 
}

⌨️ 快捷键说明

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