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

📄 can程序.c

📁 can总线源代码
💻 C
字号:
/*
 * Field Bus & Embedded System LAB (B&E LAB) OF  IMUST                 
 *  
 *              
 * FileName        :   candemo.c can示例小程序 
 * FileID          :   
 * Abstract        :   同期性的以ID号为0x100发送 1 2 3 4 5 6 7 8 信息,
 * 				   	   再接收到ID号0x200发送的一字节信息后,闪一下PB0口的小灯。
 *
 * 
 * Version         :   
 * Author          :     
 * Professor       :   
 * FinishDate      :   
 *
 * HistoryVersion  :   None
 * HistoryAuthor   :   None
 * FinishDate      :   None
 *
 * CPU             :   AT90CAN128
 * Oscillator      :   4MHz
 * CompileIDE      :   ImageCraft ICCAVR 6.31A & UltraEdit
 *
 * Testbench	   :   程序工作在250K, 扩展格式
 *                     测试平台IXXAT PCI和USB2CAN模块,及CanAnayler32分析软件。
 *
 */

/*********************************/ 
/* Std HeaderFile 标准头文件包含 */
/*********************************/ 
#include <ioCAN128v.h>
#include <macros.h>

/***********************************/
/* My HeaderFile  自定义头文件包含 */
/***********************************/



/*********************/
/* Definition 宏定义 */
/*********************/
#define uchar unsigned char
#define uint  unsigned int

/*********************************/ 
/* Function Declaraton  函数声明 */
/*********************************/  

void CAN_Init(void);
void DELAY(void);

uchar tflag=1;


#pragma interrupt_handler canit_isr:19 
void canit_isr(void)
{
 if((CANSIT2 & 0x01) == 0x01)		/* 发生发送中断 */
 {
  CANPAGE = 0x00;	 				/* 选中中断的MOB0 */
  CANSTMOB &= 0xBF;					/* 清除中断标志 */
  CANCDMOB &= 0x3F;
  
  tflag = 0;  	   					/* 置一个标置为0, 以便让main的while(tflag)跳出循环 */
 }
 else	   	  	   	 		        /* 发生接收中断 */
 {
  CANPAGE = 0x10;					/* 选中中断的MOB1 */
  CANSTMOB &= 0xDF;					/* 清接收中断标志 */
  PORTC = 0xFE;
  DELAY();
  PORTC = 0xFF;
  DELAY();	   						/* 让小灯闪一下,证明进入这个中断 */
  CANCDMOB |= 0x80;					/* 再次启用接收 */
 }
}

/* 主函数 */
void main(void)
{
 CLI();		   		 	  			/* 关中断 */
 /* 其它初始化程序 */
 
 PORTC = 0xFF;
 DDRC = 0xFF;
 
 CAN_Init();	   	 				/* CAN控制器初始化 */
 SEI();							 	/* 开中断 */ 
 
 CANPAGE = 0x10;					/* 选中接收的MOB */
 CANCDMOB |= 0x80;					/* 开启接收 */
 
 while(1)
 {
  CANPAGE = 0x00;					 /* 选中发送的MOB0 */
  CANCDMOB |= 0x40;					 /* 开始发送 */
  while(tflag == 1)					 /* 等待发送中断产生 */
  {}
  tflag = 1;
  
  DELAY();
  DELAY();	  	 				 	/* 延时一下 */
 }
}
/**************************************/


/* CAN控制器初始化 */
void CAN_Init(void)
{
 uchar i;
 CANGCON = 0x02;					 /* 启用CAN控制器 */
 while(ENFG == 0)					 /* 等待启用成功 */
 {
 }
 CANGIE = 0xB0;	   	 				 /* 启用发、收、CAN总中断 */
 
 CANIE2 = 0x03;						 /* 允许MOB0和MOB1中断 */
 CANIE1 = 0x00;						 /* 禁止MOB0和MOB1以外的MOB中断 */
 CANBT1 = 0x02;
 CANBT2 = 0x04;
 CANBT3 = 0x13; 					 /* 设定波特率,可以在AT90CAN128手册中查到,也可以自己计算 */
 		  					         /* 我这用的是250K */
 
 CANPAGE = 0x00;					 /* 选中MOB0 用于发送MOB */
 CANCDMOB = 0x18;					 /* 设定为扩展帧格式29位标识, 8字节 */
 CANIDT1 = 0x00;
 CANIDT2 = 0x00;
 CANIDT3 = 0x08;
 CANIDT4 = 0x00;					/* 发送ID号为0x100 */
 for(i=1; i<9; i++)
 {
  CANMSG = i;
 }		   	   	   					/* 发送的数据为 1 2 3 4 5 6 7 8 */
 
 CANPAGE = 0x10;					/* 选中MOB1作为接收中断用 */
 CANCDMOB = 0x11;					/* 设定为扩展29位标识, 接收1字节 */
 CANIDT1 = 0x00;
 CANIDT2 = 0x00;
 CANIDT3 = 0x10;
 CANIDT4 = 0x00;					/* 只接收ID号为0x200的标识发来的信息 */
 CANIDM1 = 0xFF;
 CANIDM2 = 0xFF;
 CANIDM3 = 0xFF;
 CANIDM4 = 0xFF;
}
/***********************************/

/* 延时函数 */
void DELAY(void)
{
 uint i;
 uint j;
 
 for(i=0; i<900; i++)
 {
  for(j=0; j<500; j++)
  {
   NOP();
   NOP();
  }
 }
}
/***********************************/

⌨️ 快捷键说明

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