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

📄 spi01.c

📁 三星s3c2460开发板完整功能测试代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	//init rSPCON1
	rSPCON0 = (1<<3);
    
    printf("Rx End...\n");    
    printf("Rx data:\n");
    
    for(i=1;i<(SPI0_COUNT+1);i++)
    	printf("0x%02x,",int_rx0data[i]);
    
    printf("\n");
    int_rx0_cnt = 0;
    
    SPI_Port_Return();
}

void Test_Spi0_S_Tx_Int(void)
{
    char *rxStr,*txStr,i;

    SPI_Port_Set();
    SPI0_Port_Init(0); // Slave (nSS)
    printf("[SPI Interrupt Slave TxRx  test]\n");
    printf("This test should be configured two boards\nStart Slave TxRx first.\n");
    
	//init rSPCON1
	rSPCON0 = (1<<3);
	
    pISR_IIC_SPI=(unsigned)Spi0_Tx_Int;
    end0SpiTx=0;
	for(i=0;i<SPI0_COUNT;i++)
		int_tx0data[i]=i+1;
		
    rSPPRE0=ClockSelection();	// Baudrate=PCLK/2
	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);//int,dis-SCK,slave,low,A,normal
       
    rINTMSK&=~(BIT_IIC_SPI);
    rINTSUBMSK&=~(BIT_SUB_SPI0);

    while((end0SpiTx==0)&&(!Uart_GetKey()));
    
    //init rSPCON1
	rSPCON0 = (1<<3);
   
    printf("Tx End...\n");
    printf("Tx data:\n");
    
    for(i=0;i<SPI0_COUNT;i++)
    	printf("0x%02x,",int_tx0data[i]);
    
    printf("\n");    
    int_tx0_cnt = 0;
    
    SPI_Port_Return();
}


void Test_Spi0_S_Rx_Int(void)
{
    char *rxStr,*txStr,i,rx_tmp;

    SPI_Port_Set();
    SPI0_Port_Init(0); // Slave (nSS)
    printf("[SPI Interrupt Slave TxRx  test]\n");
    printf("This test should be configured two boards\nStart Slave TxRx first.\n");
	//init rSPCON1
	rSPCON0 = (1<<3);	

    pISR_IIC_SPI=(unsigned)Spi0_Rx_Int;
    end0SpiRx=0;
	for(i=0;i<(SPI0_COUNT+1);i++)
		int_rx0data[i]=0;
	
    rSPPRE0=ClockSelection();	// Baudrate=PCLK/2
	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)|(1<<0);//int,dis-SCK,slave,low,A,normal

       
    rINTMSK&=~(BIT_IIC_SPI);
    rINTSUBMSK&=~(BIT_SUB_SPI0);

    while((end0SpiRx==0)&&(!Uart_GetKey()));
    
	//init rSPCON1
	rSPCON0 = (1<<3);    	
    
    printf("Rx End...\n");
    printf("Rx data:\n");
    
    int_rx0data[SPI0_COUNT+1]=rSPRDAT0;
    
    for(i=2;i<(SPI0_COUNT+2);i++)
    	printf("0x%02x,",int_rx0data[i]);
    
    printf("\n");
    int_rx0_cnt = 0;
    
    SPI_Port_Return();
}

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


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

    SPI_Port_Set();
	Master_nSS_Con0(1);
	Master_nSS_Con0(1);
	
	//init rSPCON1
	rSPCON0 = (1<<3);
	
	for(i=0;i<SPI0_COUNT;i++)
		txdata[i]=i+1;
		
	rSPPRE0=ClockSelection();	// Baudrate=PCLK/2
	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=SPI_POLLING_MODE|SCKEN|MASTER|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|NORMALMODE;//int,dis-SCK,slave,low,A,normal
	Master_nSS_Con0(0);
	
	i=0;
	while(!Uart_GetKey())
	{
		if(rSPSTA0&0x6) 
			printf("Data Collision \n");
		while((!(rSPSTA0&0x1))&&((rx_end=Uart_GetKey())==0));  //Check ready state
		rSPTDAT0 = txdata[i++];
		if(i==SPI0_COUNT)
			break;
	}
	
	Master_nSS_Con0(1);	
	
	printf("Transmit end\n");
	
	//init rSPCON1
	rSPCON0 = (1<<3);
			
	SPI_Port_Return();
}

