📄 spi01.c
字号:
//init rSPCON1
rSPCON0 = (1<<3);
printf("Rx End...\n");
printf("Rx data:\n");
for(i=1;i<(SPI0_COUNT+1);i++)
printf("0x%02x,",int_rx0data[i]);
printf("\n");
int_rx0_cnt = 0;
SPI_Port_Return();
}
void Test_Spi0_S_Tx_Int(void)
{
char *rxStr,*txStr,i;
SPI_Port_Set();
SPI0_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
rSPCON0 = (1<<3);
pISR_IIC_SPI=(unsigned)Spi0_Tx_Int;
end0SpiTx=0;
for(i=0;i<SPI0_COUNT;i++)
int_tx0data[i]=i+1;
rSPPRE0=ClockSelection(); // Baudrate=PCLK/2
printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE0+1)))/1000000 );
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
rSPCON0=(1<<5)|(0<<4)|(0<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(0<<0);//int,dis-SCK,slave,low,A,normal
rINTMSK&=~(BIT_IIC_SPI);
rINTSUBMSK&=~(BIT_SUB_SPI0);
while((end0SpiTx==0)&&(!Uart_GetKey()));
//init rSPCON1
rSPCON0 = (1<<3);
printf("Tx End...\n");
printf("Tx data:\n");
for(i=0;i<SPI0_COUNT;i++)
printf("0x%02x,",int_tx0data[i]);
printf("\n");
int_tx0_cnt = 0;
SPI_Port_Return();
}
void Test_Spi0_S_Rx_Int(void)
{
char *rxStr,*txStr,i,rx_tmp;
SPI_Port_Set();
SPI0_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
rSPCON0 = (1<<3);
pISR_IIC_SPI=(unsigned)Spi0_Rx_Int;
end0SpiRx=0;
for(i=0;i<(SPI0_COUNT+1);i++)
int_rx0data[i]=0;
rSPPRE0=ClockSelection(); // Baudrate=PCLK/2
printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE0+1)))/1000000 );
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
rSPCON0=(1<<5)|(0<<4)|(0<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(1<<0);//int,dis-SCK,slave,low,A,normal
rINTMSK&=~(BIT_IIC_SPI);
rINTSUBMSK&=~(BIT_SUB_SPI0);
while((end0SpiRx==0)&&(!Uart_GetKey()));
//init rSPCON1
rSPCON0 = (1<<3);
printf("Rx End...\n");
printf("Rx data:\n");
int_rx0data[SPI0_COUNT+1]=rSPRDAT0;
for(i=2;i<(SPI0_COUNT+2);i++)
printf("0x%02x,",int_rx0data[i]);
printf("\n");
int_rx0_cnt = 0;
SPI_Port_Return();
}
/////////////////////////// Polling //////////////////////////
void Test_Spi0_M_Tx_Polling(void)
{
char *rxStr,*txStr,i;
uint8 txdata[SPI0_COUNT];
boolean rx_end=FALSE;
SPI_Port_Set();
Master_nSS_Con0(1);
Master_nSS_Con0(1);
//init rSPCON1
rSPCON0 = (1<<3);
for(i=0;i<SPI0_COUNT;i++)
txdata[i]=i+1;
rSPPRE0=ClockSelection(); // Baudrate=PCLK/2
printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE0+1)))/1000000 );
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
rSPCON0=SPI_POLLING_MODE|SCKEN|MASTER|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|NORMALMODE;//int,dis-SCK,slave,low,A,normal
Master_nSS_Con0(0);
i=0;
while(!Uart_GetKey())
{
if(rSPSTA0&0x6)
printf("Data Collision \n");
while((!(rSPSTA0&0x1))&&((rx_end=Uart_GetKey())==0)); //Check ready state
rSPTDAT0 = txdata[i++];
if(i==SPI0_COUNT)
break;
}
Master_nSS_Con0(1);
printf("Transmit end\n");
//init rSPCON1
rSPCON0 = (1<<3);
SPI_Port_Return();
}
void Test_Spi0_M_Rx_Polling(void)
{
char *rxStr,i;
int rxcnt=0,error_cnt=0;
boolean rx_end=FALSE;
SPI_Port_Set();
SPI0_Port_Init(1); // Master
Master_nSS_Con0(1);
//init rSPCON1
rSPCON0 = (1<<3);
spi0RxStr=(char *) SPI_BUFFER0;
for(i=0;i<SPI0_COUNT;i++)
*(spi0RxStr+i)=0;
rSPPRE0=ClockSelection(); // Baudrate=PCLK/2
printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE0+1)))/1000000 );
rSPPIN0=(0<<2)|(1<<1)|(0<<0);
rSPCON0=SPI_POLLING_MODE|SCKEN|MASTER|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|AUTOGARBAGE;
Master_nSS_Con0(0); // Activate nSS
while(rxcnt<SPI0_COUNT)
{
if(rSPSTA0&0x6)
printf("Data Collision or Multi Master Error\n");
while((!(rSPSTA0&0x1))&&((rx_end=Uart_GetKey())==0)); //Check ready state
*spi0RxStr++=rSPRDAT0; //First Rx data is garbage data
rxcnt++;
if(rx_end!=FALSE)
break;
}
Master_nSS_Con0(1);
printf("Receive end\n");
//init rSPCON1
rSPCON0 = (1<<3);
printf("\nTotal count of received data is %d\n",rxcnt);
spi0RxStr =(char *)SPI_BUFFER0;
for(i=2;i<rxcnt;i++)
{
if(*(spi0RxStr+i)!=(i-1))
{
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_Spi0_S_Tx_Polling(void)
{
char *rxStr,*txStr,i;
uint8 txdata[SPI0_COUNT];
boolean rx_end=FALSE;
SPI_Port_Set();
SPI0_Port_Init(0); // Slave (nSS)
//init rSPCON1
rSPCON0 = (1<<3);
for(i=0;i<SPI0_COUNT;i++)
txdata[i]=i+1;
rSPPRE0=ClockSelection(); // Baudrate=PCLK/2
printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE0+1)))/1000000 );
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
rSPCON0=SPI_POLLING_MODE|SCKDIS|SLAVE|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|NORMALMODE;//int,dis-SCK,slave,low,A,normal
i=0;
while(!Uart_GetKey())
{
if(rSPSTA0&0x6)
printf("Data Collision \n");
while((!(rSPSTA0&0x1))&&((rx_end=Uart_GetKey())==0)); //Check ready state
rSPTDAT0 = txdata[i++];
if(i==SPI0_COUNT)
break;
}
printf("Transmit end\n");
//init rSPCON1
rSPCON0 = (1<<3);
SPI_Port_Return();
}
void Test_Spi0_S_Rx_Polling(void)
{
int i,rxcnt=0,error_cnt=0;
boolean rx_end=FALSE;
SPI_Port_Set();
SPI0_Port_Init(0); // slave
//init rSPCON1
rSPCON0 = (1<<3);
spi0RxStr=(char *)SPI_BUFFER0;
for(i=0;i<(SPI0_COUNT);i++)
*(spi0RxStr+i)=0x0; // Zero Initialize
rSPPRE0=ClockSelection(); // Baudrate=PCLK/2
printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE0+1)))/1000000 );
rSPPIN0=(0<<2)|(1<<1)|(0<<0);
rSPCON0=SPI_POLLING_MODE|SCKDIS|SLAVE|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|AUTOGARBAGE;
while(rxcnt<SPI0_COUNT)
{
if(rSPSTA0&0x6)
printf("Data Collision or Multi Master Error\n");
while((!(rSPSTA0&0x1))&&((rx_end=Uart_GetKey())==0)); //Check ready state
*spi0RxStr++=rSPRDAT0; //First Rx data is garbage data
rxcnt++;
if(rx_end!=FALSE)
break;
}
rSPCON0=(0<<5)|(0<<4)|(1<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
printf("\nTotal count of received data is %d\n",rxcnt);
spi0RxStr =(char *)SPI_BUFFER0;
for(i=2;i<rxcnt;i++)
{
if(*(spi0RxStr+i)!=(i-1))
{
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 Dma1Tx_Int(void)
{
tx_dma1Done=1;
rINTMSK|=BIT_DMA_SBUS;
rINTSUBMSK|=BIT_SUB_DMA1;
ClearPending(BIT_DMA_SBUS);
rSUBSRCPND=BIT_SUB_DMA1;
}
void __irq Dma1Rx_Int(void)
{
rx_dma1Done=1;
rINTMSK|=BIT_DMA_SBUS;
rINTSUBMSK|=BIT_SUB_DMA1;
ClearPending(BIT_DMA_SBUS);
rSUBSRCPND=BIT_SUB_DMA1;
}
void Test_Spi0_M_Tx_DMA1(void)
{
int i;
unsigned char *tx_ptr;
SPI_Port_Set();
SPI0_Port_Init(1); // Master(GPIO)
printf("[SPI DMA1 Master Tx test]\n");
printf("This test should be configured two boards\nStart Rx first.\n");
//init rSPCON1
rSPCON0 = (1<<3);
tx_ptr=(unsigned char *) SPI_BUFFER0;
for(i=0; i<SPI0_COUNT; i++)
*(tx_ptr+i)=i+1;
tx_dma1Done=0;
pISR_DMA_SBUS= (unsigned)Dma1Tx_Int;
rINTSUBMSK&=~(BIT_SUB_DMA1);
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) ) rSPPRE0 = 0;
else rSPPRE0 = i;
printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE0+1)))/1000000 );
// rSPPRE1=0x0; //
rSPCON0=(2<<5)|(1<<4)|(1<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(0<<0);
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
Master_nSS_Con0(0); // Activate nSS
//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;
}
Master_nSS_Con0(1);//Deactivate nSS
//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_M_Rx_DMA1(void)
{
int i;
unsigned char *rx_ptr;
SPI_Port_Set();
SPI0_Port_Init(1); // Master(GPIO)
printf("[SPI DMA1 Master Rx Test]\n");
printf("This test should be configured two boards\nStart Tx 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)|(1<<4)|(1<<3)|(SPI0_POLARITY<<2)|(SPI0_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
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
Master_nSS_Con0(0);
//Step2. DMA3 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;
}
*/
Master_nSS_Con0(1);
//init rSPCON1
rSPCON0 = (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));//to remove first dummy data
printf("\nDMA1 receive end");
SPI_Port_Return();
}
void Test_Spi0_S_Tx_DMA1(void)
{
int i;
unsigned char *tx_ptr;
SPI_Port_Set();
SPI0_Port_Init(0); // Slave (nSS)
printf("[SPI DMA1 Slave Tx test]\n");
printf("This test should be configured two boards\nStart Tx first.\n");
//init rSPCON1
rSPCON0 = (1<<3);
tx_ptr=(unsigned char *) SPI_BUFFER0;
for(i=0; i<SPI0_COUNT; i++)
*(tx_ptr+i)=i;
tx_dma1Done=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -