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

📄 spi01.c

📁 s3c24a0固件测试代码 ? ? ? ? ?啊 
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************
 SPI One board Test
 SPI0: Master Tx
 SPI1: Slave Rx        
 ************************/



#include <string.h>
#include "24a0addr.h"
#include "24a0lib.h"
#include "spi01.h"
#include "def.h"

#define spitx_count 0x50
#define spirx_count 0x50


#define SPI_BUFFER0 _NONCACHE_STARTADDRESS
#define SPI_BUFFER1 _NONCACHE_STARTADDRESS+0x1000

#define DMA1_RxBUFFER0 _NONCACHE_STARTADDRESS+0x2000
#define DMA1_TxBUFFER0 _NONCACHE_STARTADDRESS+0x3000
#define DMA3_RxBUFFER1 _NONCACHE_STARTADDRESS+0x4000
#define DMA3_TxBUFFER1 _NONCACHE_STARTADDRESS+0x5000


#define FORMAT0_A  1
#define FORMAT1_A  1


void __irq Spi0_Int(void);
void __irq Spi1_Int(void);
void __irq Dma1Tx_Int(void);//SPI 0
void __irq DmaTx_Int(void);


volatile char *spi0TxStr,*spi0RxStr;
volatile char *spi1TxStr,*spi1RxStr;
volatile int end0SpiTx;
volatile int endSpi1Tx;

unsigned char *tx0_ptr;
unsigned char *tx1_ptr;
unsigned char *rx0_ptr;
unsigned char *rx1_ptr;


int c1,c0;

volatile int tx_dma1Done;
volatile int rx_dma1Done;
volatile int tx_dma3Done;
volatile int rx_dma3Done;

//unsigned int spi0_rGPCON_U, spi0_rGPCON_L,spi0_rGPDAT,spi0_rGPUP;
unsigned int spi_rGPCON_U, spi_rGPCON_M, spi_rGPCON_L,spi_rGPDAT,spi_rGPUP;

/****************************************************************
 *	             SMDK24A0 SPI configuration                 *
 *  GP15=XspiMOSI1, GP16=XspiMISO, GP17=XspiCLK    *     
 ****************************************************************/

void * spi_func[][2]=
{
	(void*) Test_Spi0_MS_int,				"SPI0 RxTx Int			        ",
	(void *)Test_Spi0_MS_poll,				"SPI0 RxTx POLL 		        ",
	(void *)Test_Spi01_MS_Int,              "SPI0:Master, SPI1:Slave INT    ",
	(void *)Test_Spi01_SM_Int,              "SPI0:Slave, SPI1:Master INT    ",
	(void *)Test_SPI01_MS_DMA,              "SPI0:Master(Tx), SPI1:Slave(Rx) DMA",
	(void *)Test_SPI01_MS_DMA_RxTx,         "SPI0:Master(Rx), SPI1:Slave(Tx) DMA",
	(void *)Test_Spi01_SM_DMA_RxTx,         "SPI0:Slave(Rx), SPI1:Master(Tx) DMA",
	(void *)Test_Spi01_SM_DMA_TxRx,         "SPI0:Slave(Tx), SPI1:Master(Rx) DMA",
	0,0
};

void Ch15_SPI(void)
{
	while(1)
	{
		int i = 0;
  		Uart_Printf("\n");
		while(1)
		{	//display menu
			Uart_Printf("%2d:%s\n",i,spi_func[i][1]);
			i++;
			if((int)(spi_func[i][0])==0)
			{
				Uart_Printf("\n");
				break;
			}
			//if((i%3)==0)
			//Uart_Printf("\n");
		}
		
		Uart_Printf("\nSelect the function to test : ");
		i = Uart_GetIntNum();
		Uart_Printf("\n");
	 	if(i==-1) break;
		if(i>=0 && (i<(sizeof(spi_func)/8)) ) 
		( (void (*)(void)) (spi_func[i][0]) )();			
	}
}

void __irq Spi0_Int(void)
{
    unsigned int status;
    ClearPending(BIT_SPI0); 
    status=rSPSTA0;

    c0++;
	
    if(status&0x6) 
    	Uart_Printf("Data Collision or Multi Master Error(0x%x)!!!\n", status);
    while(!(status&0x1));   //Check ready state
    *spi0RxStr++=rSPRDAT0;    //First Rx data is garbage data
    if(*spi0TxStr!='\0') 
    	rSPTDAT0=*spi0TxStr++;
    else
    {
		rINTMSK|=BIT_SPI0;
	    end0SpiTx=1;
    }

}

void __irq Spi1_Int(void)
{
    unsigned int status;
	rSUBSRCPND|=(BIT_SUB_SPI1);
	ClearPending(BIT_VLX_SPI1); 
    status=rSPSTA1;

	c1++;
	
    if(status&0x6) 
    	Uart_Printf("Data Collision or Multi Master Error(0x%x)!!!\n", status);
    while(!(status&0x1));   //Check ready state
    *spi1RxStr++=rSPRDAT1;    //First Rx data is garbage data
    if(*spi1TxStr!='\0') 
    	rSPTDAT1=*spi1TxStr++;
	else
    {
	    rINTMSK|=(BIT_VLX_SPI1);
		rINTSUBMSK|=(BIT_SUB_SPI1);
		 endSpi1Tx=1;
    }
}


void SPI0_Port_Init(MASorSLV)
{

    // SPIO1 setting
    spi_rGPCON_U=rGPCON_U;
	spi_rGPCON_M=rGPCON_M;
    spi_rGPCON_L=rGPCON_L;
    spi_rGPDAT=rGPDAT;
    spi_rGPUP=rGPPU;
    rGPPU|=(1<<15)|(1<<16)|(1<<17);//Pull up Disable sclk,MISO, MOSI.
    rGPCON_M|=(3<<8)|(3<<10)|(3<<12); //GP15(MOSI),GP16(MISO),GP17(SCLK)
   
   if(MASorSLV==1)
   {
      rGPDAT|=(1<<8); // Master(GPIO8_Output=High)
      rGPCON_L=(rGPCON_L&0x3cffff)|(0x1<<16); // Master(GPIO8_Output)
   }
 }

void SPI0_Port_Return(void)
{
    rGPCON_U=spi_rGPCON_U;
	rGPCON_M=spi_rGPCON_M;
    rGPCON_L=spi_rGPCON_L;
    rGPDAT=spi_rGPDAT;
    rGPPU=spi_rGPUP;
}

void Master_nSS_Con(int Set)
{
     rGPDAT=rGPDAT&~(1<<8)|(Set<<8);
}

