📄 spi01.c
字号:
/************************
SPI One board Test
SPI0: Master Tx
SPI1: Slave Rx
************************/
#include <string.h>
#include "24a0addr.h"
#include "24a0lib.h"
#include "spi01.h"
#include "def.h"
#define spitx_count 0x50
#define spirx_count 0x50
#define SPI_BUFFER0 _NONCACHE_STARTADDRESS
#define SPI_BUFFER1 _NONCACHE_STARTADDRESS+0x1000
#define DMA1_RxBUFFER0 _NONCACHE_STARTADDRESS+0x2000
#define DMA1_TxBUFFER0 _NONCACHE_STARTADDRESS+0x3000
#define DMA3_RxBUFFER1 _NONCACHE_STARTADDRESS+0x4000
#define DMA3_TxBUFFER1 _NONCACHE_STARTADDRESS+0x5000
#define FORMAT0_A 1
#define FORMAT1_A 1
void __irq Spi0_Int(void);
void __irq Spi1_Int(void);
void __irq Dma1Tx_Int(void);//SPI 0
void __irq DmaTx_Int(void);
volatile char *spi0TxStr,*spi0RxStr;
volatile char *spi1TxStr,*spi1RxStr;
volatile int end0SpiTx;
volatile int endSpi1Tx;
unsigned char *tx0_ptr;
unsigned char *tx1_ptr;
unsigned char *rx0_ptr;
unsigned char *rx1_ptr;
int c1,c0;
volatile int tx_dma1Done;
volatile int rx_dma1Done;
volatile int tx_dma3Done;
volatile int rx_dma3Done;
//unsigned int spi0_rGPCON_U, spi0_rGPCON_L,spi0_rGPDAT,spi0_rGPUP;
unsigned int spi_rGPCON_U, spi_rGPCON_M, spi_rGPCON_L,spi_rGPDAT,spi_rGPUP;
/****************************************************************
* SMDK24A0 SPI configuration *
* GP15=XspiMOSI1, GP16=XspiMISO, GP17=XspiCLK *
****************************************************************/
void * spi_func[][2]=
{
(void*) Test_Spi0_MS_int, "SPI0 RxTx Int ",
(void *)Test_Spi0_MS_poll, "SPI0 RxTx POLL ",
(void *)Test_Spi01_MS_Int, "SPI0:Master, SPI1:Slave INT ",
(void *)Test_Spi01_SM_Int, "SPI0:Slave, SPI1:Master INT ",
(void *)Test_SPI01_MS_DMA, "SPI0:Master(Tx), SPI1:Slave(Rx) DMA",
(void *)Test_SPI01_MS_DMA_RxTx, "SPI0:Master(Rx), SPI1:Slave(Tx) DMA",
(void *)Test_Spi01_SM_DMA_RxTx, "SPI0:Slave(Rx), SPI1:Master(Tx) DMA",
(void *)Test_Spi01_SM_DMA_TxRx, "SPI0:Slave(Tx), SPI1:Master(Rx) DMA",
0,0
};
void Ch15_SPI(void)
{
while(1)
{
int i = 0;
Uart_Printf("\n");
while(1)
{ //display menu
Uart_Printf("%2d:%s\n",i,spi_func[i][1]);
i++;
if((int)(spi_func[i][0])==0)
{
Uart_Printf("\n");
break;
}
//if((i%3)==0)
//Uart_Printf("\n");
}
Uart_Printf("\nSelect the function to test : ");
i = Uart_GetIntNum();
Uart_Printf("\n");
if(i==-1) break;
if(i>=0 && (i<(sizeof(spi_func)/8)) )
( (void (*)(void)) (spi_func[i][0]) )();
}
}
void __irq Spi0_Int(void)
{
unsigned int status;
ClearPending(BIT_SPI0);
status=rSPSTA0;
c0++;
if(status&0x6)
Uart_Printf("Data Collision or Multi Master Error(0x%x)!!!\n", status);
while(!(status&0x1)); //Check ready state
*spi0RxStr++=rSPRDAT0; //First Rx data is garbage data
if(*spi0TxStr!='\0')
rSPTDAT0=*spi0TxStr++;
else
{
rINTMSK|=BIT_SPI0;
end0SpiTx=1;
}
}
void __irq Spi1_Int(void)
{
unsigned int status;
rSUBSRCPND|=(BIT_SUB_SPI1);
ClearPending(BIT_VLX_SPI1);
status=rSPSTA1;
c1++;
if(status&0x6)
Uart_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
if(*spi1TxStr!='\0')
rSPTDAT1=*spi1TxStr++;
else
{
rINTMSK|=(BIT_VLX_SPI1);
rINTSUBMSK|=(BIT_SUB_SPI1);
endSpi1Tx=1;
}
}
void SPI0_Port_Init(MASorSLV)
{
// SPIO1 setting
spi_rGPCON_U=rGPCON_U;
spi_rGPCON_M=rGPCON_M;
spi_rGPCON_L=rGPCON_L;
spi_rGPDAT=rGPDAT;
spi_rGPUP=rGPPU;
rGPPU|=(1<<15)|(1<<16)|(1<<17);//Pull up Disable sclk,MISO, MOSI.
rGPCON_M|=(3<<8)|(3<<10)|(3<<12); //GP15(MOSI),GP16(MISO),GP17(SCLK)
if(MASorSLV==1)
{
rGPDAT|=(1<<8); // Master(GPIO8_Output=High)
rGPCON_L=(rGPCON_L&0x3cffff)|(0x1<<16); // Master(GPIO8_Output)
}
}
void SPI0_Port_Return(void)
{
rGPCON_U=spi_rGPCON_U;
rGPCON_M=spi_rGPCON_M;
rGPCON_L=spi_rGPCON_L;
rGPDAT=spi_rGPDAT;
rGPPU=spi_rGPUP;
}
void Master_nSS_Con(int Set)
{
rGPDAT=rGPDAT&~(1<<8)|(Set<<8);
}
void Test_Spi0_MS_int(void)
{
char *txStr,*rxStr;
SPI0_Port_Init(1);
Uart_Printf("[SPI0 Interrupt Tx/Rx Self-Test]\n");
Uart_Printf("Connect SPIMOSI0 into SPIMISO0.\n");
pISR_SPI0=(unsigned)Spi0_Int;
end0SpiTx=0;
spi0TxStr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
spi0RxStr=(char *) SPI_BUFFER0;
txStr=(char *)spi0TxStr;
rxStr=(char *)spi0RxStr;
rSPPRE0=0x0; // Baudrate=PCLK/2
rSPCON0=(1<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//int,en-SCK,master,low,A,normal
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
rINTMSK=~(BIT_SPI0);
while(end0SpiTx==0);
rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
*spi0RxStr='\0';//attach End of String(Null)
Uart_Printf("Tx Strings:%s\n",txStr);
Uart_Printf("Rx Strings:%s :",rxStr+1);//remove first dummy data
if(strcmp(rxStr+1,txStr)==0)
Uart_Printf("O.K.\n");
else
Uart_Printf("ERROR!!!\n");
SPI0_Port_Return();
}
void Test_Spi0_MS_poll(void)
{
char *txStr,*rxStr;
SPI0_Port_Init(1);
Uart_Printf("[SPI Polling Tx/Rx Self-Test]\n");
Uart_Printf("Connect SPIMOSI0 into SPIMISO0.\n");
end0SpiTx=0;
spi0TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
spi0RxStr=(char *) SPI_BUFFER0;
txStr=(char *)spi0TxStr;
rxStr=(char *)spi0RxStr;
rSPPRE0=0x0; //if PCLK=50Mhz,SPICLK=25Mhz
rSPCON0=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Polling,en-SCK,master,low,A,normal
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
while(end0SpiTx==0)
{
if(rSPSTA0&0x1) //Check Tx ready state
{
if(*spi0TxStr!='\0')
rSPTDAT0=*spi0TxStr++;
else
end0SpiTx=1;
while(!(rSPSTA0&0x1)); //Check Rx ready state
*spi0RxStr++=rSPRDAT0;
}
}
rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Polling,dis-SCK,master,low,A,normal
*(spi0RxStr-1)='\0';//remove last dummy data & attach End of String(Null)
Uart_Printf("Tx Strings:%s\n",txStr);
Uart_Printf("Rx Strings:%s :",rxStr);
if(strcmp(rxStr,txStr)==0)
Uart_Printf("O.K.\n");
else
Uart_Printf("ERROR!!!\n");
SPI0_Port_Return();
}
void Test_Spi01_MS_Int(void)
{
char *rx0Str,*tx0Str;
char *rx1Str,*tx1Str;
SPI0_Port_Init(1); // SPI0=Master, SPI1=Slave
Uart_Printf("[SPI0(Master), SPI1(Slave) Interrupt Rx/Tx test]\n");
Uart_Printf("Connect J37: (1-2) and CON21: (1-20),(2-19),(3-18),(4-17)\n");
pISR_SPI0=(unsigned)Spi0_Int;
pISR_VLX_SPI1=(unsigned)Spi1_Int;
end0SpiTx=0;
endSpi1Tx=0;
spi0TxStr="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
//spi0TxStr="1234567890";
spi1TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678901234567890";
//spi1TxStr="ABCDEFGHIJ";
spi0RxStr=(char *) SPI_BUFFER0;
spi1RxStr=(char *) SPI_BUFFER1;
tx0Str=(char *)spi0TxStr;
rx0Str=(char *)spi0RxStr;
tx1Str=(char *)spi1TxStr;
rx1Str=(char *)spi1RxStr;
rSPPRE1=0xff; //if PCLK=50Mhz,SPICLK=12.5Mhz
rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
#if FORMAT1_A
rSPCON1=(1<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//SPI1 :int,dis-SCK,slave,low,A,normal
#else
rSPCON1=(1<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1)|(0<<0);//SPI1 :int,dis-SCK,slave,low,B,normal
#endif
Uart_Printf("Slave setting end...Press enter\n");
Uart_Getch();
rSPPRE0=0xff; //if PCLK=50Mhz,SPICLK=12.5Mhz
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
#if FORMAT0_A
rSPCON0=(1<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//SPI0 :int,en-SCK,master,low,A,normal
#else
rSPCON0=(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(0<<0);//SPI0 :int,en-SCK,master,low,B,normal
#endif
//Master_nSS_Con(0); // Activate nSS
Uart_Printf("nSS is asserted\n");
rGPDAT&=~(1<<8);
rINTMSK&=~(BIT_VLX_SPI1);
rINTSUBMSK&=~(BIT_SUB_SPI1);
rINTMSK&=~(BIT_SPI0);
while((endSpi1Tx==0)||(end0SpiTx==0))
{
//Uart_Printf("#");
if(Uart_GetKey())
return;
}
Master_nSS_Con(1);
Uart_Printf("ISR0 count :%d, ISR1 count :%d\n\n",c0,c1);
#if FORMAT0_A
rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
rSPCON1=(0<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,slave,low,A,normal
#else
rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(1<<1)|(0<<0);//Poll,dis-SCK,master,low,B,normal
rSPCON1=(0<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1)|(0<<0);//Poll,dis-SCK,slave,low,B,normal
#endif
*spi0RxStr='\0';//attach End of String(Null)
*spi1RxStr='\0';//attach End of String(Null)
Uart_Printf("SPI0Tx Strings:%s\n",tx0Str);
Uart_Printf("SPI0Rx Strings:%s\n",rx0Str+1);//remove first dummy data
Uart_Printf("SPI1Tx Strings:%s\n",tx1Str);
Uart_Printf("SPI1Rx Strings:%s\n",rx1Str+1);//remove first dummy data
if(strcmp((rx1Str+1),tx0Str)==0)
Uart_Printf("SPI0 test O.K !!!\n");
if(strcmp((rx0Str+1),tx1Str)==0)
Uart_Printf("SPI1 test O.K !!!\n");
else
Uart_Printf("ERROR!!!\n");
SPI0_Port_Return();
}
void Test_Spi01_SM_Int(void) //SPI0: Slave Rx, SPI1:Master Tx
{
char *rx0Str,*tx0Str;
char *rx1Str,*tx1Str;
SPI0_Port_Init(1); // SPI0=Master, SPI1=Slave
Uart_Printf("[SPI0(Slave), SPI1(Master) Interrupt Rx/Tx test]\n");
Uart_Printf("Connect J36: (1-2) and CON21: (1-20),(2-19),(3-18),(4-17)\n");
pISR_SPI0=(unsigned)Spi0_Int;
pISR_VLX_SPI1=(unsigned)Spi1_Int;
end0SpiTx=0;
endSpi1Tx=0;
spi0TxStr="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
//spi0TxStr="1234567890";
spi1TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678901234567890";
//spi1TxStr="ABCDEFGHIJ";
spi0RxStr=(char *) SPI_BUFFER0;
spi1RxStr=(char *) SPI_BUFFER1;
tx0Str=(char *)spi0TxStr;
rx0Str=(char *)spi0RxStr;
tx1Str=(char *)spi1TxStr;
rx1Str=(char *)spi1RxStr;
rSPPRE0=0xff; //if PCLK=50Mhz,SPICLK=12.5Mhz
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
#if FORMAT0_A
rSPCON0=(1<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//SPI0 :int,dis-SCK,slave,low,A,normal
#else
rSPCON0=(1<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1)|(0<<0);//SPI0 :int,dis-SCK,slave,low,B,normal
#endif
Uart_Printf("Slave setting end...Press enter\n");
Uart_Getch();
rSPPRE1=0xff; //if PCLK=50Mhz,SPICLK=12.5Mhz
rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
#if FORMAT1_A
rSPCON1=(1<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//SPI1 :int,en-SCK,master,low,A,normal
#else
rSPCON1=(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(0<<0);//SPI1 :int,en-SCK,master,low,B,normal
#endif
//Master_nSS_Con(0); // Activate nSS
Uart_Printf("nSS is asserted\n");
rGPDAT&=~(1<<8);
rINTMSK&=~(BIT_VLX_SPI1);
rINTSUBMSK&=~(BIT_SUB_SPI1);
rINTMSK&=~(BIT_SPI0);
while((endSpi1Tx==0)||(end0SpiTx==0))
{
//Uart_Printf("#");
if(Uart_GetKey())
return;
}
Master_nSS_Con(1);
Uart_Printf("ISR0 count :%d, ISR1 count :%d\n\n",c0,c1);
#if FORMAT0_A
rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
rSPCON1=(0<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,slave,low,A,normal
#else
rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(1<<1)|(0<<0);//Poll,dis-SCK,master,low,B,normal
rSPCON1=(0<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1)|(0<<0);//Poll,dis-SCK,slave,low,B,normal
#endif
*spi0RxStr='\0';//attach End of String(Null)
*spi1RxStr='\0';//attach End of String(Null)
Uart_Printf("SPI0Tx Strings:%s\n",tx0Str);
Uart_Printf("SPI0Rx Strings:%s\n",rx0Str+1);//remove first dummy data
Uart_Printf("SPI1Tx Strings:%s\n",tx1Str);
Uart_Printf("SPI1Rx Strings:%s\n",rx1Str+1);//remove first dummy data
if(strcmp((rx1Str+1),tx0Str)==0)
Uart_Printf("SPI0 test O.K !!!\n");
if(strcmp((rx0Str+1),tx1Str)==0)
Uart_Printf("SPI1 test O.K !!!\n");
else
Uart_Printf("ERROR!!!\n");
SPI0_Port_Return();
}
void Test_SPI01_MS_DMA(void)// SPI0=Master, SPI1=Slave
{
int i;
SPI0_Port_Init(1); // SPI0=Master, SPI1=Slave
Master_nSS_Con(1);
Uart_Printf("[SPI0(Master Tx), SPI1(Slave Rx) DMA test]\n");
Uart_Printf("Connect J37: (1-2) and CON21: (1-20),(2-19),(3-18),(4-17)\n");
Uart_Printf("Slave setting press enter\n");
rSPPRE1=0x0; //if PCLK=50Mhz,SPICLK=25Mhz
#if FORMAT1_A
rSPCON1=(2<<5)|(0<<4)|(0<<3)|(0<<2)|(1<<1)|(1<<0);//DMA1,dis-SCK,slave,low,A,TAGD
#else
rSPCON1=(2<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(1<<0);//DMA1,dis-SCK,slave,low,B,TAGD
#endif
rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
Test_Spi1_S_Rx_DMA3_Set();//Slave DMA3setting
Uart_Printf("1.Check TC1=%x, TC3=%x\n",rDSTAT1,rDSTAT3);
Uart_Printf("Slave setting end...Press enter\n");
Uart_Getch();
rSPPRE0=0x0; //
#if FORMAT0_A
rSPCON0=(2<<5)|(1<<4)|(1<<3)|(0<<2)|(1<<1)|(1<<0);//DMA1,en-SCK,master,low,A,normal
#else
rSPCON0=(2<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(1<<0);//DMA1,en-SCK,master,low,B,normal
#endif
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
//Uart_Printf("1. TC1=%x, TC3=%x\n",rDSTAT1,rDSTAT3);
Master_nSS_Con(0); // Activate nSS
Test_Spi0_M_Tx_DMA1_Set();//Master DMA1 setting
Uart_Printf("2.Check TC1=%x, TC3=%x\n",rDSTAT1,rDSTAT3);
Uart_Printf("nSS asserted...\n");
while((tx_dma1Done==0)||(rx_dma3Done==0))
{
if(Uart_GetKey())
break;
}
Uart_Printf("Check TC1=%x, TC3=%x\n",rDSTAT1,rDSTAT3);
while(!(rSPSTA0&0x1)||!(rSPSTA1&0x1))// Tx/Rx is done
{
if(Uart_GetKey())
break;
}
Master_nSS_Con(1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -