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

📄 spi.c

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

void SPI_loop_test ( ) {
	SPI_port port0, port1;
	char *txStr,*rxStr;

	printf("[SPI Polling Tx/Rx Self-Test]\n");
	printf("Connect SPIMOSI 0 into SPIMISO 0  CON26: (2-3)\n");

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

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

	SPI_Port_Init(1);
	SPI_Baud_Rate_Set(SPI_CHANNEL1, SPI_CLOCK);			// SPI Channel 0, 25MHz

	memset( &port0, 0, sizeof(port0) );
	memset( &port1, 0,sizeof(port1) );

	port0.spi_con.direction = SPI_TX;
	port0.spi_con.mode = SPI_POLLING;
	port0.spi_con.who_sck_en = SPI_MASTER;
	port0.spi_con.who_MSTR = SPI_MASTER;
	port0.spi_con.clock_CPOL = SPI_CLOCK_LOW;
	port0.spi_con.format_CPHA = SPI_FORMAT_A;
	port0.spi_con.garbage_TAGD = SPI_NORMAL_MODE;

	port0.spi_pin_con.feedback_clk_en = SPI_FEEDBACK_ENABLE;
	port0.spi_pin_con.err_detect = SPI_MULTI_MASTER_ERR_DETECT_DISABLE;
	port0.spi_pin_con.cs_out = SPI_CS_ACTIVE;
	port0.spi_pin_con.out_keep = SPI_MASTER_OUT_KEEP_RELEASE;

	rSPCON1 =*((unsigned int *)&port0.spi_con);
	rSPPIN1 = *((unsigned int *)&port0.spi_pin_con);

#if 1
	while(endSpi0Tx==0)
	{
		if(REDY1)   //Check Tx ready state
		{
			if(*spi0TxStr!='\0')
				WrSPTDAT1(*spi0TxStr++);
			else {
				endSpi0Tx=1;
				break;
			}

			while(!(REDY1));   //Check Rx ready state 
				*spi0RxStr++=RdSPRDAT1();
		}
	}
	*spi0RxStr++ = RdSPRDAT1();
	*spi0RxStr='\0'; // attach End of String(Null)
#else
	do {
		while( REDY1 == 0 );

		WrSPTDAT1(*spi0TxStr);

		while( REDY1 == 0 );

		*spi0RxStr++ = RdSPRDAT1();
	}while ( *++spi0TxStr != '\0' );
#endif

	rxStr++;		     // 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");

	while(*rxStr!='\0') {
		printf("%x",*rxStr++);
	}
	SPI_Port_Return();
}

