📄 spi01.c
字号:
pISR_DMA_SBUS= (unsigned)Dma1Tx_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;
// rSPPRE1=0x0; //if PCLK=50Mhz,SPICLK=25Mhz
printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE0+1)))/1000000 );
rSPCON0=(2<<5)|(0<<4)|(0<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(0<<0);//DMA3,dis-SCK,slave,low,A,normal
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
//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;
}
//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_S_Rx_DMA1(void)
{
int i;
unsigned char *rx_ptr;
SPI_Port_Set();
SPI0_Port_Init(0); // Slave(nSS)
printf("[SPI DMA1 Slave Rx Test]\n");
printf("This test should be configured two boards\nStart Rx 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)|(0<<4)|(0<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(1<<0);//DMA3,dis-SCK,slave,low,A,TAGD
//When you use [Slave Rx with DMA] function you should have to set TAGD bit
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
//Step2. DMA1 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;
}
*/
//init rSPCON1
rSPCON1 = (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));
printf("\nDMA1 receive end");
SPI_Port_Return();
}
void __irq DmaTx_Int(void)
{
printf("Entered ISR_2\n");
rINTSUBMSK|=(BIT_SUB_DMA1|BIT_SUB_DMA3);
rINTMSK|=(BIT_DMA_SBUS);
if(rSUBSRCPND&(1<<26))
{
rx_dma1Done=1;
tx_dma1Done=1;
rSUBSRCPND=BIT_SUB_DMA1;
printf("##DMA1 is done##\n");
}
else if(rSUBSRCPND&(1<<28))
{
rx_dma3Done=1;
tx_dma3Done=1;
rSUBSRCPND=BIT_SUB_DMA3;
printf("##DMA3 is done##\n");
}
else
{
printf("DMA SUB INT Fail\n");
}
ClearPending(BIT_DMA_SBUS);
rINTMSK &= ~(BIT_DMA_SBUS);
rINTSUBMSK &= ~(BIT_SUB_DMA1|BIT_SUB_DMA3);
//*(rx1_ptr+SPIRX_COUNT)=rSPRDAT1;
}
////////////////////////////// ADD SPI1 transfer /////////////////////////////
void __irq Spi1_Int(void)
{
unsigned int status;
rINTMSK|=BIT_IIC_SPI;
rINTSUBMSK|=BIT_SUB_SPI1;
ClearPending(BIT_IIC_SPI);
rSUBSRCPND=BIT_SUB_SPI1;
status=rSPSTA1;
if(status&0x6)
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
// printf("Rx: %c Tx: %c \n", rSPRDAT1, *spi1TxStr);
if(*spi1TxStr!='\0')
{
rSPTDAT1=*spi1TxStr++;
rINTMSK&=~BIT_IIC_SPI;
rINTSUBMSK&=~BIT_SUB_SPI1;
}
else
{
*spi1RxStr='\0';
end1SpiTx=1;
}
}
void Test_Spi1_MS_int(void)
{
char *txStr,*rxStr,i;
SPI_Port_Set();
SPI1_Port_Init(1);
printf("[SPI1 Interrupt Tx/Rx Self-Test]\n");
printf("Connect SPIMOSI1 into SPIMISO1.\n");
pISR_IIC_SPI=(unsigned)Spi1_Int;
end1SpiTx=0;
spi1TxStr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\n";
spi1RxStr=(char *) SPI_BUFFER1;
txStr=(char *)spi1TxStr;
rxStr=(char *)spi1RxStr;
rSPPRE1=ClockSelection(); // Baudrate=PCLK/2
printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE1+1)))/1000000 );
rSPCON1=(1<<5)|(1<<4)|(1<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//int,en-SCK,master,low,A,normal
rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
rINTMSK&=~(BIT_IIC_SPI);
rINTSUBMSK&=~(BIT_SUB_SPI1);
while(end1SpiTx==0);
rSPCON1=(0<<5)|(0<<4)|(1<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
printf("Tx Strings:%s\n",txStr);
//printf("Rx Strings:%s :",rxStr+1);//remove first dummy data
printf("Rx Strings:%s :",rxStr+2);//remove first 2- dummy data
if(strcmp(rxStr+2,txStr)==0)
printf("O.K.\n");
else
printf("ERROR!!!\n");
SPI_Port_Return();
}
void Test_Spi1_MS_poll(void)
{
char *txStr,*rxStr,i;
SPI_Port_Set();
SPI1_Port_Init(1);
printf("[SPI Polling Tx/Rx Self-Test]\n");
printf("Connect SPIMOSI1 into SPIMISO1.\n");
end1SpiTx=0;
spi1TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\n";
spi1RxStr=(char *) SPI_BUFFER1;
txStr=(char *)spi1TxStr;
rxStr=(char *)spi1RxStr;
rSPPRE1=ClockSelection(); // Baudrate=PCLK/2
printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE1+1)))/1000000 );
rSPCON1=(0<<5)|(1<<4)|(1<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//Polling,en-SCK,master,low,A,normal
rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
while(end1SpiTx==0)
{
if(rSPSTA1&0x1) //Check Tx ready state
{
if(*spi1TxStr!='\0')
rSPTDAT1=*spi1TxStr++;
else
end1SpiTx=1;
while(!(rSPSTA1&0x1)); //Check Rx ready state
*spi1RxStr++=rSPRDAT1;
}
}
rSPCON1=(0<<5)|(0<<4)|(1<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//Polling,dis-SCK,master,low,A,normal
//*(spi1RxStr-1)='\0';//remove last dummy data & attach End of String(Null)
*(spi1RxStr)='\0';//remove last dummy data & attach End of String(Null)
printf("Tx Strings:%s\n",txStr);
printf("Rx Strings:%s :",rxStr+1);
if(strcmp(rxStr+1,txStr)==0)
printf("O.K.\n");
else
printf("ERROR!!!\n");
SPI_Port_Return();
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
uint8 int_txdata[SPI1_COUNT];
uint8 int_rxdata[SPI1_COUNT+2];
uint8 int_tx_cnt=0;
uint8 int_rx_cnt=0;
void __irq Spi1_Tx_Int(void)
{
unsigned int status;
rINTMSK|=BIT_IIC_SPI;
rINTSUBMSK|=BIT_SUB_SPI1;
ClearPending(BIT_IIC_SPI);
rSUBSRCPND=BIT_SUB_SPI1;
status=rSPSTA1;
if(status&0x6)
printf("Data Collision or Multi Master Error(0x%x)!!!\n", status);
while(!(status&0x1)); //Check ready state
if(int_tx_cnt < (SPI1_COUNT))
{
rSPTDAT1 = int_txdata[int_tx_cnt++];
rINTMSK&=~BIT_IIC_SPI;
rINTSUBMSK&=~BIT_SUB_SPI1;
}
else
{
end1SpiTx=1;
}
}
void __irq Spi1_Rx_Int(void)
{
unsigned int status;
rINTMSK|=BIT_IIC_SPI;
rINTSUBMSK|=BIT_SUB_SPI1;
ClearPending(BIT_IIC_SPI);
rSUBSRCPND=BIT_SUB_SPI1;
status=rSPSTA1;
if(status&0x6)
printf("Data Collision or Multi Master Error(0x%x)!!!\n", status);
while(!(status&0x1)); //Check ready state
int_rxdata[int_rx_cnt++]=rSPRDAT1;
if(int_rx_cnt < (SPI1_COUNT+1))
{
rINTMSK&=~BIT_IIC_SPI;
rINTSUBMSK&=~BIT_SUB_SPI1;
}
else
{
end1SpiRx=1;
}
}
void Test_Spi1_M_Tx_Int(void)
{
char *rxStr,*txStr,i;
SPI_Port_Set();
SPI1_Port_Init(1); // Master
Master_nSS_Con1(1);
printf("[SPI Interrupt Master TxRx test]\n");
printf("This test should be configured two boards\nStart Slave TxRx first.\n");
//init rSPCON1
rSPCON1 = (1<<3);
pISR_IIC_SPI=(unsigned)Spi1_Tx_Int;
end1SpiTx=0;
for(i=0;i<SPI1_COUNT;i++)
int_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=(1<<5)|(1<<4)|(1<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//int,en-SCK,master,low,A,normal
Master_nSS_Con1(0); // Activate nSS
rINTMSK&=~(BIT_IIC_SPI);
rINTSUBMSK&=~(BIT_SUB_SPI1);
while((end1SpiTx==0)&&(!Uart_GetKey()));
Master_nSS_Con1(1);
//init rSPCON1
rSPCON1 = (1<<3);
printf("Tx End...\n");
printf("Tx data:\n");
for(i=0;i<SPI1_COUNT;i++)
printf("0x%02x,",int_txdata[i]);
printf("\n");
int_tx_cnt = 0;
SPI_Port_Return();
}
void Test_Spi1_M_Rx_Int(void)
{
char *rxStr,*txStr,i,rx_tmp;
SPI_Port_Set();
SPI1_Port_Init(1); // Master
Master_nSS_Con1(1);
printf("[SPI Interrupt Master TxRx test]\n");
printf("This test should be configured two boards\nStart Slave TxRx first.\n");
//init rSPCON1
rSPCON1 = (1<<3);
pISR_IIC_SPI=(unsigned)Spi1_Rx_Int;
end1SpiRx=0;
for(i=0;i<(SPI1_COUNT+1);i++)
int_rxdata[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);//dis-ENMUL,SBO,release
rSPCON1=(1<<5)|(1<<4)|(1<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(1<<0);//int,en-SCK,master,low,A,normal
Master_nSS_Con1(0); // Activate nSS
rINTMSK&=~(BIT_IIC_SPI);
rINTSUBMSK&=~(BIT_SUB_SPI1);
while((end1SpiRx==0)&&(!Uart_GetKey()));
Master_nSS_Con1(1);
//init rSPCON1
rSPCON1 = (1<<3);
printf("Rx End...\n");
printf("Rx data:\n");
for(i=1;i<(SPI1_COUNT+1);i++)
printf("0x%02x,",int_rxdata[i]);
printf("\n");
int_rx_cnt = 0;
SPI_Port_Return();
}
void Test_Spi1_S_Tx_Int(void)
{
char *rxStr,*txStr,i;
SPI_Port_Set();
SPI1_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
rSPCON1 = (1<<3);
pISR_IIC_SPI=(unsigned)Spi1_Tx_Int;
end1SpiTx=0;
for(i=0;i<SPI1_COUNT;i++)
int_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=(1<<5)|(0<<4)|(0<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//int,dis-SCK,slave,low,A,normal
rINTMSK&=~(BIT_IIC_SPI);
rINTSUBMSK&=~(BIT_SUB_SPI1);
while((end1SpiTx==0)&&(!Uart_GetKey()));
//init rSPCON1
rSPCON1 = (1<<3);
printf("Tx End...\n");
printf("Tx data:\n");
for(i=0;i<SPI1_COUNT;i++)
printf("0x%02x,",int_txdata[i]);
printf("\n");
int_tx_cnt = 0;
SPI_Port_Return();
}
void Test_Spi1_S_Rx_Int(void)
{
char *rxStr,*txStr,i,rx_tmp;
SPI_Port_Set();
SPI1_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
rSPCON1 = (1<<3);
pISR_IIC_SPI=(unsigned)Spi1_Rx_Int;
end1SpiRx=0;
for(i=0;i<(SPI1_COUNT+1);i++)
int_rxdata[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);//dis-ENMUL,SBO,release
rSPCON1=(1<<5)|(0<<4)|(0<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(1<<0);//int,dis-SCK,slave,low,A,normal
rINTMSK&=~(BIT_IIC_SPI);
rINTSUBMSK&=~(BIT_SUB_SPI1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -