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

📄 spi01.c

📁 三星s3c2460开发板完整功能测试代码
💻 C
📖 第 1 页 / 共 5 页
字号:
    while((end1SpiRx==0)&&(!Uart_GetKey()));
    
	//init rSPCON1
	rSPCON1 = (1<<3);    	
    
    printf("Rx End...\n");
    printf("Rx data:\n");
    
    int_rxdata[SPI1_COUNT+1]=rSPRDAT1;
    
    for(i=2;i<(SPI1_COUNT+2);i++)
    	printf("0x%02x,",int_rxdata[i]);
    
    printf("\n");
    int_rx_cnt = 0;
    
    SPI_Port_Return();
}


/////////////////////////// Polling //////////////////////////

void Test_Spi1_M_Tx_Polling(void)
{
	char *rxStr,*txStr,i;
	uint8 txdata[SPI1_COUNT];
	boolean rx_end=FALSE;

    SPI_Port_Set();
    SPI1_Port_Init(1); // Master
	Master_nSS_Con1(1);
	
	//init rSPCON1
	rSPCON1 = (1<<3);
	
	for(i=0;i<SPI1_COUNT;i++)
		txdata[i]=i+1;

	rSPPRE1=ClockSelection();	// Baudrate=PCLK/2
	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=SPI_POLLING_MODE|SCKEN|MASTER|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|NORMALMODE;//int,dis-SCK,slave,low,A,normal
	Master_nSS_Con1(0);
	
	i=0;
	while(!Uart_GetKey())
	{
		if(rSPSTA1&0x6) 
			printf("Data Collision \n");
		while((!(rSPSTA1&0x1))&&((rx_end=Uart_GetKey())==0));  //Check ready state
		rSPTDAT1 = txdata[i++];
		if(i==SPI1_COUNT)
			break;
	}
	
	Master_nSS_Con1(1);	
	
	printf("Transmit end\n");
	
	//init rSPCON1
	rSPCON1 = (1<<3);
			
	SPI_Port_Return();
}

void Test_Spi1_M_Rx_Polling(void)
{
    char *rxStr,i;
    int rxcnt=0,error_cnt=0;
	boolean rx_end=FALSE;
	 
    SPI_Port_Set();
    SPI1_Port_Init(1); // Master
    Master_nSS_Con1(1);
	
	//init rSPCON1
	rSPCON1 = (1<<3);
	
    spi1RxStr=(char *) SPI_BUFFER1;
    for(i=0;i<SPI1_COUNT;i++)
    	*(spi1RxStr+i)=0;
    
    rSPPRE1=ClockSelection();	// Baudrate=PCLK/2
	printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE1+1)))/1000000 );
    rSPPIN1=(0<<2)|(1<<1)|(0<<0);

    rSPCON1=SPI_POLLING_MODE|SCKEN|MASTER|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|AUTOGARBAGE;
    Master_nSS_Con1(0); // Activate nSS 
    
    while(rxcnt<SPI1_COUNT)
	{
		if(rSPSTA1&0x6) 
			printf("Data Collision or Multi Master Error\n");

		while((!(rSPSTA1&0x1))&&((rx_end=Uart_GetKey())==0));   //Check ready state
		*spi1RxStr++=rSPRDAT1;	//First Rx data is garbage data
		rxcnt++;
		if(rx_end!=FALSE)
			break;
	}
	
	Master_nSS_Con1(1);
	
	printf("Receive end\n");	
	
	//init rSPCON1
	rSPCON1 = (1<<3);
	
	printf("\nTotal count of received data is %d\n",rxcnt);
	
	spi1RxStr =(char *)SPI_BUFFER1;
#if S3C2460A	
	for(i=2;i<rxcnt;i++)
	{	
		if(*(spi1RxStr+i)!=(i-1))
#elif S3C2460X	
	for(i=1;i<rxcnt;i++)
	{	
		if(*(spi1RxStr+i)!=(i))
#endif
		{
			error_cnt++;
			if(!Uart_GetKey())
				printf("%dth received data error \t=> tx_data : 0x%02x, rx_data : 0x%02x\n",(i-1),(i-1),*(spi1RxStr+i));
			else
				break;
		}
	}
	if(error_cnt==0)
		printf("Test Ok!!!\n");
    
    SPI_Port_Return();
}

void Test_Spi1_S_Tx_Polling(void)
{
    char *rxStr,*txStr,i;
    uint8 txdata[SPI1_COUNT];
	boolean rx_end=FALSE;

    SPI_Port_Set();
    SPI1_Port_Init(0); // Slave (nSS)
	
	//init rSPCON1
	rSPCON1 = (1<<3);
	
	for(i=0;i<SPI1_COUNT;i++)
		txdata[i]=i+1;

	rSPPRE1=ClockSelection();	// Baudrate=PCLK/2
	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=SPI_POLLING_MODE|SCKDIS|SLAVE|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|NORMALMODE;//int,dis-SCK,slave,low,A,normal
	
	i=0;
	while(!Uart_GetKey())
	{
		if(rSPSTA1&0x6) 
			printf("Data Collision \n");
		while((!(rSPSTA1&0x1))&&((rx_end=Uart_GetKey())==0));     //Check ready state
		rSPTDAT1 = txdata[i++];
		if(i==SPI1_COUNT)
			break;
	}
	
	printf("Transmit end\n");
	
	//init rSPCON1
	rSPCON1 = (1<<3);
    	
    SPI_Port_Return();
}


void Test_Spi1_S_Rx_Polling(void)
{
    int i,rxcnt=0,error_cnt=0;
	boolean rx_end=FALSE;

    SPI_Port_Set();
    SPI1_Port_Init(0); // slave
	
	//init rSPCON1
	rSPCON1 = (1<<3);
    
	spi1RxStr=(char *)SPI_BUFFER1;
	for(i=0;i<(SPI1_COUNT);i++)
		*(spi1RxStr+i)=0x0; // Zero Initialize
		
    rSPPRE1=ClockSelection();	// Baudrate=PCLK/2
	printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE1+1)))/1000000 );
    rSPPIN1=(0<<2)|(1<<1)|(0<<0);

    rSPCON1=SPI_POLLING_MODE|SCKDIS|SLAVE|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|AUTOGARBAGE;

	while(rxcnt<SPI1_COUNT)
	{
		if(rSPSTA1&0x6) 
			printf("Data Collision or Multi Master Error\n");

		while((!(rSPSTA1&0x1))&&((rx_end=Uart_GetKey())==0));   //Check ready state
		*spi1RxStr++=rSPRDAT1;	//First Rx data is garbage data
		rxcnt++;
		if(rx_end!=FALSE)
			break;
	}

	rSPCON1=(0<<5)|(0<<4)|(1<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
	
	printf("\nTotal count of received data is %d\n",rxcnt);
	
	spi1RxStr =(char *)SPI_BUFFER1;
#if S3C2460A	
	for(i=2;i<rxcnt;i++)
	{	
		if(*(spi1RxStr+i)!=(i-1))
#elif S3C2460X	
	for(i=1;i<rxcnt;i++)
	{	
		if(*(spi1RxStr+i)!=(i))
#endif	
		{
			error_cnt++;
			if(!Uart_GetKey())
				printf("%dth received data error \t=> tx_data : 0x%02x, rx_data : 0x%02x\n",(i-1),(i-1),*(spi1RxStr+i));
			else
				break;
		}
	}
	if(error_cnt==0)
		printf("Test Ok!!!\n");

	SPI_Port_Return();
}


void __irq Dma3Tx_Int(void)
{
    tx_dma3Done=1;
     rINTMSK|=BIT_DMA_SBUS;
    rINTSUBMSK|=BIT_SUB_DMA3;
    ClearPending(BIT_DMA_SBUS);
    rSUBSRCPND=BIT_SUB_DMA3;
}

void __irq Dma3Rx_Int(void)
{
    rx_dma3Done=1;
    rINTMSK|=BIT_DMA_SBUS;
    rINTSUBMSK|=BIT_SUB_DMA3;
    ClearPending(BIT_DMA_SBUS);
    rSUBSRCPND=BIT_SUB_DMA3;
}

void Test_Spi1_M_Tx_DMA3(void)
{

	int i;
	unsigned char *tx_ptr;

	SPI_Port_Set();
	SPI1_Port_Init(1); // Master(GPIO) 
	printf("[SPI DMA3 Master Tx test]\n");
	printf("This test should be configured two boards\nStart Rx first.\n");

	//init rSPCON1
	rSPCON1 = (1<<3);

	tx_ptr=(unsigned char *) SPI_BUFFER1;
	for(i=0; i<SPI1_COUNT; i++)
		*(tx_ptr+i)=i+1; 

	tx_dma3Done=0;

	pISR_DMA_SBUS= (unsigned)Dma3Tx_Int;
	rINTSUBMSK&=~(BIT_SUB_DMA3);
	rINTMSK&=~(BIT_DMA_SBUS);	
	
    //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;	//
	rSPCON1=(2<<5)|(1<<4)|(1<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);
	
    rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release

     Master_nSS_Con1(0); // Activate nSS
    //Step2. DMA1 init 
    Init_DMA_Regs(3);
    rDISRC3=(unsigned)tx_ptr;	//Address of Memory
    rDISRCC3=(0<<1)|(0);		//AHB(Memory), inc
    rDIDST3=(unsigned)0x44500030;//Address of SPTDAT Register
    rDIDSTC3=(1<<1)|(1);		//APB(SPI), fix
    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(tx_dma3Done==0)
	{
		if(Uart_GetKey())
			break;
	}

    while(!(rSPSTA1&0x1)) // Tx is done
	{
		if(Uart_GetKey())
			break;
	}	

	Master_nSS_Con1(1);//Deactivate nSS
    
	//init rSPCON1
	rSPCON1 = (1<<3);

    printf("\nDMA3 transfer end\n");
    for(i=0; i<SPI1_COUNT-1; i++)
		printf("0x%02x,",*tx_ptr++);
    SPI_Port_Return();
}

void Test_Spi1_M_Rx_DMA3(void)
{
    int i;
    unsigned char *rx_ptr;

    SPI_Port_Set();
    SPI1_Port_Init(1); // Master(GPIO)
    printf("[SPI DMA3 Master Rx Test]\n");
    printf("This test should be configured two boards\nStart Tx first.\n");
    
	//init rSPCON1
	rSPCON1 = (1<<3);

    rx_ptr=(unsigned char *)SPI_BUFFER1;
    for(i=0;i<0x500;i++)
		*(rx_ptr+i)=0x0; // Zero Initialize
    rx_dma3Done=0;

    pISR_DMA_SBUS= (unsigned)Dma3Rx_Int;
    rINTMSK&=~(BIT_DMA_SBUS);
    rINTSUBMSK&=~(BIT_SUB_DMA3);
  
    //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)|(1<<4)|(1<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(1<<0);//DMA3,en-SCK,master,low,A,TAGD    
    
    //When you use [Master Rx with DMA] function you should have to set TAGD bit
    rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release

    Master_nSS_Con1(0);
   
    //Step2. DMA3 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)
	{
		if(Uart_GetKey())
			break;
	}
	*/	

	Master_nSS_Con1(1);
    
	//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));//to remove first dummy data

    printf("\nDMA3 receive end");
    SPI_Port_Return();
}

void Test_Spi1_S_Tx_DMA3(void)
{
    int i;
    unsigned char *tx_ptr;

    SPI_Port_Set();
    SPI1_Port_Init(0); // Slave (nSS)
    printf("[SPI DMA3 Slave Tx test]\n");
    printf("This test should be configured two boards\nStart Tx first.\n");
    
	//init rSPCON1
	rSPCON1 = (1<<3);
	
    tx_ptr=(unsigned char *) SPI_BUFFER1;
    
    for(i=0; i<SPI1_COUNT; i++)
		*(tx_ptr+i)=i+1; 
		
    tx_dma3Done=0;
    pISR_DMA_SBUS= (unsigned)Dma3Tx_Int;
    rINTMSK&=~(BIT_DMA_SBUS);
    rINTSUBMSK&=~(BIT_SUB_DMA3);

    //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;
//    rSPPRE1=0x0;	//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)|(0<<0);//DMA3,dis-SCK,slave,low,A,normal
   
    rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release

    //Step2. DMA1 init 
    Init_DMA_Regs(3);
    rDISRC3=(unsigned)tx_ptr;	//Address of Memory
    rDISRCC3=(0<<1)|(0);		//AHB(Memory), inc
    rDIDST3=(unsigned)0x44500030;//Address of SPTDAT Register
    rDIDSTC3=(1<<1)|(1);		//APB(SPI), fix
    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(tx_dma3Done==0)
	{
		if(Uart_GetKey())
			break;
	}


    while(!(rSPSTA1&0x1)) // Tx is done
	{
		if(Uart_GetKey())
			break;
	}	
    
	//init rSPCON1
	rSPCON1 = (1<<3);
    
    printf("\nDMA3 transfer end\n");
    for(i=0; i<SPI1_COUNT-1; i++)
		printf("0x%02x,",*tx_ptr++);

    SPI_Port_Return();
}

void Test_Spi1_S_Rx_DMA3(void)
{
    int i;
    unsigned char *rx_ptr;

    SPI_Port_Set();
    SPI1_Port_Init(0); // Slave(nSS) 
    printf("[SPI DMA3 Slave Rx Test]\n");
    printf("This test should be configured two boards\nStart Rx first.\n");
    
	//init rSPCON1
	rSPCON1 = (1<<3);
	
    rx_ptr=(unsigned char *) SPI_BUFFER1;
    for(i=0;i<0x500;i++)
		*(rx_ptr+i)=0x0; // Zero Initialize
    rx_dma3Done=0;

    pISR_DMA_SBUS= (unsigned)Dma3Rx_Int;
    rINTMSK&=~(BIT_DMA_SBUS);
    rINTSUBMSK&=~(BIT_SUB_DMA3);

⌨️ 快捷键说明

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