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

📄 spi01.c

📁 三星s3c2460开发板完整功能测试代码
💻 C
📖 第 1 页 / 共 5 页
字号:
    pISR_DMA_SBUS= (unsigned)Dma1Tx_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;
//    rSPPRE1=0x0;	//if PCLK=50Mhz,SPICLK=25Mhz
	printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE0+1)))/1000000 );
   
	rSPCON0=(2<<5)|(0<<4)|(0<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(0<<0);//DMA3,dis-SCK,slave,low,A,normal
   
    rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release

    //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;
	}
    
	//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_S_Rx_DMA1(void)
{
    int i;
    unsigned char *rx_ptr;

    SPI_Port_Set();
    SPI0_Port_Init(0); // Slave(nSS) 
    printf("[SPI DMA1 Slave Rx Test]\n");
    printf("This test should be configured two boards\nStart Rx 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)|(0<<4)|(0<<3)|(SPI0_POLARITY<<2)|(SPI0_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
    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), 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;
	} 
	*/ 

	//init rSPCON1
	rSPCON1 = (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));
    printf("\nDMA1 receive end");
    SPI_Port_Return();
}


void __irq DmaTx_Int(void)
{
	printf("Entered ISR_2\n");
	rINTSUBMSK|=(BIT_SUB_DMA1|BIT_SUB_DMA3);
	rINTMSK|=(BIT_DMA_SBUS);
	if(rSUBSRCPND&(1<<26))
		{		
		rx_dma1Done=1;
		tx_dma1Done=1;
		rSUBSRCPND=BIT_SUB_DMA1;
	    printf("##DMA1 is done##\n");
		}
	else if(rSUBSRCPND&(1<<28))
		{
		rx_dma3Done=1;
		tx_dma3Done=1;
		rSUBSRCPND=BIT_SUB_DMA3;
		printf("##DMA3 is done##\n");
		}
	else
    	{
    	printf("DMA SUB INT Fail\n");
    	}
	ClearPending(BIT_DMA_SBUS);
    rINTMSK &= ~(BIT_DMA_SBUS);
    rINTSUBMSK &= ~(BIT_SUB_DMA1|BIT_SUB_DMA3);	
	//*(rx1_ptr+SPIRX_COUNT)=rSPRDAT1;
}




////////////////////////////// ADD SPI1 transfer /////////////////////////////


