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

📄 spi01.org.c

📁 三星s3c2460开发板完整功能测试代码
💻 C
📖 第 1 页 / 共 3 页
字号:
/************************
 SPI One board Test
 SPI0: Master Tx
 SPI1: Slave Rx        
 ************************/



#include <string.h>
#include "2460addr.h"
#include "2460lib.h"
#include "spi01.h"
#include "pll.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 Spi01_Int(void);
void __irq Spi10_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;


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

unsigned int spi_rGPHCON, spi_rGPHDAT,spi_rGPHPU;

extern unsigned int Pclk;

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


int ClockSelection(void)
{
	int i;
	
	printf("Clock selection  0.PCLK/2  1.PCLK/4  2.PCLK/6 ... 63.PCLK/128 \n");
	i = GetIntNum();
	if ( (i<0)||(i>63) ) i = 0;
	
	return i;	
}

void __irq Spi01_Int(void)
{
    unsigned int status, status1;

    rINTMSK|=BIT_IIC_SPI;
    rINTSUBMSK|=BIT_SUB_SPI0;
    rINTSUBMSK|=BIT_SUB_SPI1;
    ClearPending(BIT_IIC_SPI);
    rSUBSRCPND=BIT_SUB_SPI0;
    rSUBSRCPND=BIT_SUB_SPI1;
     	
    status=rSPSTA0;
    status1=rSPSTA1;

     if(status&0x6) 
    	printf("Data Collision or Multi Master Error0(0x%x)!!!\n", status);
     if(status1&0x6) 
    	printf("Data Collision or Multi Master Error1(0x%x)!!!\n", status1);

  
    while(!((status&0x1)&&(status1&0x1)));   //Check ready state
       
       *spi0RxStr++=rSPRDAT0;    //First Rx data is garbage data
       *spi1RxStr++=rSPRDAT1; 
       
//	 printf("Rx0: %c  Tx0: %c   Rx1: %c  Tx1: %c\n", rSPRDAT0, *spi0TxStr, rSPRDAT1, *spi1TxStr);
//	 printf("Rx1: %c  Tx1: %c\n", rSPRDAT1, *spi1TxStr);
  
    if((*spi0TxStr!='\0') && (*spi1TxStr!='\0'))
    {
       
    	rSPTDAT0=*spi0TxStr++;
	rSPTDAT1=*spi1TxStr++;
	

	rINTMSK&=~BIT_IIC_SPI;
       rINTSUBMSK&=~BIT_SUB_SPI0;
       rINTSUBMSK&=~BIT_SUB_SPI1;
     }
	else
    {
      	rINTMSK|=BIT_IIC_SPI;
       rINTSUBMSK|=BIT_SUB_SPI0;
       rINTSUBMSK|=BIT_SUB_SPI1;
	end0SpiTx=1;
	endSpi1Tx=1;
    }

         
}


void __irq Spi10_Int(void)
{
    unsigned int status, status1;

    rINTMSK|=BIT_IIC_SPI;
    rINTSUBMSK|=BIT_SUB_SPI0;
    rINTSUBMSK|=BIT_SUB_SPI1;
    ClearPending(BIT_IIC_SPI);
    rSUBSRCPND=BIT_SUB_SPI0;
    rSUBSRCPND=BIT_SUB_SPI1;
     	
    status=rSPSTA0;
    status1=rSPSTA1;

     if(status&0x6) 
    	printf("Data Collision or Multi Master Error0(0x%x)!!!\n", status);
     if(status1&0x6) 
    	printf("Data Collision or Multi Master Error1(0x%x)!!!\n", status1);

  
    while(!((status&0x1)&&(status1&0x1)));   //Check ready state
    
       *spi1RxStr++=rSPRDAT1;    
       *spi0RxStr++=rSPRDAT0;    //First Rx data is garbage data
       
       
//	 printf("Rx0: %c  Tx0: %c   Rx1: %c  Tx1: %c\n", rSPRDAT0, *spi0TxStr, rSPRDAT1, *spi1TxStr);
//	 printf("Rx1: %c  Tx1: %c\n", rSPRDAT1, *spi1TxStr);
  
    if((*spi0TxStr!='\0') && (*spi1TxStr!='\0'))
    {
       rSPTDAT1=*spi1TxStr++;
    	rSPTDAT0=*spi0TxStr++;
	
	

	rINTMSK&=~BIT_IIC_SPI;
      rINTSUBMSK&=~BIT_SUB_SPI0;
       rINTSUBMSK&=~BIT_SUB_SPI1;
     }
	else
    {
      	rINTMSK|=BIT_IIC_SPI;
       rINTSUBMSK|=BIT_SUB_SPI0;
       rINTSUBMSK|=BIT_SUB_SPI1;
	end0SpiTx=1;
	endSpi1Tx=1;
    }

         
}