void SPI_master_slave_test ( ) {
	SPI_port port0, port1;
	char *txStr,*rxStr;
	int i=0,j=0;
	int a,b;

	printf("[SPI Polling Tx/Rx Self-Test]\n");
	printf("Connect SPIMOSI 0 into SPIMISO 0  CON26: (2-3)\n");

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

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

	SPI_Port_Init(0);
	SPI_Baud_Rate_Set(SPI_CHANNEL0, SPI_CLOCK);			// SPI Channel 0, 25MHz
//	SPI_Port_Init(1);
	SPI_Baud_Rate_Set(SPI_CHANNEL1, SPI_CLOCK);			// SPI Channel 0, 25MHz

	memset( &port0, 0, sizeof(port0) );
	memset( &port1, 0,sizeof(port1) );
//	rSPCON0=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Polling,en-SCK,master,low,A,normal
//	rSPPIN0=(1<<3)|(1<<0);//Feedback Clock Enable, Master Out Keep
	
	port0.spi_con.direction = SPI_RX;
	port0.spi_con.mode = SPI_POLLING;
	port0.spi_con.who_sck_en = SPI_SLAVE;
	port0.spi_con.who_MSTR = SPI_SLAVE;
	port0.spi_con.clock_CPOL = SPI_CLOCK_LOW;
	port0.spi_con.format_CPHA = SPI_FORMAT_B;
	port0.spi_con.garbage_TAGD = SPI_NORMAL_MODE;

	port0.spi_pin_con.feedback_clk_en = SPI_FEEDBACK_ENABLE;
	port0.spi_pin_con.err_detect = SPI_MULTI_MASTER_ERR_DETECT_DISABLE;
	port0.spi_pin_con.cs_out = SPI_CS_INACTIVE;
	port0.spi_pin_con.out_keep = SPI_MASTER_OUT_KEEP_RELEASE;

//	rSPCON0=(0<<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

//rSPCON0=(0<<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

	port1.spi_con.direction = SPI_TX;
	port1.spi_con.mode = SPI_POLLING;
	port1.spi_con.who_sck_en = SPI_MASTER;
	port1.spi_con.who_MSTR = SPI_MASTER;
	port1.spi_con.clock_CPOL = SPI_CLOCK_LOW;
	port1.spi_con.format_CPHA = SPI_FORMAT_A;
	port1.spi_con.garbage_TAGD = SPI_NORMAL_MODE;

	port1.spi_pin_con.feedback_clk_en = SPI_FEEDBACK_DISABLE;
	port1.spi_pin_con.err_detect = SPI_MULTI_MASTER_ERR_DETECT_DISABLE;
	port1.spi_pin_con.cs_out = SPI_CS_ACTIVE;
	port1.spi_pin_con.out_keep = SPI_MASTER_OUT_KEEP_RELEASE;

	rSPCON0 =*((unsigned int *)&port0.spi_con);
	rSPPIN0 = *((unsigned int *)&port0.spi_pin_con);

	rSPCON1 =*((unsigned int *)&port1.spi_con);
	rSPPIN1 = *((unsigned int *)&port1.spi_pin_con);
	
//	rSPCON0=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Polling,en-SCK,master,low,A,normal
//	rSPPIN0=(1<<3)|(1<<0);//Feedback Clock Enable, Master Out Keep

//	Master_nSS_Con(0); // Activate nSS

	memset ( (void*)spi0RxStr, 0, 110 );
	memset ( (void*)spi0TxStr, 0, 110 );
	while(1)
	{
		a=1;b=1;
		while ( a==1 || b==1 ) {
			if ( a == 1 && REDY0 == 1 ) {
				WrSPTDAT0('a');
				a = 0;
			}
			if ( b== 1 && REDY1 == 1 ) {
				WrSPTDAT1('b');
				b = 0;
			}
		}

		while ( a==0 || b==0 ) {
			if ( a == 0 && REDY0 == 1 ) {
				*spi0RxStr++=RdSPRDAT0();
				a = 1;
			}
			if ( b== 0 && REDY1 == 1 ) {
				*spi0TxStr++=RdSPRDAT1();
				b = 1;
			}
		}
		
		if ( i++ > 100 )
			break;
	}
//	*spi0RxStr++=RdSPRDAT0();
	*spi0RxStr='\0'; // attach End of String(Null)

//	rxStr++;		     // remove first dummy
	printf("Tx Strings:%s\n",txStr);
	printf("Rx Strings:%s\n",rxStr);

	printf ("SPI DONE\n");
	SPI_Port_Return();
}