void Test_Spi0_MS_int(void)
{
    char *txStr,*rxStr;
    SPI0_Port_Init(1); 
    Uart_Printf("[SPI0 Interrupt Tx/Rx Self-Test]\n");
    Uart_Printf("Connect SPIMOSI0 into SPIMISO0.\n");

    pISR_SPI0=(unsigned)Spi0_Int;
    end0SpiTx=0;
    spi0TxStr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    spi0RxStr=(char *) SPI_BUFFER0;
    txStr=(char *)spi0TxStr;
    rxStr=(char *)spi0RxStr;
    rSPPRE0=0x0;	// Baudrate=PCLK/2
    rSPCON0=(1<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//int,en-SCK,master,low,A,normal
    rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
    rINTMSK=~(BIT_SPI0);

    while(end0SpiTx==0);

    rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
    *spi0RxStr='\0';//attach End of String(Null)
    Uart_Printf("Tx Strings:%s\n",txStr);
    Uart_Printf("Rx Strings:%s :",rxStr+1);//remove first dummy data
    if(strcmp(rxStr+1,txStr)==0)
        Uart_Printf("O.K.\n");
    else 
        Uart_Printf("ERROR!!!\n");
    SPI0_Port_Return();
}


void Test_Spi0_MS_poll(void)
{
    char *txStr,*rxStr;
    SPI0_Port_Init(1); 
    Uart_Printf("[SPI Polling Tx/Rx Self-Test]\n");
    Uart_Printf("Connect SPIMOSI0 into SPIMISO0.\n");
    end0SpiTx=0;
    spi0TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    spi0RxStr=(char *) SPI_BUFFER0;
    txStr=(char *)spi0TxStr;
    rxStr=(char *)spi0RxStr;

    rSPPRE0=0x0;	//if PCLK=50Mhz,SPICLK=25Mhz
    rSPCON0=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Polling,en-SCK,master,low,A,normal
    rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
    
    while(end0SpiTx==0)
    {
	if(rSPSTA0&0x1)   //Check Tx ready state    
	{
	  if(*spi0TxStr!='\0')
		rSPTDAT0=*spi0TxStr++;
	  else
		end0SpiTx=1;
	  while(!(rSPSTA0&0x1));   //Check Rx ready state 
	  *spi0RxStr++=rSPRDAT0;
	}
    }

    rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Polling,dis-SCK,master,low,A,normal
    *(spi0RxStr-1)='\0';//remove last dummy data & attach End of String(Null)
    
    Uart_Printf("Tx Strings:%s\n",txStr);
    Uart_Printf("Rx Strings:%s :",rxStr);
    
    if(strcmp(rxStr,txStr)==0)
        Uart_Printf("O.K.\n");
    else 
        Uart_Printf("ERROR!!!\n");
    SPI0_Port_Return();
}


void Test_Spi01_MS_Int(void)
{
	char *rx0Str,*tx0Str;
	char *rx1Str,*tx1Str;
	SPI0_Port_Init(1); // SPI0=Master, SPI1=Slave
	Uart_Printf("[SPI0(Master), SPI1(Slave) Interrupt Rx/Tx test]\n");
	Uart_Printf("Connect J37: (1-2) and CON21: (1-20),(2-19),(3-18),(4-17)\n");

	pISR_SPI0=(unsigned)Spi0_Int;
	pISR_VLX_SPI1=(unsigned)Spi1_Int;
	
	end0SpiTx=0;
	endSpi1Tx=0;
	spi0TxStr="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
	//spi0TxStr="1234567890";
	spi1TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678901234567890";
	//spi1TxStr="ABCDEFGHIJ";
	spi0RxStr=(char *) SPI_BUFFER0;
	spi1RxStr=(char *) SPI_BUFFER1;
	
	tx0Str=(char *)spi0TxStr;
	rx0Str=(char *)spi0RxStr;
	tx1Str=(char *)spi1TxStr;
	rx1Str=(char *)spi1RxStr;
		
	rSPPRE1=0xff;	//if PCLK=50Mhz,SPICLK=12.5Mhz
	rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
	
	#if FORMAT1_A
	rSPCON1=(1<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//SPI1 :int,dis-SCK,slave,low,A,normal
	#else
	rSPCON1=(1<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1)|(0<<0);//SPI1 :int,dis-SCK,slave,low,B,normal
	#endif
	
	Uart_Printf("Slave setting end...Press enter\n");
	Uart_Getch();

	rSPPRE0=0xff;	//if PCLK=50Mhz,SPICLK=12.5Mhz
	rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
   #if FORMAT0_A
	rSPCON0=(1<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//SPI0 :int,en-SCK,master,low,A,normal
   #else
	rSPCON0=(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(0<<0);//SPI0 :int,en-SCK,master,low,B,normal
   #endif
	
	//Master_nSS_Con(0); // Activate nSS 
	Uart_Printf("nSS is asserted\n");
	rGPDAT&=~(1<<8);
	rINTMSK&=~(BIT_VLX_SPI1);
	rINTSUBMSK&=~(BIT_SUB_SPI1);
	rINTMSK&=~(BIT_SPI0);
		
	while((endSpi1Tx==0)||(end0SpiTx==0))
		{
		//Uart_Printf("#");
		if(Uart_GetKey())
			return;
		}
	
	Master_nSS_Con(1);
	
	Uart_Printf("ISR0 count :%d, ISR1 count :%d\n\n",c0,c1);
	
   #if FORMAT0_A
	rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
	rSPCON1=(0<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,slave,low,A,normal
   #else
	rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(1<<1)|(0<<0);//Poll,dis-SCK,master,low,B,normal
	rSPCON1=(0<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1)|(0<<0);//Poll,dis-SCK,slave,low,B,normal
   #endif
	
	*spi0RxStr='\0';//attach End of String(Null)
	*spi1RxStr='\0';//attach End of String(Null)
	Uart_Printf("SPI0Tx Strings:%s\n",tx0Str);
	Uart_Printf("SPI0Rx Strings:%s\n",rx0Str+1);//remove first dummy data

	Uart_Printf("SPI1Tx Strings:%s\n",tx1Str);
	Uart_Printf("SPI1Rx Strings:%s\n",rx1Str+1);//remove first dummy data

	if(strcmp((rx1Str+1),tx0Str)==0)
		Uart_Printf("SPI0 test O.K !!!\n");
	if(strcmp((rx0Str+1),tx1Str)==0)
		Uart_Printf("SPI1 test O.K !!!\n");
	else 
		Uart_Printf("ERROR!!!\n");

	SPI0_Port_Return();
}


void Test_Spi01_SM_Int(void) //SPI0: Slave Rx, SPI1:Master Tx
{
	char *rx0Str,*tx0Str;
	char *rx1Str,*tx1Str;
	SPI0_Port_Init(1); // SPI0=Master, SPI1=Slave
	Uart_Printf("[SPI0(Slave), SPI1(Master) Interrupt Rx/Tx test]\n");
	Uart_Printf("Connect J36: (1-2) and CON21: (1-20),(2-19),(3-18),(4-17)\n");

	pISR_SPI0=(unsigned)Spi0_Int;
	pISR_VLX_SPI1=(unsigned)Spi1_Int;
	
	end0SpiTx=0;
	endSpi1Tx=0;
	spi0TxStr="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
	//spi0TxStr="1234567890";
	spi1TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678901234567890";
	//spi1TxStr="ABCDEFGHIJ";
	spi0RxStr=(char *) SPI_BUFFER0;
	spi1RxStr=(char *) SPI_BUFFER1;
	
	tx0Str=(char *)spi0TxStr;
	rx0Str=(char *)spi0RxStr;
	tx1Str=(char *)spi1TxStr;
	rx1Str=(char *)spi1RxStr;

	rSPPRE0=0xff;	//if PCLK=50Mhz,SPICLK=12.5Mhz
		rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
   #if FORMAT0_A
		rSPCON0=(1<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//SPI0 :int,dis-SCK,slave,low,A,normal
   #else
		rSPCON0=(1<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1)|(0<<0);//SPI0 :int,dis-SCK,slave,low,B,normal
   #endif
   
   Uart_Printf("Slave setting end...Press enter\n");
   Uart_Getch();
   
	rSPPRE1=0xff;	//if PCLK=50Mhz,SPICLK=12.5Mhz
	rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
	
	#if FORMAT1_A
	rSPCON1=(1<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//SPI1 :int,en-SCK,master,low,A,normal
	#else
	rSPCON1=(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(0<<0);//SPI1 :int,en-SCK,master,low,B,normal
	#endif
	
	//Master_nSS_Con(0); // Activate nSS 
	Uart_Printf("nSS is asserted\n");
	rGPDAT&=~(1<<8);
	rINTMSK&=~(BIT_VLX_SPI1);
	rINTSUBMSK&=~(BIT_SUB_SPI1);
	rINTMSK&=~(BIT_SPI0);
		
	while((endSpi1Tx==0)||(end0SpiTx==0))
		{
		//Uart_Printf("#");
		if(Uart_GetKey())
			return;
		}
	
	Master_nSS_Con(1);
	
	Uart_Printf("ISR0 count :%d, ISR1 count :%d\n\n",c0,c1);
	
   #if FORMAT0_A
	rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
	rSPCON1=(0<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,slave,low,A,normal
   #else
	rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(1<<1)|(0<<0);//Poll,dis-SCK,master,low,B,normal
	rSPCON1=(0<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1)|(0<<0);//Poll,dis-SCK,slave,low,B,normal
   #endif
	
	*spi0RxStr='\0';//attach End of String(Null)
	*spi1RxStr='\0';//attach End of String(Null)
	Uart_Printf("SPI0Tx Strings:%s\n",tx0Str);
	Uart_Printf("SPI0Rx Strings:%s\n",rx0Str+1);//remove first dummy data

	Uart_Printf("SPI1Tx Strings:%s\n",tx1Str);
	Uart_Printf("SPI1Rx Strings:%s\n",rx1Str+1);//remove first dummy data

	if(strcmp((rx1Str+1),tx0Str)==0)
		Uart_Printf("SPI0 test O.K !!!\n");
	if(strcmp((rx0Str+1),tx1Str)==0)
		Uart_Printf("SPI1 test O.K !!!\n");
	else 
		Uart_Printf("ERROR!!!\n");

	SPI0_Port_Return();
}


void Test_SPI01_MS_DMA(void)// SPI0=Master, SPI1=Slave
{
	int i;
	SPI0_Port_Init(1); // SPI0=Master, SPI1=Slave
	Master_nSS_Con(1);
	Uart_Printf("[SPI0(Master Tx), SPI1(Slave Rx) DMA test]\n");
	Uart_Printf("Connect J37: (1-2) and CON21: (1-20),(2-19),(3-18),(4-17)\n");

	Uart_Printf("Slave setting press enter\n");
	
	rSPPRE1=0x0;	//if PCLK=50Mhz,SPICLK=25Mhz
    #if FORMAT1_A
		rSPCON1=(2<<5)|(0<<4)|(0<<3)|(0<<2)|(1<<1)|(1<<0);//DMA1,dis-SCK,slave,low,A,TAGD
    #else
		rSPCON1=(2<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(1<<0);//DMA1,dis-SCK,slave,low,B,TAGD
	#endif
       rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
	
	Test_Spi1_S_Rx_DMA3_Set();//Slave DMA3setting

	Uart_Printf("1.Check TC1=%x,	TC3=%x\n",rDSTAT1,rDSTAT3);	
	Uart_Printf("Slave setting end...Press enter\n");
	Uart_Getch();
	
	rSPPRE0=0x0;	//
    #if FORMAT0_A
	rSPCON0=(2<<5)|(1<<4)|(1<<3)|(0<<2)|(1<<1)|(1<<0);//DMA1,en-SCK,master,low,A,normal
    #else
	rSPCON0=(2<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(1<<0);//DMA1,en-SCK,master,low,B,normal    
    #endif
    rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
	//Uart_Printf("1. TC1=%x,  TC3=%x\n",rDSTAT1,rDSTAT3);

	Master_nSS_Con(0); // Activate nSS 

	Test_Spi0_M_Tx_DMA1_Set();//Master DMA1 setting

	Uart_Printf("2.Check TC1=%x,	TC3=%x\n",rDSTAT1,rDSTAT3); 

	Uart_Printf("nSS asserted...\n");
	 
    while((tx_dma1Done==0)||(rx_dma3Done==0))
		{
    	if(Uart_GetKey())
			break;
		}
	Uart_Printf("Check TC1=%x,  TC3=%x\n",rDSTAT1,rDSTAT3);

	while(!(rSPSTA0&0x1)||!(rSPSTA1&0x1))// Tx/Rx is done
		{
    	if(Uart_GetKey())
			break;
    	}
	
	Master_nSS_Con(1);

⌨️ 快捷键说明

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