void __irq Spi1_Int(void)
{
    unsigned int status;
    rINTMSK|=BIT_IIC_SPI;
    rINTSUBMSK|=BIT_SUB_SPI1;
	
    ClearPending(BIT_IIC_SPI);
    rSUBSRCPND=BIT_SUB_SPI1;
    status=rSPSTA1;
    
    if(status&0x6) 
    	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
  
//    printf("Rx: %c  Tx: %c \n", rSPRDAT1, *spi1TxStr);
    if(*spi1TxStr!='\0') 
    {
    	rSPTDAT1=*spi1TxStr++;
		rINTMSK&=~BIT_IIC_SPI;
		rINTSUBMSK&=~BIT_SUB_SPI1;
    }
    else
    {
        *spi1RxStr='\0';
        end1SpiTx=1;
    }
}

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

    SPI_Port_Set();
    SPI1_Port_Init(1); 
    printf("[SPI1 Interrupt Tx/Rx Self-Test]\n");
    printf("Connect SPIMOSI1 into SPIMISO1.\n");

    pISR_IIC_SPI=(unsigned)Spi1_Int;
    end1SpiTx=0;
 
    spi1TxStr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\n";
    spi1RxStr=(char *) SPI_BUFFER1;
    txStr=(char *)spi1TxStr;
    rxStr=(char *)spi1RxStr;
    rSPPRE1=ClockSelection();	// Baudrate=PCLK/2
	printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE1+1)))/1000000 );
    rSPCON1=(1<<5)|(1<<4)|(1<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//int,en-SCK,master,low,A,normal
    rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
    rINTMSK&=~(BIT_IIC_SPI);
    rINTSUBMSK&=~(BIT_SUB_SPI1);

    while(end1SpiTx==0);

    rSPCON1=(0<<5)|(0<<4)|(1<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
    printf("Tx Strings:%s\n",txStr);
    //printf("Rx Strings:%s :",rxStr+1);//remove first dummy data
    printf("Rx Strings:%s :",rxStr+2);//remove first 2- dummy data
    if(strcmp(rxStr+2,txStr)==0)
        printf("O.K.\n");
    else 
        printf("ERROR!!!\n");
    SPI_Port_Return();
}


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

    SPI_Port_Set();
    SPI1_Port_Init(1); 
    printf("[SPI Polling Tx/Rx Self-Test]\n");
    printf("Connect SPIMOSI1 into SPIMISO1.\n");
    end1SpiTx=0;
    spi1TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\n";
    spi1RxStr=(char *) SPI_BUFFER1;
    txStr=(char *)spi1TxStr;
    rxStr=(char *)spi1RxStr;

    rSPPRE1=ClockSelection();	// Baudrate=PCLK/2
	printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE1+1)))/1000000 );
    rSPCON1=(0<<5)|(1<<4)|(1<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//Polling,en-SCK,master,low,A,normal
    rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
    
    while(end1SpiTx==0)
    {
		if(rSPSTA1&0x1)   //Check Tx ready state    
		{
		  if(*spi1TxStr!='\0')
			rSPTDAT1=*spi1TxStr++;
		  else
			end1SpiTx=1;
		  while(!(rSPSTA1&0x1));   //Check Rx ready state 
		  *spi1RxStr++=rSPRDAT1;
		}
    }

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

///////////////////////////////////////////////////////////////////////////////////////////////////////

uint8 int_txdata[SPI1_COUNT];
uint8 int_rxdata[SPI1_COUNT+2];
uint8 int_tx_cnt=0;
uint8 int_rx_cnt=0;

void __irq Spi1_Tx_Int(void)
{
    unsigned int status;
    rINTMSK|=BIT_IIC_SPI;
    rINTSUBMSK|=BIT_SUB_SPI1;
	
    ClearPending(BIT_IIC_SPI);
    rSUBSRCPND=BIT_SUB_SPI1;
    status=rSPSTA1;
    
    if(status&0x6) 
    	printf("Data Collision or Multi Master Error(0x%x)!!!\n", status);
    while(!(status&0x1));   //Check ready state
  
    if(int_tx_cnt < (SPI1_COUNT)) 
    {
    	rSPTDAT1 = int_txdata[int_tx_cnt++];
		rINTMSK&=~BIT_IIC_SPI;
		rINTSUBMSK&=~BIT_SUB_SPI1;
    }
    else
    {
        end1SpiTx=1;
    }
}

void __irq Spi1_Rx_Int(void)
{
    unsigned int status;
    
    rINTMSK|=BIT_IIC_SPI;
    rINTSUBMSK|=BIT_SUB_SPI1;
	
    ClearPending(BIT_IIC_SPI);
    rSUBSRCPND=BIT_SUB_SPI1;
    status=rSPSTA1;
    
    if(status&0x6) 
    	printf("Data Collision or Multi Master Error(0x%x)!!!\n", status);
    	
    while(!(status&0x1));   //Check ready state
    int_rxdata[int_rx_cnt++]=rSPRDAT1;
    
    if(int_rx_cnt < (SPI1_COUNT+1))
    {
    	rINTMSK&=~BIT_IIC_SPI;
		rINTSUBMSK&=~BIT_SUB_SPI1;
    }
    else
    {
    	end1SpiRx=1;    
    }
    
}

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

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

    pISR_IIC_SPI=(unsigned)Spi1_Tx_Int;
    end1SpiTx=0;
	for(i=0;i<SPI1_COUNT;i++)
		int_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=(1<<5)|(1<<4)|(1<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//int,en-SCK,master,low,A,normal
    
    Master_nSS_Con1(0); // Activate nSS 
    rINTMSK&=~(BIT_IIC_SPI);
    rINTSUBMSK&=~(BIT_SUB_SPI1);
    
    while((end1SpiTx==0)&&(!Uart_GetKey()));
    
    Master_nSS_Con1(1);

	//init rSPCON1
	rSPCON1 = (1<<3);
    
    printf("Tx End...\n");
    printf("Tx data:\n");
    
    for(i=0;i<SPI1_COUNT;i++)
    	printf("0x%02x,",int_txdata[i]);
    
    printf("\n");
    int_tx_cnt = 0;
    
    SPI_Port_Return();
}

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

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

    pISR_IIC_SPI=(unsigned)Spi1_Rx_Int;
    end1SpiRx=0;
	for(i=0;i<(SPI1_COUNT+1);i++)
		int_rxdata[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);//dis-ENMUL,SBO,release
    rSPCON1=(1<<5)|(1<<4)|(1<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(1<<0);//int,en-SCK,master,low,A,normal
    
    Master_nSS_Con1(0); // Activate nSS 
	
    rINTMSK&=~(BIT_IIC_SPI);
    rINTSUBMSK&=~(BIT_SUB_SPI1);
    
    while((end1SpiRx==0)&&(!Uart_GetKey()));
    
    Master_nSS_Con1(1);

	//init rSPCON1
	rSPCON1 = (1<<3);
    
    printf("Rx End...\n");    
    printf("Rx data:\n");
    
    for(i=1;i<(SPI1_COUNT+1);i++)
    	printf("0x%02x,",int_rxdata[i]);
    
    printf("\n");
    int_rx_cnt = 0;
    
    SPI_Port_Return();
}

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

    SPI_Port_Set();
    SPI1_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
	rSPCON1 = (1<<3);
	
    pISR_IIC_SPI=(unsigned)Spi1_Tx_Int;
    end1SpiTx=0;
	for(i=0;i<SPI1_COUNT;i++)
		int_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=(1<<5)|(0<<4)|(0<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//int,dis-SCK,slave,low,A,normal
       
    rINTMSK&=~(BIT_IIC_SPI);
    rINTSUBMSK&=~(BIT_SUB_SPI1);

    while((end1SpiTx==0)&&(!Uart_GetKey()));
    
    //init rSPCON1
	rSPCON1 = (1<<3);
   
    printf("Tx End...\n");
    printf("Tx data:\n");
    
    for(i=0;i<SPI1_COUNT;i++)
    	printf("0x%02x,",int_txdata[i]);
    
    printf("\n");    
    int_tx_cnt = 0;
    
    SPI_Port_Return();
}


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

    SPI_Port_Set();
    SPI1_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
	rSPCON1 = (1<<3);	

    pISR_IIC_SPI=(unsigned)Spi1_Rx_Int;
    end1SpiRx=0;
	for(i=0;i<(SPI1_COUNT+1);i++)
		int_rxdata[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);//dis-ENMUL,SBO,release
    
    rSPCON1=(1<<5)|(0<<4)|(0<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(1<<0);//int,dis-SCK,slave,low,A,normal

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

⌨️ 快捷键说明

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