void __irq Spi0_Int(void)
{
    unsigned int status;

    rINTMSK|=BIT_IIC_SPI;
    rINTSUBMSK|=BIT_SUB_SPI0;
   
    ClearPending(BIT_IIC_SPI);
    rSUBSRCPND|=BIT_SUB_SPI0;
    status=rSPSTA0;

    if(status&0x6) 
    	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++;
       rINTMSK&=~BIT_IIC_SPI;
       rINTSUBMSK&=~BIT_SUB_SPI0;
	}
	else
    {
//	rINTMSK|=BIT_IIC_SPI;
//    rINTSUBMSK|=BIT_SUB_SPI0;
	end0SpiTx=1;
    }
}

void SPI_Port_Set(void)
{
   spi_rGPHCON=rGPHCON;
    spi_rGPHDAT=rGPHDAT;
    spi_rGPHPU=rGPHPU;
}

void SPI0_Port_Init(MASorSLV)
{

//      rGPHPU=rGPHPU&~(0x7<<12)|(1<<14);//Disable sclk.     Enable MISO, MOSI.
 		 rGPHPU=rGPHPU&~(0xf<<12);//Disable sclk. 		Enable MISO, MOSI.
      
   if(MASorSLV==1)
   {
      rGPHDAT|=(1<<15); // Master(GPHCON_Output=High)
      rGPHCON=rGPHCON&~(0xff<<24)|(0x6a<<24); // Master(GPHCON15_Output)
   }
   else if (MASorSLV==0)  rGPHCON=rGPHCON&~(0xff<<24)|(0xaa<<24);
   
 }

void SPI1_Port_Init(MASorSLV)
{

//   rGPHPU=rGPHPU&~(0x7<<4)|(1<<6);//Disable sclk.     Enable MISO, MOSI.
 	rGPHPU=rGPHPU&~(0xf<<4);//Disable sclk.		 Enable MISO, MOSI.
      
   if(MASorSLV==1)
   {
      rGPHDAT|=(1<<7); // Master(GPHCON_Output=High)
      rGPHCON=rGPHCON&~(0xff<<8)|(0x7f<<8); // Master(GPHCON15_Output)
   }
   else if (MASorSLV==0)  rGPHCON=rGPHCON&~(0xff<<8)|(0xff<<8);
 }


void SPI_Port_Return(void)
{
    rGPHCON=spi_rGPHCON;
    rGPHDAT=spi_rGPHDAT;
    rGPHPU=spi_rGPHPU;
}

void Master_nSS_Con0(int Set)
{
    
     rGPHDAT=rGPHDAT&~(1<<15)|(Set<<15);
//     rGPHCON=rGPHCON&~(3<<30)|(1<<30);
}


void Master_nSS_Con1(int Set)
{
    rGPHDAT=rGPHDAT&~(1<<7)|(Set<<7);
 //   rGPHCON=rGPHCON&~(3<<14)|(1<<14);
}
/*
void Slave_nSS(void)
{
    rGPHCON=rGPHCON&~((0x3<<30)|(0x3<<14))|(0x2<<30)|(0x3<<14);
}
*/

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

    pISR_IIC_SPI=(unsigned)Spi0_Int;
    end0SpiTx=0;
    spi0TxStr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    spi0RxStr=(char *) SPI_BUFFER0;
    txStr=(char *)spi0TxStr;
    rxStr=(char *)spi0RxStr;
	
	rSPPRE0=ClockSelection();	// 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_IIC_SPI);
    rINTSUBMSK=~(BIT_SUB_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)
    printf("Tx Strings:%s\n",txStr);
    printf("Rx Strings:%s :",rxStr+1);//remove first dummy data
    if(strcmp(rxStr+1,txStr)==0)
        printf("O.K.\n");
    else 
        printf("ERROR!!!\n");

    SPI_Port_Return();
}


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

    rSPPRE0=ClockSelection();	//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)
    
    printf("Tx Strings:%s\n",txStr);
    printf("Rx Strings:%s :",rxStr);
    
    if(strcmp(rxStr,txStr)==0)
        printf("O.K.\n");
    else 
        printf("ERROR!!!\n");

⌨️ 快捷键说明

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