📄 spi01.c
字号:
while((end1SpiRx==0)&&(!Uart_GetKey()));
//init rSPCON1
rSPCON1 = (1<<3);
printf("Rx End...\n");
printf("Rx data:\n");
int_rxdata[SPI1_COUNT+1]=rSPRDAT1;
for(i=2;i<(SPI1_COUNT+2);i++)
printf("0x%02x,",int_rxdata[i]);
printf("\n");
int_rx_cnt = 0;
SPI_Port_Return();
}
/////////////////////////// Polling //////////////////////////
void Test_Spi1_M_Tx_Polling(void)
{
char *rxStr,*txStr,i;
uint8 txdata[SPI1_COUNT];
boolean rx_end=FALSE;
SPI_Port_Set();
SPI1_Port_Init(1); // Master
Master_nSS_Con1(1);
//init rSPCON1
rSPCON1 = (1<<3);
for(i=0;i<SPI1_COUNT;i++)
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=SPI_POLLING_MODE|SCKEN|MASTER|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|NORMALMODE;//int,dis-SCK,slave,low,A,normal
Master_nSS_Con1(0);
i=0;
while(!Uart_GetKey())
{
if(rSPSTA1&0x6)
printf("Data Collision \n");
while((!(rSPSTA1&0x1))&&((rx_end=Uart_GetKey())==0)); //Check ready state
rSPTDAT1 = txdata[i++];
if(i==SPI1_COUNT)
break;
}
Master_nSS_Con1(1);
printf("Transmit end\n");
//init rSPCON1
rSPCON1 = (1<<3);
SPI_Port_Return();
}
void Test_Spi1_M_Rx_Polling(void)
{
char *rxStr,i;
int rxcnt=0,error_cnt=0;
boolean rx_end=FALSE;
SPI_Port_Set();
SPI1_Port_Init(1); // Master
Master_nSS_Con1(1);
//init rSPCON1
rSPCON1 = (1<<3);
spi1RxStr=(char *) SPI_BUFFER1;
for(i=0;i<SPI1_COUNT;i++)
*(spi1RxStr+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);
rSPCON1=SPI_POLLING_MODE|SCKEN|MASTER|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|AUTOGARBAGE;
Master_nSS_Con1(0); // Activate nSS
while(rxcnt<SPI1_COUNT)
{
if(rSPSTA1&0x6)
printf("Data Collision or Multi Master Error\n");
while((!(rSPSTA1&0x1))&&((rx_end=Uart_GetKey())==0)); //Check ready state
*spi1RxStr++=rSPRDAT1; //First Rx data is garbage data
rxcnt++;
if(rx_end!=FALSE)
break;
}
Master_nSS_Con1(1);
printf("Receive end\n");
//init rSPCON1
rSPCON1 = (1<<3);
printf("\nTotal count of received data is %d\n",rxcnt);
spi1RxStr =(char *)SPI_BUFFER1;
#if S3C2460A
for(i=2;i<rxcnt;i++)
{
if(*(spi1RxStr+i)!=(i-1))
#elif S3C2460X
for(i=1;i<rxcnt;i++)
{
if(*(spi1RxStr+i)!=(i))
#endif
{
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_Spi1_S_Tx_Polling(void)
{
char *rxStr,*txStr,i;
uint8 txdata[SPI1_COUNT];
boolean rx_end=FALSE;
SPI_Port_Set();
SPI1_Port_Init(0); // Slave (nSS)
//init rSPCON1
rSPCON1 = (1<<3);
for(i=0;i<SPI1_COUNT;i++)
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=SPI_POLLING_MODE|SCKDIS|SLAVE|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|NORMALMODE;//int,dis-SCK,slave,low,A,normal
i=0;
while(!Uart_GetKey())
{
if(rSPSTA1&0x6)
printf("Data Collision \n");
while((!(rSPSTA1&0x1))&&((rx_end=Uart_GetKey())==0)); //Check ready state
rSPTDAT1 = txdata[i++];
if(i==SPI1_COUNT)
break;
}
printf("Transmit end\n");
//init rSPCON1
rSPCON1 = (1<<3);
SPI_Port_Return();
}
void Test_Spi1_S_Rx_Polling(void)
{
int i,rxcnt=0,error_cnt=0;
boolean rx_end=FALSE;
SPI_Port_Set();
SPI1_Port_Init(0); // slave
//init rSPCON1
rSPCON1 = (1<<3);
spi1RxStr=(char *)SPI_BUFFER1;
for(i=0;i<(SPI1_COUNT);i++)
*(spi1RxStr+i)=0x0; // Zero Initialize
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);
rSPCON1=SPI_POLLING_MODE|SCKDIS|SLAVE|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|AUTOGARBAGE;
while(rxcnt<SPI1_COUNT)
{
if(rSPSTA1&0x6)
printf("Data Collision or Multi Master Error\n");
while((!(rSPSTA1&0x1))&&((rx_end=Uart_GetKey())==0)); //Check ready state
*spi1RxStr++=rSPRDAT1; //First Rx data is garbage data
rxcnt++;
if(rx_end!=FALSE)
break;
}
rSPCON1=(0<<5)|(0<<4)|(1<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
printf("\nTotal count of received data is %d\n",rxcnt);
spi1RxStr =(char *)SPI_BUFFER1;
#if S3C2460A
for(i=2;i<rxcnt;i++)
{
if(*(spi1RxStr+i)!=(i-1))
#elif S3C2460X
for(i=1;i<rxcnt;i++)
{
if(*(spi1RxStr+i)!=(i))
#endif
{
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 Dma3Tx_Int(void)
{
tx_dma3Done=1;
rINTMSK|=BIT_DMA_SBUS;
rINTSUBMSK|=BIT_SUB_DMA3;
ClearPending(BIT_DMA_SBUS);
rSUBSRCPND=BIT_SUB_DMA3;
}
void __irq Dma3Rx_Int(void)
{
rx_dma3Done=1;
rINTMSK|=BIT_DMA_SBUS;
rINTSUBMSK|=BIT_SUB_DMA3;
ClearPending(BIT_DMA_SBUS);
rSUBSRCPND=BIT_SUB_DMA3;
}
void Test_Spi1_M_Tx_DMA3(void)
{
int i;
unsigned char *tx_ptr;
SPI_Port_Set();
SPI1_Port_Init(1); // Master(GPIO)
printf("[SPI DMA3 Master Tx test]\n");
printf("This test should be configured two boards\nStart Rx first.\n");
//init rSPCON1
rSPCON1 = (1<<3);
tx_ptr=(unsigned char *) SPI_BUFFER1;
for(i=0; i<SPI1_COUNT; i++)
*(tx_ptr+i)=i+1;
tx_dma3Done=0;
pISR_DMA_SBUS= (unsigned)Dma3Tx_Int;
rINTSUBMSK&=~(BIT_SUB_DMA3);
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) ) rSPPRE1 = 0;
else rSPPRE1 = i;
printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE1+1)))/1000000 );
// rSPPRE1=0x0; //
rSPCON1=(2<<5)|(1<<4)|(1<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);
rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
Master_nSS_Con1(0); // Activate nSS
//Step2. DMA1 init
Init_DMA_Regs(3);
rDISRC3=(unsigned)tx_ptr; //Address of Memory
rDISRCC3=(0<<1)|(0); //AHB(Memory), inc
rDIDST3=(unsigned)0x44500030;//Address of SPTDAT Register
rDIDSTC3=(1<<1)|(1); //APB(SPI), fix
rDCON3=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<22)|(0<<20)|(SPI1_COUNT);
//handshake, sync PCLK, TC int, single tx, single service, SPI, H/W request,
//off-reload, byte, 128Bytes
rDMAREQSEL3=(1<<1)|(1<<0);
rDMASKTRIG3=(0<<2)|(1<<1)|(0); //run, DMA1 channel on, no-sw trigger
while(tx_dma3Done==0)
{
if(Uart_GetKey())
break;
}
while(!(rSPSTA1&0x1)) // Tx is done
{
if(Uart_GetKey())
break;
}
Master_nSS_Con1(1);//Deactivate nSS
//init rSPCON1
rSPCON1 = (1<<3);
printf("\nDMA3 transfer end\n");
for(i=0; i<SPI1_COUNT-1; i++)
printf("0x%02x,",*tx_ptr++);
SPI_Port_Return();
}
void Test_Spi1_M_Rx_DMA3(void)
{
int i;
unsigned char *rx_ptr;
SPI_Port_Set();
SPI1_Port_Init(1); // Master(GPIO)
printf("[SPI DMA3 Master Rx Test]\n");
printf("This test should be configured two boards\nStart Tx first.\n");
//init rSPCON1
rSPCON1 = (1<<3);
rx_ptr=(unsigned char *)SPI_BUFFER1;
for(i=0;i<0x500;i++)
*(rx_ptr+i)=0x0; // Zero Initialize
rx_dma3Done=0;
pISR_DMA_SBUS= (unsigned)Dma3Rx_Int;
rINTMSK&=~(BIT_DMA_SBUS);
rINTSUBMSK&=~(BIT_SUB_DMA3);
//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) ) rSPPRE1 = 0;
else rSPPRE1 = i;
printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE1+1)))/1000000 );
// rSPPRE1=0x0 ; //if PCLK=50Mhz,SPICLK=25Mhz
rSPCON1=(2<<5)|(1<<4)|(1<<3)|(SPI1_POLARITY<<2)|(SPI1_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
rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
Master_nSS_Con1(0);
//Step2. DMA3 init
Init_DMA_Regs(3);
rDISRC3=(unsigned)0x44500034;//Address of SPRDAT Register
rDISRCC3=(1<<1)|(1); //APB(SPI), fix
rDIDST3=(unsigned)rx_ptr; //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)|(SPI1_COUNT);
//handshake, sync PCLK, TC int, single tx, single service, SPI, H/W request,
//off-reload, byte, 128Bytes
rDMAREQSEL3=(1<<1)|(1<<0);
rDMASKTRIG3=(0<<2)|(1<<1)|(0); //run, DMA1 channel on, no-sw trigger
while(rx_dma3Done==0)
{
if(Uart_GetKey())
break;
}
/*
while(!rSPSTA1&0x1)
{
if(Uart_GetKey())
break;
}
*/
Master_nSS_Con1(1);
//init rSPCON1
rSPCON1 = (1<<3);
*(rx_ptr+SPI1_COUNT)=rSPRDAT1;
rx_ptr=(unsigned char *)SPI_BUFFER1;
for(i=1;i<(SPI1_COUNT+1);i++)
printf("0x%02x,",*(rx_ptr+i));//to remove first dummy data
printf("\nDMA3 receive end");
SPI_Port_Return();
}
void Test_Spi1_S_Tx_DMA3(void)
{
int i;
unsigned char *tx_ptr;
SPI_Port_Set();
SPI1_Port_Init(0); // Slave (nSS)
printf("[SPI DMA3 Slave Tx test]\n");
printf("This test should be configured two boards\nStart Tx first.\n");
//init rSPCON1
rSPCON1 = (1<<3);
tx_ptr=(unsigned char *) SPI_BUFFER1;
for(i=0; i<SPI1_COUNT; i++)
*(tx_ptr+i)=i+1;
tx_dma3Done=0;
pISR_DMA_SBUS= (unsigned)Dma3Tx_Int;
rINTMSK&=~(BIT_DMA_SBUS);
rINTSUBMSK&=~(BIT_SUB_DMA3);
//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) ) rSPPRE1 = 0;
else rSPPRE1 = i;
// rSPPRE1=0x0; //if PCLK=50Mhz,SPICLK=25Mhz
printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE1+1)))/1000000 );
rSPCON1=(2<<5)|(0<<4)|(0<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//DMA3,dis-SCK,slave,low,A,normal
rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
//Step2. DMA1 init
Init_DMA_Regs(3);
rDISRC3=(unsigned)tx_ptr; //Address of Memory
rDISRCC3=(0<<1)|(0); //AHB(Memory), inc
rDIDST3=(unsigned)0x44500030;//Address of SPTDAT Register
rDIDSTC3=(1<<1)|(1); //APB(SPI), fix
rDCON3=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<22)|(0<<20)|(SPI1_COUNT);
//handshake, sync PCLK, TC int, single tx, single service, SPI, H/W request,
//off-reload, byte, 128Bytes
rDMAREQSEL3=(1<<1)|(1<<0);
rDMASKTRIG3=(0<<2)|(1<<1)|(0); //run, DMA1 channel on, no-sw trigger
while(tx_dma3Done==0)
{
if(Uart_GetKey())
break;
}
while(!(rSPSTA1&0x1)) // Tx is done
{
if(Uart_GetKey())
break;
}
//init rSPCON1
rSPCON1 = (1<<3);
printf("\nDMA3 transfer end\n");
for(i=0; i<SPI1_COUNT-1; i++)
printf("0x%02x,",*tx_ptr++);
SPI_Port_Return();
}
void Test_Spi1_S_Rx_DMA3(void)
{
int i;
unsigned char *rx_ptr;
SPI_Port_Set();
SPI1_Port_Init(0); // Slave(nSS)
printf("[SPI DMA3 Slave Rx Test]\n");
printf("This test should be configured two boards\nStart Rx first.\n");
//init rSPCON1
rSPCON1 = (1<<3);
rx_ptr=(unsigned char *) SPI_BUFFER1;
for(i=0;i<0x500;i++)
*(rx_ptr+i)=0x0; // Zero Initialize
rx_dma3Done=0;
pISR_DMA_SBUS= (unsigned)Dma3Rx_Int;
rINTMSK&=~(BIT_DMA_SBUS);
rINTSUBMSK&=~(BIT_SUB_DMA3);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -