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

📄 spi01.c

📁 三星s3c2460开发板完整功能测试代码
💻 C
📖 第 1 页 / 共 5 页
字号:

    //Step1. SPI init
    printf("Clock selection[D=0]  0. PCLK/2  1. PCLK/4  2. PCLK/6  ... 63. PCLK/128 \n");
    i = GetIntNum();
    if ( (i<0)||(i>63) ) rSPPRE1 = 0;
    else rSPPRE1 = i;
	printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE1+1)))/1000000 );
//    rSPPRE1=0x0;	//if PCLK=50Mhz,SPICLK=25Mhz

	rSPCON1=(2<<5)|(0<<4)|(0<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(1<<0);//DMA3,dis-SCK,slave,low,A,TAGD
	
    //When you use [Slave Rx with DMA] function you should have to set TAGD bit
    rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release

    //Step2. DMA1 init 
    Init_DMA_Regs(3);
    rDISRC3=(unsigned)0x44500034;//Address of SPRDAT Register
    rDISRCC3=(1<<1)|(1);		//APB(SPI), fix
    rDIDST3=(unsigned)rx_ptr;	//Address of Memory
    rDIDSTC3=(0<<1)|(0);		//AHB(Memory), inc
    rDCON3=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<22)|(0<<20)|(SPI1_COUNT);
    //handshake, sync PCLK, TC int, single tx, single service, SPI, H/W request, 
    //off-reload, byte, 128Bytes
    rDMAREQSEL3=(1<<1)|(1<<0);
    rDMASKTRIG3=(0<<2)|(1<<1)|(0);    //run, DMA1 channel on, no-sw trigger 
    
    while(rx_dma3Done==0)
	{
		if(Uart_GetKey())
			break;
	}

	/*
    while(!rSPSTA1&0x1) //Tx is done!
	{
		if(Uart_GetKey())
			break;
	}
	*/	
  
    
	//init rSPCON1
	rSPCON1 = (1<<3);
        
    *(rx_ptr+SPI1_COUNT)=rSPRDAT1;
    rx_ptr=(unsigned char *) SPI_BUFFER1;
    for(i=1;i<(SPI1_COUNT+1);i++)
		printf("0x%02x,",*(rx_ptr+i));
    printf("\nDMA3 receive end");
    SPI_Port_Return();
}



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;
	end1SpiTx=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;
	end1SpiTx=1;
    }

         
}


