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

📄 low_can_bus.c

📁 汽车行业专用通讯
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
*********************************************************************************************************
*                                                 HQE
*                                      The Dual area climate-control system
*                                             
*
*                          (c) Copyright 2008-   , LongFine Automotive Electrical Co.Ltd 
*                                           All Rights Reserved
*
*
* File 			: canbus_sja1k.c
* By   			: zhanghouyuan
* Date 			: 2008/5/20
*
* CPU TYPE    	: M30290 
* Description	: nop()
* Version		: Ver.0.0
*********************************************************************************************************
*/

#ifndef	CANBUS_SJA1K_GLOBALS

#define	CANBUS_SJA1K_GLOBALS

#include "sfr_M16C29config.h"
#include "Os_cpu.h"					//type define
#include "canbus_sja1k.h"
#include "int_func.h"
#endif

/*
*********************************************************************************************************
*                void sja1000_init(void)
*
* Description: low can ecu sja1000 initial.
*
* Arguments  : none
*
* Returns    :	
* Note(s)    : call target_init();sja1000_reset_on();sja1000_config();sja1000_reset_off();
*
*********************************************************************************************************
*/
void sja1000_init(void)

	{
		int1ic=0x0;					/*disable mcu interrupt int1*/
	
		target_init();
		
		sja1000_reset_on();
		
		sja1000_config();
		
	    sja1000_reset_off();
		
		pd8_3 = 0;

		int1ic=0x13;				/*enable mcu interrupt int1*/
	
	}

/*
*********************************************************************************************************
*                void Low_CAN_Task(void)
*
* Description: low can mcu task
*
* Arguments  : none
*
* Returns    :	
* Note(s)    : call Write_SJA_SendBuf();write_sja1000(CMR_Addr,0x09);
*
*********************************************************************************************************
*/
void Low_CAN_Task(void)

	{ 
       INT8U flag = 0;
	   
	   flag = Write_SJA_SendBuf();
	   
	   if(flag)
	  
	  	{
		   
			write_sja1000(CMR_Addr,0x09);  /*wake up ,clear overflow flag and start send data*/
		
		}
	  while(!(read_sja1000(SR_Addr)&0x08))/*waiting sending over*/
	  
	  {  ;   }
	   
	   
	  
		}
/*
*********************************************************************************************************
*               INT8U Write_SJA_SendBuf()
*
* Description: mcu write sja1000 send buff
*
* Arguments  : none
*
* Returns    :	
* Note(s)    : setting_working_mode();call read_sja1000();write_sja1000();
*
*********************************************************************************************************
*/
INT8U Write_SJA_SendBuf()

	{
		INT8U i,state0 = 0;
		
		INT8U value[10] = {0};
		
		INT8U ERR_CHK_Ctr0 = 20;      /*error count */
		
		STA = 0;
		
		while((!STA)&&(ERR_CHK_Ctr0>0))
		
		{
			
			STA = setting_working_mode();
			
			if(STA)
			 
				{  ;  }
			
			else
			
				{
				
				 	ERR_CHK_Ctr0--;
						
			 	}
		}
		
		if((read_sja1000(SR_Addr)&0x08) != 0)/* check  last times send end or less*/
		
		{
			
			if((read_sja1000(SR_Addr)&0x04) != 0)/*check send buf locked or less*/
			
			{
			//	send_BUF.FrameID_H = 0x33;
				
			//	send_BUF.FrameLENTH = 8;
				
			//	send_BUF.FrameKIND = 0;//location frame
				
			//	send_BUF.FrameID_L3 = 0;
			//	for(i=0;i<send_BUF.FrameLENTH;i++)
			//	send_BUF.Frame_Data[i] = i*2
				
				write_sja1000(0x10,0x33);
				
				write_sja1000(0x11,0x08);
				
				for(i=0;i<8;i++)
					
				{
					write_sja1000(0x12+i,i*2);
						
				}
					
				state0 = 1;								/* write send buf is ok */

				for(i=0;i<10;i++)							/* read trans buff, used by test */
				
				{
					value[i] = read_sja1000(0x10+i);
					
				}
			}
			
			else 
			
			state0 = 0;
				
	  }
	 
	 else 
	 
	 state0 = 0;
		
	return state0;
		
	}

/*
*********************************************************************************************************
*              INT8U Read_SJA_RecBuf()
*
* Description: read sja1000. receive buff,
*
* Arguments  : none
*
* Returns    : none
* CALL       : setting_working_mode();
*              read_sja1000();setting_ocr();setting_cdr();
*              
*
*********************************************************************************************************
*/
INT8U Read_SJA_RecBuf()

	{
		INT8U ERR_CHK_Ctr1 = 20,i,state1 = 0;
				
		INT8U Rec[10] = {0};
		
		STA = 0;
		
		while(!STA)
		
		{
			
			STA = setting_working_mode();
			
			if(STA)
			 
				{  ;  }
			
			else
			
				{
				
				 	ERR_CHK_Ctr1--;
						
			 	}
		}
		
		if(read_sja1000(SR_Addr)&0x01 != 0)/*read receive buf state,1--able read buf,0--null*/
		
		{
		
			if((read_sja1000(SR_Addr)&0x10 == 0))/*receive is end,now could receive data*/
			
			{
				for(i=0;i<10;i++)
				
				{
					Rec[i]=read_sja1000(0x20+i);
						  
				    p9_0 = 1;
					
				}
      			
			}
		}
	}
/*
*********************************************************************************************************
*                void sja1000_config(void)
*
* Description: config  sja1000.,
*
* Arguments  : none
*
* Returns    : none
* CALL       : check_hard_connect();setting_reset_mode();setting_sja_rate();
*              setting_data_select();setting_ocr();setting_cdr();
*              
*
*********************************************************************************************************
*/
void sja1000_config(void)

	{
		INT8U ERR_CHK_Ctr = 20;      /*error count */
		
		STA = 0;
		
		while((!STA)&&(ERR_CHK_Ctr>0))
		
		{
			STA = check_hard_connect();		/*test hard connect*/
			
			if(STA)
			 
				{  ;  }
			
			else
			
				{
				
				 	ERR_CHK_Ctr--;
						
			 	}
		}
		
		ERR_CHK_Ctr = 20;/*error count */
		
		STA = 0;
		
		while((!STA)&&(ERR_CHK_Ctr>0))						
		
		{
			STA = setting_reset_mode();  /*software reset ,disable sja1000 all interrupt*/
			
			if(STA)
			 
				{  ;  }
			
			else
			
				{
				
				 	ERR_CHK_Ctr--;
						
			 	}
		}
		
		ERR_CHK_Ctr = 20;/*error count */
		
		STA = 0;
		
		while((!STA)&&(ERR_CHK_Ctr>0))						
	
		{
			
			STA = setting_sja_rate();  /*setting sja1000  rate 125kbps */
		
			if(STA)
			 
				{  ;  }
			
			else
			
				{
				
				 	ERR_CHK_Ctr--;
						
			 	}
			
		 }
		
		ERR_CHK_Ctr = 20;/*error count */
		
		STA = 0;
		
		while((!STA)&&(ERR_CHK_Ctr>0))	/*setting sja1000  data acr,amr*/
		
		{
				
			STA = setting_data_select();
			
			if(STA)
			 
				{  ;  }
			
			else
			
				{
				
				 	ERR_CHK_Ctr--;
						
			 	}
			
		}
		
		ERR_CHK_Ctr = 20;/*error count */
		
		STA = 0;
	
		while((!STA)&&(ERR_CHK_Ctr>0))	/*输出控制寄存器的值:正常输出模式*/
		
		{
			STA = setting_ocr();
			
			if(STA)
			 
				{  ;  }
			
			else
			
				{
				
				 	ERR_CHK_Ctr--;
						
			 	}
		}
		
		ERR_CHK_Ctr = 20;/*error count */
		
		STA = 0;
	
		while((!STA)&&(ERR_CHK_Ctr>0))	/*basic can mode ;disable cbp;off clkout*/
		
		{
			STA = setting_cdr();
			
			if(STA)
			 
				{  ;  }
			
			else
			
				{
				
				 	ERR_CHK_Ctr--;
						
			 	}
		}
		
		STA = 0;
	
	}
	
/*
*********************************************************************************************************
*                INT8U setting_cdr()
*
* Description: setting sja1000 clock and cloclout mode disable
*
* Arguments  : none
*
* Returns    :	1--setting ok,  0--setting failure
* called     : write_sja1000();read_sja1000();
*			   
*********************************************************************************************************
*/	

INT8U setting_cdr()

	{
		write_sja1000(CDR_Addr,SJA_CDR);
		
		if(read_sja1000(CDR_Addr) == SJA_CDR)
		
		return 1;
		
		else 
		
		return 0;
		
		}	
/*
*********************************************************************************************************
*                INT8U setting_ocr()
*
* Description: setting sja1000 data output mode.normal output mode
*
* Arguments  : none
*
* Returns    :	1--setting ok,  0--setting failure
* called     : write_sja1000();read_sja1000();
*			   
*********************************************************************************************************
*/	
INT8U setting_ocr()  

	{
		write_sja1000(OCR_Addr,SJA_OCR);

		if(read_sja1000(OCR_Addr) == SJA_OCR)
		
		return 1;
		

⌨️ 快捷键说明

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