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

📄 at90can128.h

📁 不可多得的atmel公司canbus通讯程序(at90can128)
💻 H
字号:
#include <ioCAN128v.H>
#include <macros.h> 

#define MSCOMM_BUFFER_LENGTH 255

#define LED1_OFF() 	  (PORTC |=  0x10)
#define LED1_ON() 	  (PORTC &= ~0x10)

#define LED2_OFF() 	  (PORTC |=  0x08)
#define LED2_ON() 	  (PORTC &= ~0x08)

#define LED3_OFF() 	  (PORTC |=  0x04)
#define LED3_ON() 	  (PORTC &= ~0x04)

#define LED4_OFF() 	  (PORTC |=  0x02)
#define LED4_ON() 	  (PORTC &= ~0x02)

#define LED5_OFF() 	  (PORTC |=  0x01)
#define LED5_ON() 	  (PORTC &= ~0x01)

#define CS1_ON()	  (PORTC &= ~0x80)
#define CS1_OFF()     (PORTC |=  0x80)

#define CS2_ON()	  (PORTC &= ~0x40)
#define CS2_OFF()     (PORTC |=  0x40)

#define TJA1040_ENABLE()	PORTD &= ~0x10
#define TJA1040_DISABLE()	PORTD |= 0x10

enum InterruptERROR {
	enum_AERG_ERROR,
	enum_FERG_ERROR,
	enum_CERG_ERROR,
	enum_SERG_ERROR,
	enum_BX_OK_ERROR,
	enum_OVRTIM_ERROR,
	enum_BOFFIT_ERROR
};

typedef char int8;
typedef unsigned char uint8;
typedef int int16;
typedef unsigned int uint16;
typedef long int32;
typedef unsigned long uint32;

typedef unsigned char BOOL;

#define MOB_MAX	15
#define MOBNB				4
#define NB_DATA_MAX			8


#define FALSE	 0
#define TRUE	 1

#define CAN_SOFT_RESET()		(CANGCON = (1 << SWRES))			//	RESET CAN InterFace
#define CAN_START()				(CANGCON |= 0x02)
#define OS_ENTER_CRITICAL()		CLI()
#define OS_EXIT_CRITICAL()		SEI()



typedef enum { 
 CHANNEL_0, CHANNEL_1, CHANNEL_2, CHANNEL_3 , 
 CHANNEL_4, CHANNEL_5 ,CHANNEL_6 , CHANNEL_7 , 
 CHANNEL_8, CHANNEL_9 , CHANNEL_10, CHANNEL_11,  
 CHANNEL_12, CHANNEL_13, CHANNEL_14 
}MOB_CHANNEL; 
 
typedef enum {  
  CONF_DLC_0, CONF_DLC_1, CONF_DLC_2, CONF_DLC_3,  
  CONF_DLC_4, CONF_DLC_5, CONF_DLC_6, CONF_DLC_7, 
  CONF_DLC_8 
} MOB_DLC; 


#ifdef _MAIN_H
extern uint8 USART1_send_buffer[16];
extern uint8 send_Buf[8];
#endif

#ifdef _CAN_H
extern BOOL LED[5];
extern uint8 USART1_send_buffer[MSCOMM_BUFFER_LENGTH];
#endif


#ifdef _USART1_H
#endif


void CHA_Init(void);
uint8 DISPLAY_CODE(uint8 ptr);
void DISPLAY_Init(int16 num);
void CAN_Init(void);
void CAN_Send(void);
void MOB_CAN_Send(uint8 MOB_num,uint8 ID);


/*	flag = CANGIT;
	if (flag & (1 << BOFFIT))			//	《CANBUS 脱网》错误中断
	{
		LED_Init(enum_BOFFIT_ERROR);
		CANGIT &= ~(1 << BOFFIT);
		CAN_Init();
	}
	if (flag & (1 << OVRTIM))			//	《CAN定时器溢出》错误中断
	{
		LED_Init(enum_OVRTIM_ERROR);
		CANGIT &= ~(1 << OVRTIM);
	}
	if (flag & (1 << BXOK))
	{
		LED_Init(enum_BX_OK_ERROR);
		CANGIT &= ~(1 << BXOK);
	}
	if (flag & (1 << SERG))				//	《填充错误》错误中断
	{
		LED_Init(enum_SERG_ERROR);
		CANGIT &= ~(1 << SERG);
	}
	if (flag & (1 << CERG))				//	《CRC错误》错误中断
	{
		LED_Init(enum_CERG_ERROR);
		CANGIT &= ~(1 << CERG);
	}
	if (flag & (1 << FERG))				//	《帧格式错误》错误中断
	{
		LED_Init(enum_FERG_ERROR);
		CANGIT &= ~(1 << FERG);
	}
	if (flag & (1 << AERG))				//	《应答错误》错误中断
	{
		LED_Init(enum_AREG_ERROR);
		CANGIT &= ~(1 << AERG);
	}

void LED_Init(unsigned char Error_code)
{
	switch (Error_code)
	{
		case enum_AREG_ERROR:
			LED[0] = TRUE;
			break;
		case enum_FERG_ERROR:
			LED[0] = TRUE;
			break;
		case enum_CERG_ERROR:
			LED[1] = TRUE;
			break;
		case enum_BX_OK_ERROR:
			LED[2] = TRUE;
			break;
		case enum_OVRTIM_ERROR:
			LED[3] = TRUE;
			break;
		case enum_BOFFIT_ERROR:
			LED[4] = TRUE;
			break;
	}
}

///////////////////////////////////////////////////////////////////////////////////////
//CANGCON=CAN通用控制寄存器
//	ABRQ	OVRQ	TTC		SYNTTC	LISTEN	TEST	ENA/STB		SWRES
//	bit7	bit6	bit5	bit4	bit3	bit2	bit1		bit0
///////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////
//CANPAGE=CAN 邮箱(MOB)寄存器
//bit7~bit4=邮箱号(0~14)
//bit3=AINC:自动递增FIFO CAN数据缓冲区索引号
//	 0=自动递增索引号
//	 1=不自动递增索引号
//bit2~bit0:CAN FIFO数据缓冲区索引号
///////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////
//CANSTMOB=邮箱状态寄存器
//	DLCW	TXOK	RXOK	BERR	SERR	CERR	FERR	AERR
//	bit7	bit6	bit5	bit4	bit3	bit2	bit1	bit0
//-------------------------------------------------------------------------------------	
//	bit7=DLCW
//	bit6=TXOK:Transmit OK
//	bit5=RXOK:Receive OK
//	bit4=BERR:Bit Error(Only in Transmission)
//	bit3=SERR:	Stuff Error
//	bit2=CERR:	CRC Error
//	bit1=FERR:Form Error
//	bit0=AERR:	Acknowledgment Error
///////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////
//CANCDMOB=邮箱控制和数据长度码寄存器
//	bit7:6=
//		00=禁止
//		01=允许传输
//		10=允许接收
//		11=
//	bit5=
//	bit4=IDE:Identifier Extension
//	   0=CAN Standard rev 2.0A	(identifier length = 11 bits)	
//	   1=CAN Standard rev 2.0B	(identifier length = 29 bits)	
//	bit3:0=DLC:消息中数据字段的字节数
///////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////
//CANIDT1,CANIDT2,CANIDT3,CANIDT4=CAN标识码寄存器(CAN 2.0A)
//bit31:21=IDT10:0:Identifier Tag
///////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////
//CANIDM1,CANIDM2,CANIDM3,CANIDM4=CAN标识码屏蔽寄存器(CAN 2.0A)
//bit31:21=IDT10:0:Identifier Tag
///////////////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////////////
//CANGIE=CAN通用中断使能寄存器
//	ENIT	ENBOFF	ENRX	ENTX	ENERR	ENBX	ENERG	ENOVRT
//-------------------------------------------------------------------------------------	
//	bit7=ENIT:全局允许
//	bit6=ENBOFF:BUS OFF允许
//	bit5=ENRX:接收允许
//	bit4=ENTX:发送允许
//	bit3=ENERR:邮箱错误允许
//	bit2=ENBX:	数据缓冲帧允许
//	bit1=ENERG:通用错误允许
//	bit0=ENOVRT:CAN定时器重启允许
///////////////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////////////
//CANEN1=邮箱使能寄存器
//-------------------------------------------------------------------------------------	
//	bit14:0=Enable MOB
//		  0=MOB available for a new transmission or reception.
//		  1=MOB in use.		
//	bit15  =Reserved Bit	
///////////////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////////////
//CANIE1=邮箱中断使能寄存器
//-------------------------------------------------------------------------------------	
//	bit14:0=Interrupt Enable by MOB
//		  0=interrupt disabled.
//		  1=MOB interrupt enabled.		
//	bit15  =Reserved Bit	
///////////////////////////////////////////////////////////////////////////////////////


//--------------------------------------------------------------------
//					GROUP1
//--------------------------------------------------------------------
//	(1)、邮箱缓冲区14-邮箱缓冲区0(MOB14-MOB0)
//	(2)、CAN数据缓冲区
//--------------------------------------------------------------------
//					GROUP2
//--------------------------------------------------------------------
//	(3)、CAN控制寄存器
//	(4)、CAN状态寄存器
//	(5)、CAN标识码寄存器
//	(6)、CAN标识码屏蔽寄存器
//	(7)、CAN定时邮寄
//--------------------------------------------------------------------
//					GROUP3
//--------------------------------------------------------------------
//	(8)、CAN全局控制寄存器
//	(9)、CAN全局状态寄存器
//	(10) CAN邮箱使能寄存器
//	(11) CAN中断控制寄存器

//	MOB用来设置帧格式和存放数据。MOB的数目从0-14,它们互相独立,但在进行总线仲裁时,低位的MOB会获得优先权。
//	每个MOB都被安置在一个页中保存,页的序号即MOB的序号。
//
//	每一个控制单元都有自己独立的地址,当上位机发出指令时,网络中的CAN节点对指令中的地址信息进行比对,如果与
//	自己的地址一致,则接收数据并执行相应的控制命令。



void LED_Init(unsigned char Error_code)
{
	switch (Error_code)
	{
		case enum_AERG_ERROR:
			LED[0] = TRUE;
			break;
		case enum_FERG_ERROR:
			LED[0] = TRUE;
			break;
		case enum_CERG_ERROR:
			LED[0] = TRUE;
			break;
		case enum_SERG_ERROR:
			LED[1] = TRUE;
			break;
		case enum_BX_OK_ERROR:
			LED[2] = TRUE;
			break;
		case enum_OVRTIM_ERROR:
			LED[3] = TRUE;
			break;
		case enum_BOFFIT_ERROR:
			LED[4] = TRUE;
			break;
	}
}

#pragma interrupt_handler AT90CAN128_ISR:iv_CANIT
void AT90CAN128_ISR(void)
{
	uint8 i,flag;
   uint8 can_page;

   can_page = CANPAGE;
//-----------------------------------------------------
//MOB Interrupt      
//-----------------------------------------------------      
	flag = CANSIT2;
	if (flag & 0x01)
	{
   		CHA_Init();
			CANPAGE = 0x00;
        USART1_send_buffer[0] = CANIDT1;
        USART1_send_buffer[1] = CANIDT2;
        USART1_send_buffer[2] = CANMSG;
        USART1_send_buffer[3] = CANMSG;
        USART1_send_buffer[4] = CANMSG;
        USART1_send_buffer[5] = CANMSG;
        USART1_send_buffer[6] = CANMSG;
        USART1_send_buffer[7] = CANMSG;
        USART1_send_buffer[8] = CANMSG;
        USART1_send_buffer[9] = CANMSG;
			USART1_Begin_Send();
    	CANSTMOB &= ~(1 << RXOK);
    	CANCDMOB = 0x88;
	}
   if (flag & 0x02)
   {
      CANPAGE = 0x10;
      CANSTMOB &= ~(1 << TXOK);   
   }
//-----------------------------------------------------
//General Interrupt      
//-----------------------------------------------------
	flag = CANGIT;      
   if (flag & (1 << BOFFIT))
   {
   		CAN_Init();
   		CANGIT &= ~(1 << BOFFIT);
		LED_Init(enum_BOFFIT_ERROR);
   }
   if (flag & (1 << OVRTIM))
   {
   		CANGIT &= ~(1 << OVRTIM);
		LED_Init(enum_OVRTIM_ERROR);
   }
   if (flag & (1 << BXOK))
   {
   		CANGIT &= ~(1 << BXOK);
		LED_Init(enum_BX_OK_ERROR);
   }
   if (flag & (1 << SERG))
   {
   		CANGIT &= ~(1 << SERG);
 		LED_Init(enum_SERG_ERROR);
   }
   if (flag & (1 << CERG))
   {
   		CANGIT &= ~(1 << CERG);
 		LED_Init(enum_CERG_ERROR);
   }
   if (flag & (1 << FERG))
   {
   		CANGIT &= ~(1 << FERG);
 		LED_Init(enum_FERG_ERROR);
   }
   if (flag & (1 << AERG))
   {
   		CANGIT &= ~(1 << AERG);
 		LED_Init(enum_AERG_ERROR);
   }
   CANPAGE = can_page;   


*/

⌨️ 快捷键说明

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