void Test_Spi01_MS_Int(void)
{
	char *rx0Str,*tx0Str;
	char *rx1Str,*tx1Str;
	int i;

	SPI_Port_Set();
	SPI0_Port_Init(1); // SPI0=Master
	SPI1_Port_Init(0); //  SPI1=Slave
	printf("[SPI0(Master), SPI1(Slave) Interrupt Rx/Tx test]\n");
	printf("Connect J29: (2-3) and CON28: (2-3)\n");

	pISR_IIC_SPI=(unsigned)Spi10_Int;
	
	end0SpiTx=0;
	end1SpiTx=0;
	spi0TxStr="!@#$%^&*()_+|<>?:~ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
	spi1TxStr="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+|<>?:~";

	spi0RxStr=(char *) SPI_BUFFER0;
	spi1RxStr=(char *) SPI_BUFFER1;
	
	tx0Str=(char *)spi0TxStr;
	rx0Str=(char *)spi0RxStr;
	tx1Str=(char *)spi1TxStr;
	rx1Str=(char *)spi1RxStr;
		
	i = ClockSelection();
	rSPPRE1=i;	//if PCLK=50Mhz,SPICLK=12.5Mhz
	printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE1+1)))/1000000 );
	rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
	
	rSPCON1=(1<<5)|(0<<4)|(0<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//SPI1 :int,dis-SCK,slave,low,A,normal
		
	printf("Slave setting end...Press enter\n");
	getchar();

	rSPPRE0=i;	//if PCLK=50Mhz,SPICLK=12.5Mhz
	rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
	rSPCON0=(1<<5)|(1<<4)|(1<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(0<<0);//SPI0 :int,en-SCK,master,low,A,normal
   	
	printf("nSS is asserted\n");
	Master_nSS_Con0(0);    // Activate nSS 
	rINTMSK&=~(BIT_IIC_SPI);
	rINTSUBMSK&=~(BIT_SUB_SPI0);
	rINTSUBMSK&=~(BIT_SUB_SPI1);
		
	while((end1SpiTx==0)||(end0SpiTx==0))
		{
		//printf("#");
		if(Uart_GetKey())
			return;
		}
	
	Master_nSS_Con0(1);
	
		
	rSPCON0=(0<<5)|(0<<4)|(1<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
	rSPCON1=(0<<5)|(0<<4)|(0<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//Poll,dis-SCK,slave,low,A,normal
   	
	*spi0RxStr='\0';//attach End of String(Null)
	*spi1RxStr='\0';//attach End of String(Null)
	printf("SPI0Tx Strings:%s\n",tx0Str);
	printf("SPI0Rx Strings:%s\n",rx0Str+1);//remove first dummy data

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

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

  SPI_Port_Return();
}


void Test_Spi01_SM_Int(void) //SPI0: Slave Rx, SPI1:Master Tx
{
	char *rx0Str,*tx0Str;
	char *rx1Str,*tx1Str;
	int i;

       SPI_Port_Set();
	SPI0_Port_Init(0); // SPI0=Master, SPI1=Slave
	SPI1_Port_Init(1); // SPI0=Master, SPI1=Slave
	printf("[SPI0(Slave), SPI1(Master) Interrupt Rx/Tx test]\n");
	printf("Connect J29: (2-3) and CON28: (2-3)\n");

	pISR_IIC_SPI=(unsigned)Spi01_Int;
	
	end0SpiTx=0;
	end1SpiTx=0;
	spi0TxStr="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+|<>?:~";
	spi1TxStr="!@#$%^&*()_+|<>?:~ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
	
	spi0RxStr=(char *) SPI_BUFFER0;
	spi1RxStr=(char *) SPI_BUFFER1;
	
	tx0Str=(char *)spi0TxStr;
	rx0Str=(char *)spi0RxStr;
	tx1Str=(char *)spi1TxStr;
	rx1Str=(char *)spi1RxStr;

	i = ClockSelection();
	rSPPRE0=i;	//if PCLK=50Mhz,SPICLK=12.5Mhz
	printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE0+1)))/1000000 );
	rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
	rSPCON0=(1<<5)|(0<<4)|(0<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(0<<0);//SPI0 :int,dis-SCK,slave,low,A,normal
   
	printf("Slave setting end...Press enter\n");
	getchar();
   
	rSPPRE1=i;	//if PCLK=50Mhz,SPICLK=12.5Mhz
	rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
	
	rSPCON1=(1<<5)|(1<<4)|(1<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//SPI1 :int,en-SCK,master,low,A,normal
		
	printf("nSS is asserted\n");
	Master_nSS_Con1(0);  // Activate nSS 
	rINTMSK&=~(BIT_IIC_SPI);
	rINTSUBMSK&=~(BIT_SUB_SPI0);
	rINTSUBMSK&=~(BIT_SUB_SPI1);
		
	while((end1SpiTx==0)||(end0SpiTx==0))
		{
		//printf("#");
		if(Uart_GetKey())
			return;
		}
	
	Master_nSS_Con1(1);
	

	rSPCON0=(0<<5)|(0<<4)|(1<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
	rSPCON1=(0<<5)|(0<<4)|(0<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//Poll,dis-SCK,slave,low,A,normal
   	
	*spi0RxStr='\0';//attach End of String(Null)
	*spi1RxStr='\0';//attach End of String(Null)
	printf("SPI0Tx Strings:%s\n",tx0Str);
	printf("SPI0Rx Strings:%s\n",rx0Str+1);//remove first dummy data

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

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

	SPI_Port_Return();
}

void Init_DMA_Regs(uint8 ch)
{
	uint32 base,i;
	
	base = 0x40400000+ch*0x100000;
	
	for(i=0;i<10;i++)
		*(((uint32 *)base)++) = 0;
}


void Test_SPI01_MS_DMA_TxRx(void)// SPI0=Master, SPI1=Slave
{

    int i;

    SPI_Port_Set();
    SPI0_Port_Init(1);
    SPI1_Port_Init(0);
    printf("[SPI0(Slave Rx), SPI1(Master Tx) DMA test]\n");
	printf("Connect J29: (2-3) and CON28: (2-3)\n");
	
	Master_nSS_Con0(1);
		
    rSPCON0=(0<<5)|(0<<4)|(0<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(0<<0);//poll,dis-SCK,slave,low,A,normal
	rSPCON1=(0<<5)|(0<<4)|(0<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//poll,dis-SCK,slave,low,A,normal
	
	tx0_ptr=(unsigned char *) DMA1_TxBUFFER0;
    for(i=0; i<SPITX_COUNT; i++)
		*(tx0_ptr+i)=i+1;

	rx1_ptr=(unsigned char *)DMA3_RxBUFFER1;
    for(i=0;i<(SPIRX_COUNT+2);i++)
		*(rx1_ptr+i)=0x0; // Zero Initialize
		
    rx_dma3Done=0;
    tx_dma1Done=0;
	
    pISR_DMA_SBUS= (unsigned)DmaTx_Int;
    rINTMSK=~(BIT_DMA_SBUS);
    rINTSUBMSK=~(BIT_SUB_DMA1);

    //Step1. SPI init
    i = ClockSelection();
    rSPPRE1=i;	//if PCLK=50Mhz,SPICLK=25Mhz
	printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE1+1)))/1000000 );
    rSPCON1=(2<<5)|(0<<4)|(0<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(1<<0);//DMA1,dis-SCK,slave,low,A,normal
    
    rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
    
	//Step2. DMA3 init
	Init_DMA_Regs(3);
	rDISRC3=(unsigned)0x44500034;//Address of SPRDAT Register
	rDISRCC3=(1<<1)|(1); 	   //APB(SPI), fix
	rDIDST3=(unsigned)(rx1_ptr);   //Address of Memory
	rDIDSTC3=(0<<1)|(0); 	   //AHB(Memory), inc
	rDCON3=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<22)|(0<<20)|(SPIRX_COUNT);
	rDMAREQSEL3=(1<<1)|(1<<0);      
	rDMASKTRIG3=0x02;	 //run DMA3  	
    
	printf("Slave setting......end\n");
	getchar();
	
	pISR_DMA_SBUS= (unsigned)DmaTx_Int;
	rINTMSK=~(BIT_DMA_SBUS);
	rINTSUBMSK=~(BIT_SUB_DMA3);

   //Step1. SPI init
	rSPPRE0=i;   //if PCLK=50Mhz,SPICLK=25Mhz
    rSPCON0=(2<<5)|(1<<4)|(1<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(0<<0);//DMA1,en-SCK,master,low,A,TAGD	
    
	   //When you use [Master Rx with DMA] function you should have to set TAGD bit
	rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
	
	Master_nSS_Con0(0); 
               
    //Step2. DMA1 init
    Init_DMA_Regs(1);
    rDISRC1=(unsigned)tx0_ptr;	//Address of Memory
    rDISRCC1=(0<<1)|(0);		//AHB(Memory), inc
    rDIDST1=(unsigned)0x44500010;//Address of SPTDAT Register
    rDIDSTC1=(1<<1)|(1);		//APB(SPI), fix
    rDCON1=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<22)|(0<<20)|(SPITX_COUNT);    
    rDMAREQSEL1=(0<<1)|(1<<0);  
    rDMASKTRIG1=0x02;    //run, DMA1 channel on, no-sw trigger   
	
	while((tx_dma1Done==0)||(rx_dma3Done==0))
	{
		if(Uart_GetKey())
			break;
	}
	
	printf("Check TC1=%x,	TC3=%x\n",rDSTAT1,rDSTAT3);

	while(!(rSPSTA0&0x1))// Tx
	{
		if(Uart_GetKey())
			break;
	}	
	
    *(rx1_ptr+SPIRX_COUNT) = rSPRDAT1;
		
	Master_nSS_Con0(1);
	
	printf("tx_dma3Done=%x, rx_dma1Done=%x\n",tx_dma3Done,rx_dma1Done);    
    		
    rSPCON0=(0<<5)|(0<<4)|(0<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(0<<0);//poll,dis-SCK,slave,low,A,normal
	rSPCON1=(0<<5)|(0<<4)|(0<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//poll,dis-SCK,slave,low,A,normal
	    
	printf("\nDMA1 data(TX)\n");
	for(i=0; i<SPITX_COUNT; i++)
	{
		printf("0x%02x,",*tx0_ptr++);
		if(((i+1)%16)==0)
			printf("\n");
	}

	printf("\n");
    
    rx1_ptr=(unsigned char *) DMA3_RxBUFFER1;
    *(rx1_ptr+SPIRX_COUNT+1) = rSPRDAT1;
        
	printf("\nDMA3 data(RX)\n");
	
    for(i=2;i<(SPIRX_COUNT+2);i++)
	{
		printf("0x%02x,",*(rx1_ptr+i));
		if(((i-1)%16)==0)
			printf("\n");
	}	
	
    SPI_Port_Return();
}
///////////////////////////////////////////////////////////////////////////

void Test_SPI01_MS_DMA_RxTx(void)// SPI0=Master(Rx), SPI1=Slave(Tx)
{
    int i;

	SPI_Port_Set();
	SPI0_Port_Init(1); // Spi0=Slave(nSS) 
	SPI1_Port_Init(0); // Spi1=master
	 
	printf("[SPI0(Master Tx), SPI1(Slave Rx) DMA test]\n");
	printf("Connect J29: (2-3) and CON28: (2-3)\n");
      	
	Master_nSS_Con0(1);
      	
    rSPCON0=(0<<5)|(0<<4)|(0<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(0<<0);//poll,dis-SCK,slave,low,A,normal
	rSPCON1=(0<<5)|(0<<4)|(0<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//poll,dis-SCK,slave,low,A,normal
	    
	tx1_ptr=(unsigned char *) DMA3_TxBUFFER1;
	for(i=0; i<SPITX_COUNT; i++)
		*(tx1_ptr+i)=i+1; 
		
    rx0_ptr=(unsigned char *) DMA1_RxBUFFER0;
    for(i=0;i<(SPIRX_COUNT+2);i++)
		*(rx0_ptr+i)=0x0; // Zero Initialize
		
    rx_dma1Done=0;
	tx_dma3Done=0;

    pISR_DMA_SBUS= (unsigned)DmaTx_Int;
    rINTMSK=~(BIT_DMA_SBUS);
    rINTSUBMSK=~(BIT_SUB_DMA1);

    //Step1. SPI init
    i = ClockSelection();
    rSPPRE0=i;	//if PCLK=50Mhz,SPICLK=25Mhz
	printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE0+1)))/1000000 );
    rSPCON0=(2<<5)|(1<<4)|(1<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(1<<0);//DMA1,dis-SCK,slave,low,A,TAGD
    
    //When you use [Slave Rx with DMA] function you should have to set TAGD bit
    rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release

    //Step2. DMA1 init 
    Init_DMA_Regs(1);
    rDISRC1=(unsigned)0x44500014;//Address of SPRDAT Register
    rDISRCC1=(1<<1)|(1);		//APB(SPI

⌨️ 快捷键说明

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