📄 spi01.c
字号:
//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)|(0<<4)|(0<<3)|(SPI1_POLARITY<<2)|(SPI1_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
rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
//Step2. DMA1 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) //Tx is done!
{
if(Uart_GetKey())
break;
}
*/
//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));
printf("\nDMA3 receive end");
SPI_Port_Return();
}
void __irq Spi01_Int(void)
{
unsigned int status, status1;
rINTMSK|=BIT_IIC_SPI;
rINTSUBMSK|=BIT_SUB_SPI0;
rINTSUBMSK|=BIT_SUB_SPI1;
ClearPending(BIT_IIC_SPI);
rSUBSRCPND=BIT_SUB_SPI0;
rSUBSRCPND=BIT_SUB_SPI1;
status=rSPSTA0;
status1=rSPSTA1;
if(status&0x6)
printf("Data Collision or Multi Master Error0(0x%x)!!!\n", status);
if(status1&0x6)
printf("Data Collision or Multi Master Error1(0x%x)!!!\n", status1);
while(!((status&0x1)&&(status1&0x1))); //Check ready state
*spi0RxStr++=rSPRDAT0; //First Rx data is garbage data
*spi1RxStr++=rSPRDAT1;
// printf("Rx0: %c Tx0: %c Rx1: %c Tx1: %c\n", rSPRDAT0, *spi0TxStr, rSPRDAT1, *spi1TxStr);
// printf("Rx1: %c Tx1: %c\n", rSPRDAT1, *spi1TxStr);
if((*spi0TxStr!='\0') && (*spi1TxStr!='\0'))
{
rSPTDAT0=*spi0TxStr++;
rSPTDAT1=*spi1TxStr++;
rINTMSK&=~BIT_IIC_SPI;
rINTSUBMSK&=~BIT_SUB_SPI0;
rINTSUBMSK&=~BIT_SUB_SPI1;
}
else
{
rINTMSK|=BIT_IIC_SPI;
rINTSUBMSK|=BIT_SUB_SPI0;
rINTSUBMSK|=BIT_SUB_SPI1;
end0SpiTx=1;
end1SpiTx=1;
}
}
void __irq Spi10_Int(void)
{
unsigned int status, status1;
rINTMSK|=BIT_IIC_SPI;
rINTSUBMSK|=BIT_SUB_SPI0;
rINTSUBMSK|=BIT_SUB_SPI1;
ClearPending(BIT_IIC_SPI);
rSUBSRCPND=BIT_SUB_SPI0;
rSUBSRCPND=BIT_SUB_SPI1;
status=rSPSTA0;
status1=rSPSTA1;
if(status&0x6)
printf("Data Collision or Multi Master Error0(0x%x)!!!\n", status);
if(status1&0x6)
printf("Data Collision or Multi Master Error1(0x%x)!!!\n", status1);
while(!((status&0x1)&&(status1&0x1))); //Check ready state
*spi1RxStr++=rSPRDAT1;
*spi0RxStr++=rSPRDAT0; //First Rx data is garbage data
// printf("Rx0: %c Tx0: %c Rx1: %c Tx1: %c\n", rSPRDAT0, *spi0TxStr, rSPRDAT1, *spi1TxStr);
// printf("Rx1: %c Tx1: %c\n", rSPRDAT1, *spi1TxStr);
if((*spi0TxStr!='\0') && (*spi1TxStr!='\0'))
{
rSPTDAT1=*spi1TxStr++;
rSPTDAT0=*spi0TxStr++;
rINTMSK&=~BIT_IIC_SPI;
rINTSUBMSK&=~BIT_SUB_SPI0;
rINTSUBMSK&=~BIT_SUB_SPI1;
}
else
{
rINTMSK|=BIT_IIC_SPI;
rINTSUBMSK|=BIT_SUB_SPI0;
rINTSUBMSK|=BIT_SUB_SPI1;
end0SpiTx=1;
end1SpiTx=1;
}
}
void Test_Spi01_MS_Int(void)
{
char *rx0Str,*tx0Str;
char *rx1Str,*tx1Str;
int i;
SPI_Port_Set();
SPI0_Port_Init(1); // SPI0=Master
SPI1_Port_Init(0); // SPI1=Slave
printf("[SPI0(Master), SPI1(Slave) Interrupt Rx/Tx test]\n");
printf("Connect J29: (2-3) and CON28: (2-3)\n");
pISR_IIC_SPI=(unsigned)Spi10_Int;
end0SpiTx=0;
end1SpiTx=0;
spi0TxStr="!@#$%^&*()_+|<>?:~ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
spi1TxStr="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+|<>?:~";
spi0RxStr=(char *) SPI_BUFFER0;
spi1RxStr=(char *) SPI_BUFFER1;
tx0Str=(char *)spi0TxStr;
rx0Str=(char *)spi0RxStr;
tx1Str=(char *)spi1TxStr;
rx1Str=(char *)spi1RxStr;
i = ClockSelection();
rSPPRE1=i; //if PCLK=50Mhz,SPICLK=12.5Mhz
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);//SPI1 :int,dis-SCK,slave,low,A,normal
printf("Slave setting end...Press enter\n");
getchar();
rSPPRE0=i; //if PCLK=50Mhz,SPICLK=12.5Mhz
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
rSPCON0=(1<<5)|(1<<4)|(1<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(0<<0);//SPI0 :int,en-SCK,master,low,A,normal
printf("nSS is asserted\n");
Master_nSS_Con0(0); // Activate nSS
rINTMSK&=~(BIT_IIC_SPI);
rINTSUBMSK&=~(BIT_SUB_SPI0);
rINTSUBMSK&=~(BIT_SUB_SPI1);
while((end1SpiTx==0)||(end0SpiTx==0))
{
//printf("#");
if(Uart_GetKey())
return;
}
Master_nSS_Con0(1);
rSPCON0=(0<<5)|(0<<4)|(1<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
rSPCON1=(0<<5)|(0<<4)|(0<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//Poll,dis-SCK,slave,low,A,normal
*spi0RxStr='\0';//attach End of String(Null)
*spi1RxStr='\0';//attach End of String(Null)
printf("SPI0Tx Strings:%s\n",tx0Str);
printf("SPI0Rx Strings:%s\n",rx0Str+1);//remove first dummy data
printf("SPI1Tx Strings:%s\n",tx1Str);
printf("SPI1Rx Strings:%s\n",rx1Str+1);//remove first dummy data
if(strcmp((rx1Str+1),tx0Str)==0)
printf("SPI0 test O.K !!!\n");
if(strcmp((rx0Str+1),tx1Str)==0)
printf("SPI1 test O.K !!!\n");
else
printf("ERROR!!!\n");
SPI_Port_Return();
}
void Test_Spi01_SM_Int(void) //SPI0: Slave Rx, SPI1:Master Tx
{
char *rx0Str,*tx0Str;
char *rx1Str,*tx1Str;
int i;
SPI_Port_Set();
SPI0_Port_Init(0); // SPI0=Master, SPI1=Slave
SPI1_Port_Init(1); // SPI0=Master, SPI1=Slave
printf("[SPI0(Slave), SPI1(Master) Interrupt Rx/Tx test]\n");
printf("Connect J29: (2-3) and CON28: (2-3)\n");
pISR_IIC_SPI=(unsigned)Spi01_Int;
end0SpiTx=0;
end1SpiTx=0;
spi0TxStr="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+|<>?:~";
spi1TxStr="!@#$%^&*()_+|<>?:~ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
spi0RxStr=(char *) SPI_BUFFER0;
spi1RxStr=(char *) SPI_BUFFER1;
tx0Str=(char *)spi0TxStr;
rx0Str=(char *)spi0RxStr;
tx1Str=(char *)spi1TxStr;
rx1Str=(char *)spi1RxStr;
i = ClockSelection();
rSPPRE0=i; //if PCLK=50Mhz,SPICLK=12.5Mhz
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);//SPI0 :int,dis-SCK,slave,low,A,normal
printf("Slave setting end...Press enter\n");
getchar();
rSPPRE1=i; //if PCLK=50Mhz,SPICLK=12.5Mhz
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);//SPI1 :int,en-SCK,master,low,A,normal
printf("nSS is asserted\n");
Master_nSS_Con1(0); // Activate nSS
rINTMSK&=~(BIT_IIC_SPI);
rINTSUBMSK&=~(BIT_SUB_SPI0);
rINTSUBMSK&=~(BIT_SUB_SPI1);
while((end1SpiTx==0)||(end0SpiTx==0))
{
//printf("#");
if(Uart_GetKey())
return;
}
Master_nSS_Con1(1);
rSPCON0=(0<<5)|(0<<4)|(1<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
rSPCON1=(0<<5)|(0<<4)|(0<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//Poll,dis-SCK,slave,low,A,normal
*spi0RxStr='\0';//attach End of String(Null)
*spi1RxStr='\0';//attach End of String(Null)
printf("SPI0Tx Strings:%s\n",tx0Str);
printf("SPI0Rx Strings:%s\n",rx0Str+1);//remove first dummy data
printf("SPI1Tx Strings:%s\n",tx1Str);
printf("SPI1Rx Strings:%s\n",rx1Str+1);//remove first dummy data
if(strcmp((rx1Str+1),tx0Str)==0)
printf("SPI0 test O.K !!!\n");
if(strcmp((rx0Str+1),tx1Str)==0)
printf("SPI1 test O.K !!!\n");
else
printf("ERROR!!!\n");
SPI_Port_Return();
}
void Init_DMA_Regs(uint8 ch)
{
uint32 base,i;
base = 0x40400000+ch*0x100000;
for(i=0;i<10;i++)
*(((uint32 *)base)++) = 0;
}
void Test_SPI01_MS_DMA_TxRx(void)// SPI0=Master, SPI1=Slave
{
int i;
SPI_Port_Set();
SPI0_Port_Init(1);
SPI1_Port_Init(0);
printf("[SPI0(Slave Rx), SPI1(Master Tx) DMA test]\n");
printf("Connect J29: (2-3) and CON28: (2-3)\n");
Master_nSS_Con0(1);
rSPCON0=(0<<5)|(0<<4)|(0<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(0<<0);//poll,dis-SCK,slave,low,A,normal
rSPCON1=(0<<5)|(0<<4)|(0<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//poll,dis-SCK,slave,low,A,normal
tx0_ptr=(unsigned char *) DMA1_TxBUFFER0;
for(i=0; i<SPITX_COUNT; i++)
*(tx0_ptr+i)=i+1;
rx1_ptr=(unsigned char *)DMA3_RxBUFFER1;
for(i=0;i<(SPIRX_COUNT+2);i++)
*(rx1_ptr+i)=0x0; // Zero Initialize
rx_dma3Done=0;
tx_dma1Done=0;
pISR_DMA_SBUS= (unsigned)DmaTx_Int;
rINTMSK=~(BIT_DMA_SBUS);
rINTSUBMSK=~(BIT_SUB_DMA1);
//Step1. SPI init
i = ClockSelection();
rSPPRE1=i; //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)|(1<<0);//DMA1,dis-SCK,slave,low,A,normal
rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
//Step2. DMA3 init
Init_DMA_Regs(3);
rDISRC3=(unsigned)0x44500034;//Address of SPRDAT Register
rDISRCC3=(1<<1)|(1); //APB(SPI), fix
rDIDST3=(unsigned)(rx1_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)|(SPIRX_COUNT);
rDMAREQSEL3=(1<<1)|(1<<0);
rDMASKTRIG3=0x02; //run DMA3
printf("Slave setting......end\n");
getchar();
pISR_DMA_SBUS= (unsigned)DmaTx_Int;
rINTMSK=~(BIT_DMA_SBUS);
rINTSUBMSK=~(BIT_SUB_DMA3);
//Step1. SPI init
rSPPRE0=i; //if PCLK=50Mhz,SPICLK=25Mhz
rSPCON0=(2<<5)|(1<<4)|(1<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(0<<0);//DMA1,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. DMA1 init
Init_DMA_Regs(1);
rDISRC1=(unsigned)tx0_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)|(SPITX_COUNT);
rDMAREQSEL1=(0<<1)|(1<<0);
rDMASKTRIG1=0x02; //run, DMA1 channel on, no-sw trigger
while((tx_dma1Done==0)||(rx_dma3Done==0))
{
if(Uart_GetKey())
break;
}
printf("Check TC1=%x, TC3=%x\n",rDSTAT1,rDSTAT3);
while(!(rSPSTA0&0x1))// Tx
{
if(Uart_GetKey())
break;
}
*(rx1_ptr+SPIRX_COUNT) = rSPRDAT1;
Master_nSS_Con0(1);
printf("tx_dma3Done=%x, rx_dma1Done=%x\n",tx_dma3Done,rx_dma1Done);
rSPCON0=(0<<5)|(0<<4)|(0<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(0<<0);//poll,dis-SCK,slave,low,A,normal
rSPCON1=(0<<5)|(0<<4)|(0<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//poll,dis-SCK,slave,low,A,normal
printf("\nDMA1 data(TX)\n");
for(i=0; i<SPITX_COUNT; i++)
{
printf("0x%02x,",*tx0_ptr++);
if(((i+1)%16)==0)
printf("\n");
}
printf("\n");
rx1_ptr=(unsigned char *) DMA3_RxBUFFER1;
*(rx1_ptr+SPIRX_COUNT+1) = rSPRDAT1;
printf("\nDMA3 data(RX)\n");
for(i=2;i<(SPIRX_COUNT+2);i++)
{
printf("0x%02x,",*(rx1_ptr+i));
if(((i-1)%16)==0)
printf("\n");
}
SPI_Port_Return();
}
///////////////////////////////////////////////////////////////////////////
void Test_SPI01_MS_DMA_RxTx(void)// SPI0=Master(Rx), SPI1=Slave(Tx)
{
int i;
SPI_Port_Set();
SPI0_Port_Init(1); // Spi0=Slave(nSS)
SPI1_Port_Init(0); // Spi1=master
printf("[SPI0(Master Tx), SPI1(Slave Rx) DMA test]\n");
printf("Connect J29: (2-3) and CON28: (2-3)\n");
Master_nSS_Con0(1);
rSPCON0=(0<<5)|(0<<4)|(0<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(0<<0);//poll,dis-SCK,slave,low,A,normal
rSPCON1=(0<<5)|(0<<4)|(0<<3)|(SPI1_POLARITY<<2)|(SPI1_FORMAT<<1)|(0<<0);//poll,dis-SCK,slave,low,A,normal
tx1_ptr=(unsigned char *) DMA3_TxBUFFER1;
for(i=0; i<SPITX_COUNT; i++)
*(tx1_ptr+i)=i+1;
rx0_ptr=(unsigned char *) DMA1_RxBUFFER0;
for(i=0;i<(SPIRX_COUNT+2);i++)
*(rx0_ptr+i)=0x0; // Zero Initialize
rx_dma1Done=0;
tx_dma3Done=0;
pISR_DMA_SBUS= (unsigned)DmaTx_Int;
rINTMSK=~(BIT_DMA_SBUS);
rINTSUBMSK=~(BIT_SUB_DMA1);
//Step1. SPI init
i = ClockSelection();
rSPPRE0=i; //if PCLK=50Mhz,SPICLK=25Mhz
printf("SPI clock is %3.2fMHz!!\n", (float)((PCLK)/(2*(rSPPRE0+1)))/1000000 );
rSPCON0=(2<<5)|(1<<4)|(1<<3)|(SPI0_POLARITY<<2)|(SPI0_FORMAT<<1)|(1<<0);//DMA1,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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -