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

📄 xmain.c

📁 基于s3c2440的 在ADS1.2环境下的确 CAN BUS驱动及测试程序
💻 C
字号:
//====================================================================
// File Name : xmain.c
// Function  : S3C2440 Test Main Menu
// Program   : Junon
// Date      : Nov 29, 2003
// Version   : 0.0
// History
//   0.0 : Programming start (February 20,2002) -> 
//====================================================================

#include <stdlib.h>
#include <string.h>
#include "sja1000.h"
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h" // 03.11.27 junon


#if USE_MAIN
#include <stdio.h>
#endif




void Isr_Init(void);
void HaltUndef(void);
void HaltSwi(void);
void HaltPabort(void);
void HaltDabort(void);

void Clk0_Enable(int clock_sel);	
void Clk1_Enable(int clock_sel);
void Clk0_Disable(void);
void Clk1_Disable(void);
int SST39VF160_CheckId(void);

extern void Calc_Clock(int print_msg);
extern U32 Mdiv, Pdiv, Sdiv, Fclk, Hclk, Pclk, Hdivn, Pdivn, Hclk_Ratio, Pclk_Ratio, Ref_Cnt;
unsigned char const  LED_TAB[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
							0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };


// Clock select argument.
#define	UCLK_SEL	(1)
#define	HCLK_SEL	(3)
#define	PCLK_SEL	(4)
#define	DCLK_SEL	(5)
// Hidden
#define	MPLL_SEL	(0)
#define	FCLK_SEL	(2)

//===================================================================
volatile  unsigned int * pLedData;



// 8段数码管码表                              

unsigned int T_flag0=0;
unsigned int T_flag1=0;
unsigned long int cc=8;

//unsigned char data[11] = {'\0'};
//unsigned char Rx_Buf0[11] = {'\0'};
unsigned char Tx_Buf0[9] = {'\0'};
unsigned char Tx_Buf1[9] = {'\0'};
//unsigned char Rx_Buf1[11] = {'\0'};


/*writ to the register with tht data
	chanal--通道号,可选CAN总线1,CAN总线2
	reg-----寄存器号
	data----寄存器数据*/
void setcanport(unsigned char chanal, unsigned int reg, unsigned char data1)
{
    if(!chanal)
	   BASEADD = (volatile char*)(0x28000000);
    else
    	BASEADD =(volatile char*)(0x28400000);
	*(BASEADD+0x100)=reg;
	*(BASEADD)=data1;

}

/*read the data of the register to the return
	chanal--通道号,可选CAN总线1,CAN总线2
	reg-----寄存器号
	返回值--寄存器数据*/
unsigned char getcanport(unsigned char chanal, unsigned char reg)
{
    unsigned char temp;
    if(!chanal)
	   BASEADD = (volatile char*)(0x28000000);
    else
    	BASEADD = (volatile char*)(0x28400000);
  
	*(BASEADD+0x100)=reg;
	temp=*BASEADD;
	return (temp);
}

/*if receive mailbox have data
	chanal--通道号,可选CAN总线1,CAN总线2
	返回值--是否有数据,如果为0,表示有数据,否则没有数据*/

unsigned char ifgetdata(unsigned char chanal)
{
   unsigned char temp;
   if(((getcanport(chanal,StatusReg) & RBS_Bit) != RBS_Bit))
      temp=1;
   else
      temp=0;   
   return (temp);

}


/*Receive one message
	chanal--通道号,可选CAN总线1,CAN总线2
	返回值--数据个数*/
unsigned char getdata(unsigned char chanal, unsigned char *buf)
{	
	int num,i;
	unsigned char data[11] = {'\0'};
    unsigned char panduan;
	
	data[0] = getcanport(chanal,RxBuffer1);
	data[1] = getcanport(chanal,RxBuffer2);
	data[2] = getcanport(chanal,RxBuffer3);
	data[3] = getcanport(chanal,RxBuffer4);
	data[4] = getcanport(chanal,RxBuffer5);
	data[5] = getcanport(chanal,RxBuffer6);
	data[6] = getcanport(chanal,RxBuffer7);
	data[7] = getcanport(chanal,RxBuffer8);
	data[8] = getcanport(chanal,RxBuffer9);
	data[9] = getcanport(chanal,RxBuffer10);
	
	num = data[1]&0x0f;

	
	for(i=0;i<num;i++)
	{
	*(buf++)=data[i+2];
	}

	setcanport(chanal,CommandReg,RRB_Bit);

	*buf=0;

	return (num);

	
}

/*Transmit one message
	num-----数据个数
	data----数据
	返回值--0 忙*/
unsigned char senddata(unsigned char chanal, unsigned char *buf)
{	    
	
	unsigned char temp = 0;
	unsigned char data[11] = {'\0'};
	int i;
	

	if((getcanport(chanal,StatusReg) & TBS_Bit) == TBS_Bit)
	{
		for(i=0;i<8;i++)
		{
		data[i]=*(buf+i);
		}
		temp = getcanport(chanal, StatusReg);
		setcanport(chanal,TxBuffer1,0x00);
		setcanport(chanal,TxBuffer2,0x08);
		setcanport(chanal,TxBuffer3,data[0]);
		setcanport(chanal,TxBuffer4,data[1]);
		setcanport(chanal,TxBuffer5,data[2]);
		setcanport(chanal,TxBuffer6,data[3]);
		setcanport(chanal,TxBuffer7,data[4]);
		setcanport(chanal,TxBuffer8,data[5]);
		setcanport(chanal,TxBuffer9,data[6]);
		setcanport(chanal,TxBuffer10,data[7]);
		
		setcanport(chanal,CommandReg,0x01);
		
		do 
		  {
		     temp = getcanport(chanal, StatusReg);
		     if ((temp & TCS_Bit)==TCS_Bit)
		        break;
		  } while(1);     //If it is transmitted succeded?

		return (1);
	}
	else if(!chanal)
	{
		if(!T_flag0)
		{
			for(i=0;i<8;i++)
			{
			Tx_Buf0[i]=*(buf+i);
			}
			T_flag0=1;//传输标志,1表示一个报文等待发送
		}
		else return (0);
	}
	else
	{
		if(!T_flag1)
		{
			for(i=0;i<8;i++)
			{
			Tx_Buf1[i]=*(buf+i);
			}
			T_flag1=1;//传输标志,1表示一个报文等待发送
		}
		else return (0);
	}
	
}


/*Initial the SJA1000 It just is BasicCAN */
void FFT_init_can(unsigned char chanal,unsigned char ac,unsigned char am,unsigned char btr0,unsigned char btr1)
{
	
	unsigned char temp = 0;

//进入复位请求设置模式
	while((temp&RM_RR_Bit)!=RM_RR_Bit)
	{
	printf("\n0x01 will be set to ModeControlReg\n");
	setcanport(chanal, ModeControlReg,0x07);/*Config MOD&CR register,初始化INT*/
	temp = getcanport(chanal, ModeControlReg);
	printf("\nModeControlReg=%d\n",temp);
	}
	
//设置接收码
	setcanport(chanal, AcceptCodeReg, ac);

//设置屏蔽码
	setcanport(chanal, AcceptMaskReg, am);

//设置总线bps
	setcanport(chanal, BusTiming0Reg, btr0);

	setcanport(chanal, BusTiming1Reg, btr1);

//设置CAN输出模式	
	setcanport(chanal, OutControlReg, 0xda);

//设置时钟分频寄存器
	setcanport(chanal, ClockDivideReg, 0x48);

/*清除复位模式位*/
	do
	{
	setcanport(chanal, ModeControlReg, 0x06);/*Config MOD&CR register*/
	}while(((getcanport(chanal, ModeControlReg)) & RM_RR_Bit)!=ClrByte);
}

void testcan(void)
{
   	 int i,j,n,cc;
    unsigned char *buf;
	static unsigned int number=0;
	unsigned char d[5][9]={"asdfjkl;","12345678","90123456","78787878","abcdefgh"};
    unsigned char panduan;
	unsigned long t;
   	
   	FFT_init_can(1,1,255,71,175);   //通道号,接收码,屏蔽码,波特率0,波特率1
	FFT_init_can(0,1,255,71,175);   //通道号,接收码,屏蔽码,波特率0,波特率1

//
	for(i=0;i<1;i++)
	{
	buf=&d[i][0];
	senddata(1,buf);
	};
	
    for(;;)
    {
       panduan=ifgetdata(0);
       if(panduan==0)
         break;
    }
	
	getdata(0,buf);
	number=number+1;
	Uart_Printf("can test ok");
}

void xmain(void)
{
	int i, voltage=120;
	unsigned int mpll_val;

	// GPIO port init.
	Port_Init();

	Led_Display(0xf);
	
	// MMU init. I/D cache on.
//	MMU_Init();
   
	Led_Display(0x1);

	//////// user can set clock again.	/////////
#if 0
	Delay(0);
	voltage=110;
	Max1718_Set(voltage);		// set proper voltage after clock changed.
	Delay(1);

	#if FIN==12000000	//When 12MHz.
	ChangeUPllValue(56,2,2);		// 48MHz
	for(i=0; i<7; i++);
	ChangeClockDivider(13,12);
	ChangeMPllValue(68,1,1);		//2440x
	#else	// else xtal_in=16.9344MHz.
	ChangeUPllValue(60,4,2);		// 48MHz
	for(i=0; i<7; i++);
	ChangeClockDivider(13,12);
	//ChangeMPllValue(118,2,2);	//265Mhz
	ChangeMPllValue(97,1,2);		//295Mhz
	//ChangeMPllValue(110,3,1);	//398Mhz
	//ChangeMPllValue(120,2,1);	//531Mhz
	#endif
#endif
	/////////////////////////////////////////

	Led_Display(0x2);
	
	Calc_Clock(0);
	UPDATE_REFRESH(Hclk);
    Led_Display(0x3);    
	// ISR init
	Isr_Init();
	
	Uart_Init(Pclk, 115200);
	Uart_Select(0);
	Uart_TxEmpty(0);
    Led_Display(0x7);
    
	// timer setting for delay 100us unit.
	//Check whether or not the POWER_OFF wake-up.
	Delay(0);	//calibrate Delay()


	//rIISPSR=(2<<5)|(2<<0); //IIS_LRCK=44.1Khz @384fs,PCLK=50Mhz.

	// Set I/O strength control.
	rDSC0 = (0<<31)|(0x3<<8)|(0xff<<0);
//	rDSC0 = (0<<31)|(0x0<<8)|(0x00<<0);
	// nEN_DSC	[31]	: 0:I/O drive strength enable, 1:Disable
	// DSC_ADR	[9:8]	: Addr drive strength, 0:10mA, 1:8mA, 2:6mA, 3:4mA
	// DSC_DATA	[7:0]	: DATA drive strength, 0:12mA, 1:10mA, 2:8mA, 3:6mA
	rDSC1 = (0x3<<28)|(0x3<<26)|(0xfffff<<0);

	
	// CLKOUT0/1 select.
	
	Uart_Printf("CLKOUT0:MPLL in, CLKOUT1:RTC clock.\n");
	Clk0_Enable(2);	// 0:MPLLin, 1:UPLL, 2:FCLK, 3:HCLK, 4:PCLK, 5:DCLK0
	Clk1_Enable(3);	// 0:MPLLout, 1:UPLL, 2:RTC, 3:HCLK, 4:PCLK, 5:DCLK1	
   
	testcan();
	


} // end of xmain().

//===================================================================
void Isr_Init(void)
{
    pISR_UNDEF  = (unsigned)HaltUndef;
    pISR_SWI    = (unsigned)HaltSwi;
    pISR_PABORT = (unsigned)HaltPabort;
    pISR_DABORT = (unsigned)HaltDabort;
	
    rINTMOD     = 0x0;					 //All=IRQ mode
//    rINTCON=0x5;						   //Non-vectored,IRQ enable,FIQ disable    
    rINTMSK     = BIT_ALLMSK;			  //All interrupt is masked.
    rINTSUBMSK  = BIT_SUB_ALLMSK;		  //All sub-interrupt is masked. <- April 01, 2002 SOP

//    rINTSUBMSK  = ~(BIT_SUB_RXD0);		 //Enable Rx0 Default value=0x7ff
//    rINTMSK     = ~(BIT_UART0);			//Enable UART0 Default value=0xffffffff    
	
//    pISR_UART0=(unsigned)RxInt;			//pISR_FIQ,pISR_IRQ must be initialized
}

//===================================================================
void HaltUndef(void)
{
    Uart_Printf("Undefined instruction exception.\n");
    while(1);
}

//===================================================================
void HaltSwi(void)
{
#if !SEMIHOSTING	
		Uart_Printf("SWI exception!!!\n");
		while(1);
#endif	
}

//===================================================================
void HaltPabort(void)
{
    Uart_Printf("Pabort exception.\n");
    while(1);
}

//===================================================================
void HaltDabort(void)
{
    Uart_Printf("Dabort exception.\n");
    while(1);
}

void Clk0_Enable(int clock_sel)	
{	// 0:MPLLin, 1:UPLL, 2:FCLK, 3:HCLK, 4:PCLK, 5:DCLK0
	rMISCCR = rMISCCR&~(7<<4) | (clock_sel<<4);
	rGPHCON = rGPHCON&~(3<<18) | (2<<18);
}
void Clk1_Enable(int clock_sel)
{	// 0:MPLLout, 1:UPLL, 2:RTC, 3:HCLK, 4:PCLK, 5:DCLK1	
	rMISCCR = rMISCCR&~(7<<8) | (clock_sel<<8);
	rGPHCON = rGPHCON&~(3<<20) | (2<<20);
}
void Clk0_Disable(void)
{
	rGPHCON = rGPHCON&~(3<<18);	// GPH9 Input
}
void Clk1_Disable(void)
{
	rGPHCON = rGPHCON&~(3<<20);	// GPH10 Input
}

⌨️ 快捷键说明

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