void Test_Spi0_M_Rx_Polling(void)
{
    char *rxStr,i;
    int rxcnt=0,error_cnt=0;
	boolean rx_end=FALSE;
	 
    SPI_Port_Set();
    SPI0_Port_Init(1); // Master
    Master_nSS_Con0(1);
	
	//init rSPCON1
	rSPCON0 = (1<<3);
	
    spi0RxStr=(char *) SPI_BUFFER0;
    for(i=0;i<SPI0_COUNT;i++)
    	*(spi0RxStr+i)=0;
    
    rSPPRE0=ClockSelection();	// Baudrate=PCLK/2
	printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE0+1)))/1000000 );
    rSPPIN0=(0<<2)|(1<<1)|(0<<0);

    rSPCON0=SPI_POLLING_MODE|SCKEN|MASTER|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|AUTOGARBAGE;
    Master_nSS_Con0(0); // Activate nSS 
    
    while(rxcnt<SPI0_COUNT)
	{
		if(rSPSTA0&0x6) 
			printf("Data Collision or Multi Master Error\n");

		while((!(rSPSTA0&0x1))&&((rx_end=Uart_GetKey())==0));   //Check ready state
		*spi0RxStr++=rSPRDAT0;	//First Rx data is garbage data
		rxcnt++;
		if(rx_end!=FALSE)
			break;
	}
	
	Master_nSS_Con0(1);
	
	printf("Receive end\n");	
	
	//init rSPCON1
	rSPCON0 = (1<<3);
	
	printf("\nTotal count of received data is %d\n",rxcnt);
	
	spi0RxStr =(char *)SPI_BUFFER0;
	for(i=2;i<rxcnt;i++)
	{
		if(*(spi0RxStr+i)!=(i-1))
		{
			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_Spi0_S_Tx_Polling(void)
{
    char *rxStr,*txStr,i;
    uint8 txdata[SPI0_COUNT];
	boolean rx_end=FALSE;

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

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


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

    SPI_Port_Set();
    SPI0_Port_Init(0); // slave
	
	//init rSPCON1
	rSPCON0 = (1<<3);
    
	spi0RxStr=(char *)SPI_BUFFER0;
	for(i=0;i<(SPI0_COUNT);i++)
		*(spi0RxStr+i)=0x0; // Zero Initialize
		
    rSPPRE0=ClockSelection();	// Baudrate=PCLK/2
	printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE0+1)))/1000000 );
    rSPPIN0=(0<<2)|(1<<1)|(0<<0);

    rSPCON0=SPI_POLLING_MODE|SCKDIS|SLAVE|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|AUTOGARBAGE;

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

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

	rSPCON0=(0<<5)|(0<<4)|(1<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
	
	printf("\nTotal count of received data is %d\n",rxcnt);
	
	spi0RxStr =(char *)SPI_BUFFER0;
	for(i=2;i<rxcnt;i++)
	{
		if(*(spi0RxStr+i)!=(i-1))
		{
			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 Dma1Tx_Int(void)
{
    tx_dma1Done=1;
    rINTMSK|=BIT_DMA_SBUS;
    rINTSUBMSK|=BIT_SUB_DMA1;
    ClearPending(BIT_DMA_SBUS);
    rSUBSRCPND=BIT_SUB_DMA1;
}

void __irq Dma1Rx_Int(void)
{
    rx_dma1Done=1;
    rINTMSK|=BIT_DMA_SBUS;
    rINTSUBMSK|=BIT_SUB_DMA1;
    ClearPending(BIT_DMA_SBUS);
    rSUBSRCPND=BIT_SUB_DMA1;
}

void Test_Spi0_M_Tx_DMA1(void)
{

    int i;
    unsigned char *tx_ptr;
    
    SPI_Port_Set();
    SPI0_Port_Init(1); // Master(GPIO) 
    printf("[SPI DMA1 Master Tx test]\n");
    printf("This test should be configured two boards\nStart Rx first.\n");
    
	//init rSPCON1
	rSPCON0 = (1<<3);

    tx_ptr=(unsigned char *) SPI_BUFFER0;
    for(i=0; i<SPI0_COUNT; i++)
		*(tx_ptr+i)=i+1; 

    tx_dma1Done=0;

   pISR_DMA_SBUS= (unsigned)Dma1Tx_Int;
   rINTSUBMSK&=~(BIT_SUB_DMA1);
   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) ) rSPPRE0 = 0;
    else rSPPRE0 = i;
	printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE0+1)))/1000000 );
    
//  rSPPRE1=0x0;	//
	rSPCON0=(2<<5)|(1<<4)|(1<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(0<<0);
	
    rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release

     Master_nSS_Con0(0); // Activate nSS
    //Step2. DMA1 init 
    Init_DMA_Regs(1);
    rDISRC1=(unsigned)tx_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)|(SPI0_COUNT);
    //handshake, sync PCLK, TC int, single tx, single service, SPI, H/W request, 
    //off-reload, byte, 128Bytes
    rDMAREQSEL1=(0<<1)|(1<<0);
    rDMASKTRIG1=(0<<2)|(1<<1)|(0);    //run, DMA1 channel on, no-sw trigger 

    while(tx_dma1Done==0)
	{
		if(Uart_GetKey())
			break;
	}

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

	Master_nSS_Con0(1);//Deactivate nSS
    
	//init rSPCON1
	rSPCON0 = (1<<3);
	
    printf("\nDMA1 transfer end\n");
    for(i=0; i<SPI0_COUNT-1; i++)
		printf("0x%02x,",*tx_ptr++);
    SPI_Port_Return();
}

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

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

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

    pISR_DMA_SBUS= (unsigned)Dma1Rx_Int;
    rINTMSK&=~(BIT_DMA_SBUS);
    rINTSUBMSK&=~(BIT_SUB_DMA1);
  
    //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) ) rSPPRE0 = 0;
    else rSPPRE0 = i;
	printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE0+1)))/1000000 );
//    rSPPRE1=0x0 ;	//if PCLK=50Mhz,SPICLK=25Mhz

    rSPCON0=(2<<5)|(1<<4)|(1<<3)|(SPI0_POLARITY<<2)|(SPI0_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
    rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release

    Master_nSS_Con0(0);
   
    //Step2. DMA3 init 
    Init_DMA_Regs(1);
    rDISRC1=(unsigned)0x44500014;//Address of SPRDAT Register
    rDISRCC1=(1<<1)|(1);		//APB(SPI), fix
    rDIDST1=(unsigned)rx_ptr;	//Address of Memory
    rDIDSTC1=(0<<1)|(0);		//AHB(Memory), inc
    rDCON1=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<22)|(0<<20)|(SPI0_COUNT);
    //handshake, sync PCLK, TC int, single tx, single service, SPI, H/W request, 
    //off-reload, byte, 128Bytes
    rDMAREQSEL1=(0<<1)|(1<<0);
    rDMASKTRIG1=(0<<2)|(1<<1)|(0);    //run, DMA1 channel on, no-sw trigger 

    while(rx_dma1Done==0)
	{
		if(Uart_GetKey())
			break;
	}

	/*
    while(!rSPSTA0&0x1) //Tx is done!
	{
		if(Uart_GetKey())
			break;
	}
	*/
	
	Master_nSS_Con0(1);
    
	//init rSPCON1
	rSPCON0 = (1<<3);
	
    *(rx_ptr+SPI0_COUNT)=rSPRDAT0;
    rx_ptr=(unsigned char *)SPI_BUFFER0;
         
    for(i=1;i<(SPI0_COUNT+1);i++)
		printf("0x%02x,",*(rx_ptr+i));//to remove first dummy data

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

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

    SPI_Port_Set();
    SPI0_Port_Init(0); // Slave (nSS)
    printf("[SPI DMA1 Slave Tx test]\n");
    printf("This test should be configured two boards\nStart Tx first.\n");
    
	//init rSPCON1
	rSPCON0 = (1<<3);
	
    tx_ptr=(unsigned char *) SPI_BUFFER0;
    for(i=0; i<SPI0_COUNT; i++)
		*(tx_ptr+i)=i;
    tx_dma1Done=0;

⌨️ 快捷键说明

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