📄 xmain.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 + -