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

📄 spi.c

📁 三星2413芯片的测试代码,对进行驱动开发很有帮助.
💻 C
📖 第 1 页 / 共 5 页
字号:

void __irq Spi0_M_Int(void)
{
	ClearPending(BIT_SPI0);
	c0++;
	
	if(*spi0TxStr!='\0') {
		WrSPTDAT0(*spi0TxStr++);
		*spi0RxStr++=RdSPRDAT0();	//First Rx data is garbage data
		}
	else
		endSpi0Tx=1;

	if(DCOL0) printf("Data Collision or Multi Master Error!!!\n");
}

void Test_SPI0_S_int(void)// SPI0=Slave
{
	char *txStr,*rxStr;
	c0=0;
	
	printf("[SPI0(Slave Rx) Interrupt test]\n");

	ElaseRxReg();
	endSpi0Tx=0;
	spi0TxStr="zxyvwturspqnolmjkhifgdebcaZXYVWTURSPQNOLMJKHIFGDEBCA8967452301";
	spi0RxStr=(char *) SPI_BUFFER0;						// Rx Buffer to receive

	txStr=(char *)spi0TxStr;
	rxStr=(char *)spi0RxStr;

	SPI_Port_Init(0);
	SPI_Baud_Rate_Set(SPI_CHANNEL0, 25000000);			// SPI Channel 0, 25MHz

	rSPCON0=(1<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//Interrupt,dis-SCK,slave,low,A,normal
	rSPPIN0=(0<<2)|(1<<0);//dis-ENMUL,KEEP

	pISR_SPI0=(unsigned)Spi0_S_Int;
	rINTMSK&=~(BIT_SPI0);

	while(endSpi0Tx==0);

	rINTMSK|=(BIT_SPI0);

	*spi0RxStr++=RdSPRDAT0();	// Get last rx data
	*spi0RxStr='\0'; // attach End of String(Null)
	rxStr+=2;		     // remove first dummy

	printf("Tx Strings:%s\n",txStr);
	printf("Rx Strings:%s :",rxStr);
    
	if(strcmp(rxStr,txStr)==0) printf("O.K.\n");
	else printf("ERROR!!!\n");

	SPI_Port_Return();
	printf("c0=%d\n",c0);
}

void __irq Spi0_S_Int(void)
{
	ClearPending(BIT_SPI0);
	c0++;
	

	*spi0RxStr++=RdSPRDAT0();	//First Rx data is garbage data

	if(*spi0TxStr!='\0') {
		WrSPTDAT0(*spi0TxStr++);
	}
	else
		endSpi0Tx=1;

	if(DCOL0) printf("Data Collision or Multi Master Error!!!\n");
}


void __irq spi_slave_int0(void)
{
	ClearPending(BIT_SPI0);
	interrupt_count[0]++;

	*rx_ptr[0]++=RdSPRDAT0();	//First Rx data is garbage data

	WrSPTDAT0(*tx_ptr[0]++);
	if(DCOL0)
		printf("Data Collision or Multi Master Error!!!\n");
}

void __irq spi_slave_int1(void)
{
	ClearPending(BIT_SPI1);
	interrupt_count[1]++;

	*rx_ptr[1]++=RdSPRDAT1();	//First Rx data is garbage data

	WrSPTDAT1(*tx_ptr[1]++);
	if(DCOL1)
		printf("Data Collision or Multi Master Error!!!\n");
}

void __irq spi_master_int0(void)
{
	ClearPending(BIT_SPI0);
	interrupt_count[0]++;

	WrSPTDAT0(*tx_ptr[0]++);

	*rx_ptr[0]++=RdSPRDAT0();	//First Rx data is garbage data

	if(DCOL0) printf("Data Collision or Multi Master Error!!!\n");
}

void __irq spi_master_int1(void)
{
	ClearPending(BIT_SPI1);
	interrupt_count[1]++;

	WrSPTDAT1(*tx_ptr[1]++);

	*rx_ptr[1]++=RdSPRDAT1();	//First Rx data is garbage data

	if(DCOL1) printf("Data Collision or Multi Master Error!!!\n");
}

void Test_SPI0_M_Tx_DMA(void)// SPI0=Master
{
	int i;

	SPI_Port_Init(0); // SPI0=Master, SPI1=Slave

	printf("[One Board SPI0(Master Tx), Another Board SPI0(Slave Rx) DMA test]\n");
	printf("First Slave is ready? Press any key, Start\n");
	getchar();

	SPI_Baud_Rate_Set(SPI_CHANNEL0,1000000);
	rSPPIN0=(1<<3)|(1<<1)|(1<<0);//Keep
	rSPCON0=(2<<5)|(1<<4)|(1<<3)|(0<<2)|(0<<1)|(0<<0);//DMA,en-SCK,master,low,A,normal

	Master_nSS_Con(0); // Activate nSS 
	Test_Spi0_M_Tx_DMA1_Set();//Master DMA1 setting

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

	printf("Check TC1=%x,  TC3=%x\n",rDSTAT1,rDSTAT3);
	printf("tx_dma1Done=%x, rx_dma3Done=%x\n",tx_dma1Done,rx_dma3Done);

	while(!(rSPSTA0&0x1)) {// Tx is done
		if(Uart_GetKey())
			break;
    	}
	
	Master_nSS_Con(1);
	rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal

	for(i=0; i<spitx_count; i++) {
		printf("0x%04x : ",i);
		printf("0x%02x\n",*tx_ptr[0]);
		tx_ptr[0]++;
		if(Uart_GetKey()) getchar();
	}

	SPI_Port_Return();
}

void Test_SPI0_S_Rx_DMA(void)// SPI0=Master, SPI1=Slave
{
	int i;

	SPI_Port_Init(1);

	printf("[One Board SPI0(Master Tx), Another Board SPI0(Slave Rx) DMA test]\n");

	SPI_Baud_Rate_Set(SPI_CHANNEL0,1000000);
	rSPPIN0=(1<<1)|(1<<0);//Keep
	rSPCON0=(1<<7)|(3<<5)|(0<<4)|(0<<3)|(0<<2)|(0<<1)|(0<<0);//DMA,dis-SCK,slave,low,A,normal
	
	Test_Spi0_S_Rx_DMA3_Set();//Slave DMA3setting

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

	while(!(TXFIFOEMPTY0));	// Wait for FIFO clear

	printf("Check TC1=%x,  TC3=%x\n",rDSTAT1,rDSTAT3);
	printf("tx_dma1Done=%x, rx_dma3Done=%x\n",tx_dma1Done,rx_dma3Done);

	while(!(rSPSTA0&0x1)) {// Tx/Rx is done
		if(Uart_GetKey())
			break;
	}
	
	rSPCON0=(0<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,slave,low,A,normal

	*(rx_ptr[0]+spirx_count+1)=rSPRDATB0;
	rx_ptr[0]=(unsigned char *) DMA3_RxBUFFER1;

	for(i=0; i<spitx_count; i++) {
		printf("0x%04x : ",i);
		printf("0x%02x\n",*(rx_ptr[0]+i+2));
		if(Uart_GetKey()) getchar();
	}

	SPI_Port_Return();	
}

void Test_SPI0_M_Rx_DMA(void)// SPI0=Master
{
	int i;

	SPI_Port_Init(0); // SPI0=Master, SPI1=Slave

	printf("[One Board SPI0(Master Rx), Another Board SPI0(Slave Tx) DMA test]\n");
	printf("First Slave is ready? Press any key, Start\n");
	getchar();

	SPI_Baud_Rate_Set(SPI_CHANNEL0,1000000);
	rSPPIN0=(1<<3)|(1<<1)|(1<<0);//Keep
	rSPCON0=(1<<7)|(3<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(1<<0);//DMA,en-SCK,master,low,A,TAGD

	Master_nSS_Con(0); // Activate nSS 
	Test_Spi0_M_Rx_DMA3_Set();//Master DMA1 setting

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

	printf("Check TC1=%x,  TC3=%x\n",rDSTAT1,rDSTAT3);
	printf("tx_dma1Done=%x, rx_dma3Done=%x\n",tx_dma1Done,rx_dma3Done);

	while(!(rSPSTA0&0x1)) {// Tx is done
		if(Uart_GetKey())
			break;
    	}
	
	Master_nSS_Con(1);
	rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal

	for(i=0; i<spitx_count; i++) {
		printf("0x%04x : ",i);
		printf("0x%02x\n",*(rx_ptr[0]+i+2));
		if(Uart_GetKey()) getchar();
		}

	SPI_Port_Return();	
}

void Test_SPI0_S_Tx_DMA(void)// SPI0=Master
{
	int i;

	SPI_Port_Init(0); // SPI0=Master, SPI1=Slave

	printf("[One Board SPI0(Master Rx), Another Board SPI0(Slave Tx) DMA test]\n");

	SPI_Baud_Rate_Set(SPI_CHANNEL0,1000000);
	rSPPIN0=(0<<3)|(1<<1)|(1<<0);//Keep
	rSPCON0=(2<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//DMA,en-SCK,master,low,A,TAGD

	Test_Spi0_S_Tx_DMA1_Set();//Master DMA1 setting

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

	printf("Check TC1=%x,  TC3=%x\n",rDSTAT1,rDSTAT3);
	printf("tx_dma1Done=%x, rx_dma3Done=%x\n",tx_dma1Done,rx_dma3Done);

	while(!(rSPSTA0&0x1)) {// Tx is done
		if(Uart_GetKey())
			break;
    	}
	
	rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal

	for(i=0; i<spitx_count; i++) {
		printf("0x%04x : ",i);
		printf("0x%02x\n",*tx_ptr[0]);
		tx_ptr[0]++;
		if(Uart_GetKey()) getchar();
		}

	SPI_Port_Return();	
}

void Test_Spi0_S_Tx_DMA1_Set(void)
{
	int i;

	tx_ptr[0]=(unsigned char *) DMA1_TxBUFFER0;	//Tx0 Address Mapping
	for(i=0; i<spitx_count; i++)
		*(tx_ptr[0]+i)=i; 						// Tx Data Initialize

	tx_dma1Done=0;							// DMA is not done

	pISR_DMA1 = (unsigned)Dma1Tx_Int;		// DMA1 ISR Address Mapping
	rINTMSK&=~(BIT_DMA1);    					// Interrupt Mask Disable, Interrupt Enable

	rDISRC1=(unsigned)tx_ptr[0];				//Source Address of Memory
	rDISRCC1=(0<<1)|(0);						//AHB(Memory), inc
	rDIDST1=(unsigned)0x59000010;				//Destination 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);				// HWSRC SPI0 TX
	rDMASKTRIG1=(0<<2)|(1<<1)|(0);    			//run, DMA1 channel on, no-sw trigger 
//	printf("Check TC1=%x\n",rDSTAT1);
//   	printf("**DMA1 setting end**\n");
}

void Test_Spi0_M_Rx_DMA3_Set(void)
{
	int i;
	
	rx_ptr[0]=(unsigned char *) DMA3_RxBUFFER1;	// Rx1 Address Mapping
	for(i=0;i<spirx_count+11;i++)
		*(rx_ptr[0]+i)=0x0; 					// Zero Initialize
	
	rx_dma3Done=0;
	
	pISR_DMA3 = (unsigned)Dma3Rx_Int;
	rINTMSK&=~(BIT_DMA3);	

	rDISRC3=(unsigned)0x59000020;				//Address of SPRDATB0 Register
	rDISRCC3=(1<<1)|(1);						//APB(SPI), fix
	rDIDST3=(unsigned)rx_ptr[0];				//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+2);
	rDMAREQSEL3=(1<<1)|(1<<0);
	rDMASKTRIG3=(0<<2)|(1<<1)|(0);    			//run, DMA1 channel on, no-sw trigger 
}

void Test_Spi0_M_Tx_DMA1_Set(void)
{
	int i;

	tx_ptr[0]=(unsigned char *) DMA1_TxBUFFER0;	//Tx0 Address Mapping
	for(i=0; i<spitx_count; i++)
		*(tx_ptr[0]+i)=i; 						// Tx Data Initialize

	tx_dma1Done=0;							// DMA is not done

	pISR_DMA1 = (unsigned)Dma1Tx_Int;		// DMA1 ISR Address Mapping
	rINTMSK&=~(BIT_DMA1);    					// Interrupt Mask Disable, Interrupt Enable

	rDISRC1=(unsigned)tx_ptr[0];				//Source Address of Memory
	rDISRCC1=(0<<1)|(0);						//AHB(Memory), inc
	rDIDST1=(unsigned)0x59000010;				//Destination 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);				// HWSRC SPI0 TX
	rDMASKTRIG1=(0<<2)|(1<<1)|(0);    			//run, DMA1 channel on, no-sw trigger 
//	printf("Check TC1=%x\n",rDSTAT1);
//   	printf("**DMA1 setting end**\n");
}

void Test_Spi0_S_Rx_DMA3_Set(void)
{
	int i;
	
	rx_ptr[0]=(unsigned char *) DMA3_RxBUFFER1;	// Rx1 Address Mapping
	for(i=0;i<spirx_count+11;i++)
		*(rx_ptr[0]+i)=0x0; 					// Zero Initialize
	
	rx_dma3Done=0;
	
	pISR_DMA3 = (unsigned)Dma3Rx_Int;
	rINTMSK&=~(BIT_DMA3);	

	rDISRC3=(unsigned)0x59000020;				//Address of SPRDATB0 Register
	rDISRCC3=(1<<1)|(1);						//APB(SPI), fix
	rDIDST3=(unsigned)rx_ptr[0];				//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+1);
	rDMAREQSEL3=(1<<1)|(1<<0);
	rDMASKTRIG3=(0<<2)|(1<<1)|(0);    			//run, DMA1 channel on, no-sw trigger 
}

void Test_SPI0_M_DMA_FIFO(void)// SPI0=Master
{
	int i;

	SPI_Port_Init(0); // SPI0=Master, SPI1=Slave

	printf("[One Board SPI0(Master Tx), Another Board SPI0(Slave Rx) DMA test]\n");
	printf("First Slave is ready? Press any key, Start\n");
	getchar();

	rSPCON0=(1<<11)|(1<<10);			// FIFO Clear
	while((rSPCON0>>10)&0x3 == 3);	// Wait for FIFO clear

	SPI_Baud_Rate_Set(SPI_CHANNEL0,25000000);
	Test_Spi0_M_Tx_DMA1_FIFO_Set();//Master DMA1 setting
	
	Master_nSS_Con(0);				// Activate nSS 
	
	rSPPIN0=(1<<3)|(1<<0);			//Feedback Enable, Keep
	rSPFIC0=(2<<8);					// TX FIFO DMA Ctl(Tx Fifo Empty)
	rSPCON0=(1<<8)|(0<<7)|(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//DMA,en-SCK,master,low,A,normal
	
	while(tx_dma1Done==0) {
    		if(Uart_GetKey())
			break;
	}

//	while(!(TXFIFOEMPTY0));	// Wait for FIFO Empty State
	
	printf("Check TC1=%x,  TC3=%x\n",rDSTAT1,rDSTAT3);
	printf("tx_dma1Done=%x, rx_dma3Done=%x\n",tx_dma1Done,rx_dma3Done);

//	while(!(rSPSTA0&0x1)) {// Tx is done
//		if(Uart_GetKey())
//			break;
//	}
	
	Master_nSS_Con(1);
	rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal

	for(i=0; i<spitx_count*4; i++) {
		printf("0x%04x : ",i);
		printf("0x%02x\n",*tx_ptr[0]);
		tx_ptr[0]++;
		if(Uart_GetKey()) getchar();
		}

	SPI_Port_Return();	
}

void Test_Spi0_M_Tx_DMA1_FIFO_Set(void)
{
	int i;

	tx_ptr[0]=(unsigned char *) DMA1_TxBUFFER0;	//Tx0 Address Mapping
	for(i=0; i<spitx_count*4; i++) {
//		*(tx_ptr[0]+i)=i; 						// Tx Data Initialize
		if(i&0x1) *(tx_ptr[0]+i)=0x55;
		else *(tx_ptr[0]+i)=0xaa;
		}

	tx_dma1Done=0;							// DMA is not done
	
	pISR_DMA1 = (unsigned)Dma1Tx_Int;	// DMA1 ISR Address Mapping
	rINTMSK&=~(BIT_DMA1);    					// Interrupt Mask Disable, Interrupt Enable

	rDISRC1=(unsigned)tx_ptr[0];				//Source Address of Memory
	rDISRCC1=(0<<1)|(0);						//AHB(Memory), inc
	rDIDST1=(unsigned)0x59000018;				//Destination Address of SPTXFIFO0 Register
	rDIDSTC1=(1<<1)|(1);						//APB(SPI), fix
	rDCON1=(0<<31)|(0<<30)|(1<<29)|(1<<28)|(0<<27)|(1<<22)|(0<<20)|(spitx_count);	// Demand mode, Burst Transfer
	rDMAREQSEL1=(0<<1)|(1<<0);				// HWSRC SPI0 TX
	rDMASKTRIG1=(0<<2)|(1<<1)|(0);    			//run, DMA1 channel on, no-sw trigger 
}

void Test_SPI0_S_DMA_FIFO(void)// SPI0=Master, SPI1=Slave
{
	int i;

	SPI_Port_Init(1);

	printf("[One Board SPI0(Master Tx), Another Board SPI0(Slave Rx) DMA test]\n");

	rSPCON0=(1<<11)|(1<<10);			// FIFO Clear
	while((rSPCON0>>10)&0x3 == 3);	// Wait for FIFO clear

	SPI_Baud_Rate_Set(SPI_CHANNEL0,25000000);
	Test_Spi0_S_Rx_DMA3_FIFO_Set();//Slave DMA3setting
	
	rSPPIN0=(1<<1)|(1<<0);//CS inactive, Keep
	rSPFIC0=(2<<10);					// RX FIFO DMA Ctl(Rx Fifo Almost Empty)
	rSPCON0=(1<<14)|(1<<9)|(1<<7)|(0<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//DMA,dis-SCK,slave,low,A,normal
	
	while(rx_dma3Done==0) {
		if(Uart_GetKey())

⌨️ 快捷键说明

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