void SPI_master_master_test ( ) {
	SPI_port port0, port1;
	char *txStr,*rxStr;
	int i=0,j=0;
	int a,b;

	printf("[SPI Polling Tx/Rx Self-Test]\n");
	printf("Connect SPIMOSI 0 into SPIMISO 0  CON26: (2-3)\n");

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

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

	SPI_Port_Init(1);
	SPI_Baud_Rate_Set(SPI_CHANNEL0, SPI_CLOCK);			// SPI Channel 0, 25MHz
//	SPI_Port_Init(1);
	SPI_Baud_Rate_Set(SPI_CHANNEL1, SPI_CLOCK);			// SPI Channel 0, 25MHz

	memset( &port0, 0, sizeof(port0) );
	memset( &port1, 0,sizeof(port1) );
//	rSPCON0=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Polling,en-SCK,master,low,A,normal
//	rSPPIN0=(1<<3)|(1<<0);//Feedback Clock Enable, Master Out Keep

	port0.spi_con.direction = SPI_TX;
	port0.spi_con.mode = SPI_POLLING;
	port0.spi_con.who_sck_en = SPI_MASTER;
	port0.spi_con.who_MSTR = SPI_MASTER;
	port0.spi_con.clock_CPOL = SPI_CLOCK_LOW;
	port0.spi_con.format_CPHA = SPI_FORMAT_A;
	port0.spi_con.garbage_TAGD = SPI_NORMAL_MODE;

	port0.spi_pin_con.feedback_clk_en = SPI_FEEDBACK_DISABLE;
	port0.spi_pin_con.err_detect = SPI_MULTI_MASTER_ERR_DETECT_DISABLE;
	port0.spi_pin_con.cs_out = SPI_CS_ACTIVE;
	port0.spi_pin_con.out_keep = SPI_MASTER_OUT_KEEP_DRIVE;

//rSPCON0=(0<<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

	port1.spi_con.direction = SPI_TX;
	port1.spi_con.mode = SPI_POLLING;
	port1.spi_con.who_sck_en = SPI_MASTER;
	port1.spi_con.who_MSTR = SPI_MASTER;
	port1.spi_con.clock_CPOL = SPI_CLOCK_LOW;
	port1.spi_con.format_CPHA = SPI_FORMAT_A;
	port1.spi_con.garbage_TAGD = SPI_NORMAL_MODE;

	port1.spi_pin_con.feedback_clk_en = SPI_FEEDBACK_DISABLE;
	port1.spi_pin_con.err_detect = SPI_MULTI_MASTER_ERR_DETECT_DISABLE;
	port1.spi_pin_con.cs_out = SPI_CS_ACTIVE;
	port1.spi_pin_con.out_keep = SPI_MASTER_OUT_KEEP_DRIVE;

	rSPCON0 =*((unsigned int *)&port0.spi_con);
	rSPPIN0 = *((unsigned int *)&port0.spi_pin_con);

	rSPCON1 =*((unsigned int *)&port1.spi_con);
	rSPPIN1 = *((unsigned int *)&port1.spi_pin_con);
	
//	rSPCON0=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Polling,en-SCK,master,low,A,normal
//	rSPPIN0=(1<<3)|(1<<0);//Feedback Clock Enable, Master Out Keep

//	Master_nSS_Con(0); // Activate nSS

	memset ( (void*)spi0RxStr, 0, 110 );
	memset ( (void*)spi0TxStr, 0, 110 );
	while(1)
	{
		a=1;b=1;
		while ( a==1 || b==1 ) {
			if ( a == 1 && REDY0 == 1 ) {
				WrSPTDAT0('a');
				a = 0;
			}
			if ( b== 1 && REDY1 == 1 ) {
				WrSPTDAT1('b');
				b = 0;
			}
		}

		while ( a==0 || b==0 ) {
			if ( a == 0 && REDY0 == 1 ) {
				*spi0RxStr++=RdSPRDAT0();
				a = 1;
			}
			if ( b== 0 && REDY1 == 1 ) {
				*spi0TxStr++=RdSPRDAT1();
				b = 1;
			}
		}
		
		if ( i++ > 100 )
			break;
	}
//	*spi0RxStr++=RdSPRDAT0();
	*spi0RxStr='\0'; // attach End of String(Null)

	rxStr++;		     // remove first dummy
	printf("Tx Strings:%s\n",txStr);
	printf("Rx Strings:%s\n",rxStr);

	printf ("SPI DONE\n");
	SPI_Port_Return();
}

void SPI_master_loop_int_test(void ) {
	char *txStr,*rxStr;
	c0=0;
	
	printf("[One Board SPI0(Master Tx), Another Board SPI0(Slave Rx) Interrupt test]\n");
	printf("First Slave is ready? Press any key, Start\n");
	getchar();

	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, SPI_CLOCK);			// SPI Channel 0, 25MHz

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

	Master_nSS_Con(0); // Activate nSS 
	pISR_SPI0=(unsigned)Spi0_M_Int;
	rINTMSK&=~(BIT_SPI0);

	while(endSpi0Tx==0);

	rINTMSK|=(BIT_SPI0);
	Master_nSS_Con(1); // Activate nSS 

	*spi0RxStr++=RdSPRDAT0();	// Get last rx data
	*spi0RxStr='\0'; // attach End of String(Null)
	rxStr++;		     // 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 spi_release_transmission( SPI_channel port ) {
	if( port == SPI_CHANNEL0 ) {
	//	rSPPIN0 = 0;
	//	rSPCON0 = 0;
		rSPPIN0 |= (1<<1);
		rSPCON0 |= (1<<11)|(1<<10);
		rSPCON0 &= ~((3<<8)|(1<<4));
	}
	else {
	//	rSPPIN1 = 0;
	//	rSPCON1 = 0;
		rSPPIN1 |= (1<<1);
		rSPCON1 |= (1<<11)|(1<<10);
		rSPCON1 &= ~((3<<8)|(1<<4));
	}
}

static void __irq spi_dma_done0(void)
{
	ClearPending(BIT_DMA0);
	spi_dma_done[0] = 1;
	printf("spi_dma_done0\n" );
}

static void __irq spi_dma_done1(void)
{
	ClearPending(BIT_DMA1);
	spi_dma_done[1] = 1;
	printf("spi_dma_done1\n" );
}

static void __irq spi_dma_done2(void)
{
	ClearPending(BIT_DMA2);
	spi_dma_done[2] = 1;
	printf("spi_dma_done2\n" );
}

static void __irq spi_dma_done3(void)
{
	ClearPending(BIT_DMA3);
	spi_dma_done[3] = 1;
	printf("spi_dma_done3\n" );
}

void Test_Spi_DMA_Set(int dma_channel, SPI_channel spi_channel, unsigned char* tx_buf,
					unsigned char* rx_buf, SPI_direction rxtx, int withFIFO) {
	unsigned int tsz = 0, dsz=0, tc;
	int dma_request_source;
	int incDISRCC=0, incDIDSTC=0;
	DMA *pDMA;
	
	tsz = (withFIFO == TRUE) ? (1) : (0);

	if ( spi_channel == SPI_CHANNEL0 ) {
		dma_request_source = (rxtx == SPI_TX ) ? (0) : (1);
	}
	else if ( spi_channel == SPI_CHANNEL1 ) {
		dma_request_source = (rxtx == SPI_TX ) ? (2) : (3);
	}
	else {
		printf ( "dma is not support channel : %d\n", spi_channel);
		return;
	}
	
	switch(dma_channel) {
		case 0:
			pISR_DMA0=(int)spi_dma_done0;
			rINTMSK&=~(BIT_DMA0);
			pDMA=(void *)0x4b000000;
			break;
		case 1:
			pISR_DMA1=(int)spi_dma_done1;
			rINTMSK&=~(BIT_DMA1);
			pDMA=(void *)0x4b000040;
			break;
		case 2:
			pISR_DMA2=(int)spi_dma_done2;
			rINTMSK&=~(BIT_DMA2);
			pDMA=(void *)0x4b000080;
			break;
		case 3:
			pISR_DMA3=(int)spi_dma_done3;
			rINTMSK&=~(BIT_DMA3);
			pDMA=(void *)0x4b0000c0;
			break;
		default:
			printf ( "channel error :%d\n", dma_channel );
			return;
	}

	spi_dma_done[dma_channel] = 0;
	tc = RXTX_SIZE / (1<<dsz);
	tc = ( tsz == 1 ) ? tc/4 : tc;
	tc = (tc>0xfffff)?(0xfffff):(tc);

	if ( rxtx == SPI_TX ) {
		if ( withFIFO == TRUE ) {
			if ( spi_channel == SPI_CHANNEL0 ) {
				rx_buf = (unsigned char*)0x59000018;
			}
			else {
				rx_buf = (unsigned char*)0x59000118;
			}
			
		}
		else {
			if ( spi_channel == SPI_CHANNEL0 ) {
				rx_buf = (unsigned char*)0x59000010;
			}
			else {
				rx_buf = (unsigned char*)0x59000110;
			}
		}
		incDIDSTC = 1;
		incDISRCC = 0;
	}
	else {
		if ( withFIFO == TRUE ) {
			if ( spi_channel == SPI_CHANNEL0 ) {
				tx_buf = (unsigned char*)0x5900001C;
			}
			else {
				tx_buf = (unsigned char*)0x5900011C;
			}
		}
		else {
			if ( spi_channel == SPI_CHANNEL0 ) {
				tx_buf = (unsigned char*)0x59000014;

⌨️ 快捷键说明

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