📄 spi.c
字号:
void __irq Spi0_M_Int(void)
{
ClearPending(BIT_SPI0);
c0++;
if(*spi0TxStr!='\0') {
WrSPTDAT0(*spi0TxStr++);
*spi0RxStr++=RdSPRDAT0(); //First Rx data is garbage data
}
else
endSpi0Tx=1;
if(DCOL0) printf("Data Collision or Multi Master Error!!!\n");
}
void Test_SPI0_S_int(void)// SPI0=Slave
{
char *txStr,*rxStr;
c0=0;
printf("[SPI0(Slave Rx) Interrupt test]\n");
ElaseRxReg();
endSpi0Tx=0;
spi0TxStr="zxyvwturspqnolmjkhifgdebcaZXYVWTURSPQNOLMJKHIFGDEBCA8967452301";
spi0RxStr=(char *) SPI_BUFFER0; // Rx Buffer to receive
txStr=(char *)spi0TxStr;
rxStr=(char *)spi0RxStr;
SPI_Port_Init(0);
SPI_Baud_Rate_Set(SPI_CHANNEL0, 25000000); // SPI Channel 0, 25MHz
rSPCON0=(1<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//Interrupt,dis-SCK,slave,low,A,normal
rSPPIN0=(0<<2)|(1<<0);//dis-ENMUL,KEEP
pISR_SPI0=(unsigned)Spi0_S_Int;
rINTMSK&=~(BIT_SPI0);
while(endSpi0Tx==0);
rINTMSK|=(BIT_SPI0);
*spi0RxStr++=RdSPRDAT0(); // Get last rx data
*spi0RxStr='\0'; // attach End of String(Null)
rxStr+=2; // remove first dummy
printf("Tx Strings:%s\n",txStr);
printf("Rx Strings:%s :",rxStr);
if(strcmp(rxStr,txStr)==0) printf("O.K.\n");
else printf("ERROR!!!\n");
SPI_Port_Return();
printf("c0=%d\n",c0);
}
void __irq Spi0_S_Int(void)
{
ClearPending(BIT_SPI0);
c0++;
*spi0RxStr++=RdSPRDAT0(); //First Rx data is garbage data
if(*spi0TxStr!='\0') {
WrSPTDAT0(*spi0TxStr++);
}
else
endSpi0Tx=1;
if(DCOL0) printf("Data Collision or Multi Master Error!!!\n");
}
void __irq spi_slave_int0(void)
{
ClearPending(BIT_SPI0);
interrupt_count[0]++;
*rx_ptr[0]++=RdSPRDAT0(); //First Rx data is garbage data
WrSPTDAT0(*tx_ptr[0]++);
if(DCOL0)
printf("Data Collision or Multi Master Error!!!\n");
}
void __irq spi_slave_int1(void)
{
ClearPending(BIT_SPI1);
interrupt_count[1]++;
*rx_ptr[1]++=RdSPRDAT1(); //First Rx data is garbage data
WrSPTDAT1(*tx_ptr[1]++);
if(DCOL1)
printf("Data Collision or Multi Master Error!!!\n");
}
void __irq spi_master_int0(void)
{
ClearPending(BIT_SPI0);
interrupt_count[0]++;
WrSPTDAT0(*tx_ptr[0]++);
*rx_ptr[0]++=RdSPRDAT0(); //First Rx data is garbage data
if(DCOL0) printf("Data Collision or Multi Master Error!!!\n");
}
void __irq spi_master_int1(void)
{
ClearPending(BIT_SPI1);
interrupt_count[1]++;
WrSPTDAT1(*tx_ptr[1]++);
*rx_ptr[1]++=RdSPRDAT1(); //First Rx data is garbage data
if(DCOL1) printf("Data Collision or Multi Master Error!!!\n");
}
void Test_SPI0_M_Tx_DMA(void)// SPI0=Master
{
int i;
SPI_Port_Init(0); // SPI0=Master, SPI1=Slave
printf("[One Board SPI0(Master Tx), Another Board SPI0(Slave Rx) DMA test]\n");
printf("First Slave is ready? Press any key, Start\n");
getchar();
SPI_Baud_Rate_Set(SPI_CHANNEL0,1000000);
rSPPIN0=(1<<3)|(1<<1)|(1<<0);//Keep
rSPCON0=(2<<5)|(1<<4)|(1<<3)|(0<<2)|(0<<1)|(0<<0);//DMA,en-SCK,master,low,A,normal
Master_nSS_Con(0); // Activate nSS
Test_Spi0_M_Tx_DMA1_Set();//Master DMA1 setting
while(tx_dma1Done==0) {
if(Uart_GetKey())
break;
}
printf("Check TC1=%x, TC3=%x\n",rDSTAT1,rDSTAT3);
printf("tx_dma1Done=%x, rx_dma3Done=%x\n",tx_dma1Done,rx_dma3Done);
while(!(rSPSTA0&0x1)) {// Tx is done
if(Uart_GetKey())
break;
}
Master_nSS_Con(1);
rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
for(i=0; i<spitx_count; i++) {
printf("0x%04x : ",i);
printf("0x%02x\n",*tx_ptr[0]);
tx_ptr[0]++;
if(Uart_GetKey()) getchar();
}
SPI_Port_Return();
}
void Test_SPI0_S_Rx_DMA(void)// SPI0=Master, SPI1=Slave
{
int i;
SPI_Port_Init(1);
printf("[One Board SPI0(Master Tx), Another Board SPI0(Slave Rx) DMA test]\n");
SPI_Baud_Rate_Set(SPI_CHANNEL0,1000000);
rSPPIN0=(1<<1)|(1<<0);//Keep
rSPCON0=(1<<7)|(3<<5)|(0<<4)|(0<<3)|(0<<2)|(0<<1)|(0<<0);//DMA,dis-SCK,slave,low,A,normal
Test_Spi0_S_Rx_DMA3_Set();//Slave DMA3setting
while(rx_dma3Done==0) {
if(Uart_GetKey())
break;
}
while(!(TXFIFOEMPTY0)); // Wait for FIFO clear
printf("Check TC1=%x, TC3=%x\n",rDSTAT1,rDSTAT3);
printf("tx_dma1Done=%x, rx_dma3Done=%x\n",tx_dma1Done,rx_dma3Done);
while(!(rSPSTA0&0x1)) {// Tx/Rx is done
if(Uart_GetKey())
break;
}
rSPCON0=(0<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,slave,low,A,normal
*(rx_ptr[0]+spirx_count+1)=rSPRDATB0;
rx_ptr[0]=(unsigned char *) DMA3_RxBUFFER1;
for(i=0; i<spitx_count; i++) {
printf("0x%04x : ",i);
printf("0x%02x\n",*(rx_ptr[0]+i+2));
if(Uart_GetKey()) getchar();
}
SPI_Port_Return();
}
void Test_SPI0_M_Rx_DMA(void)// SPI0=Master
{
int i;
SPI_Port_Init(0); // SPI0=Master, SPI1=Slave
printf("[One Board SPI0(Master Rx), Another Board SPI0(Slave Tx) DMA test]\n");
printf("First Slave is ready? Press any key, Start\n");
getchar();
SPI_Baud_Rate_Set(SPI_CHANNEL0,1000000);
rSPPIN0=(1<<3)|(1<<1)|(1<<0);//Keep
rSPCON0=(1<<7)|(3<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(1<<0);//DMA,en-SCK,master,low,A,TAGD
Master_nSS_Con(0); // Activate nSS
Test_Spi0_M_Rx_DMA3_Set();//Master DMA1 setting
while(rx_dma3Done==0) {
if(Uart_GetKey())
break;
}
printf("Check TC1=%x, TC3=%x\n",rDSTAT1,rDSTAT3);
printf("tx_dma1Done=%x, rx_dma3Done=%x\n",tx_dma1Done,rx_dma3Done);
while(!(rSPSTA0&0x1)) {// Tx is done
if(Uart_GetKey())
break;
}
Master_nSS_Con(1);
rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
for(i=0; i<spitx_count; i++) {
printf("0x%04x : ",i);
printf("0x%02x\n",*(rx_ptr[0]+i+2));
if(Uart_GetKey()) getchar();
}
SPI_Port_Return();
}
void Test_SPI0_S_Tx_DMA(void)// SPI0=Master
{
int i;
SPI_Port_Init(0); // SPI0=Master, SPI1=Slave
printf("[One Board SPI0(Master Rx), Another Board SPI0(Slave Tx) DMA test]\n");
SPI_Baud_Rate_Set(SPI_CHANNEL0,1000000);
rSPPIN0=(0<<3)|(1<<1)|(1<<0);//Keep
rSPCON0=(2<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//DMA,en-SCK,master,low,A,TAGD
Test_Spi0_S_Tx_DMA1_Set();//Master DMA1 setting
while(tx_dma1Done==0) {
if(Uart_GetKey())
break;
}
printf("Check TC1=%x, TC3=%x\n",rDSTAT1,rDSTAT3);
printf("tx_dma1Done=%x, rx_dma3Done=%x\n",tx_dma1Done,rx_dma3Done);
while(!(rSPSTA0&0x1)) {// Tx is done
if(Uart_GetKey())
break;
}
rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
for(i=0; i<spitx_count; i++) {
printf("0x%04x : ",i);
printf("0x%02x\n",*tx_ptr[0]);
tx_ptr[0]++;
if(Uart_GetKey()) getchar();
}
SPI_Port_Return();
}
void Test_Spi0_S_Tx_DMA1_Set(void)
{
int i;
tx_ptr[0]=(unsigned char *) DMA1_TxBUFFER0; //Tx0 Address Mapping
for(i=0; i<spitx_count; i++)
*(tx_ptr[0]+i)=i; // Tx Data Initialize
tx_dma1Done=0; // DMA is not done
pISR_DMA1 = (unsigned)Dma1Tx_Int; // DMA1 ISR Address Mapping
rINTMSK&=~(BIT_DMA1); // Interrupt Mask Disable, Interrupt Enable
rDISRC1=(unsigned)tx_ptr[0]; //Source Address of Memory
rDISRCC1=(0<<1)|(0); //AHB(Memory), inc
rDIDST1=(unsigned)0x59000010; //Destination 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); // HWSRC SPI0 TX
rDMASKTRIG1=(0<<2)|(1<<1)|(0); //run, DMA1 channel on, no-sw trigger
// printf("Check TC1=%x\n",rDSTAT1);
// printf("**DMA1 setting end**\n");
}
void Test_Spi0_M_Rx_DMA3_Set(void)
{
int i;
rx_ptr[0]=(unsigned char *) DMA3_RxBUFFER1; // Rx1 Address Mapping
for(i=0;i<spirx_count+11;i++)
*(rx_ptr[0]+i)=0x0; // Zero Initialize
rx_dma3Done=0;
pISR_DMA3 = (unsigned)Dma3Rx_Int;
rINTMSK&=~(BIT_DMA3);
rDISRC3=(unsigned)0x59000020; //Address of SPRDATB0 Register
rDISRCC3=(1<<1)|(1); //APB(SPI), fix
rDIDST3=(unsigned)rx_ptr[0]; //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+2);
rDMAREQSEL3=(1<<1)|(1<<0);
rDMASKTRIG3=(0<<2)|(1<<1)|(0); //run, DMA1 channel on, no-sw trigger
}
void Test_Spi0_M_Tx_DMA1_Set(void)
{
int i;
tx_ptr[0]=(unsigned char *) DMA1_TxBUFFER0; //Tx0 Address Mapping
for(i=0; i<spitx_count; i++)
*(tx_ptr[0]+i)=i; // Tx Data Initialize
tx_dma1Done=0; // DMA is not done
pISR_DMA1 = (unsigned)Dma1Tx_Int; // DMA1 ISR Address Mapping
rINTMSK&=~(BIT_DMA1); // Interrupt Mask Disable, Interrupt Enable
rDISRC1=(unsigned)tx_ptr[0]; //Source Address of Memory
rDISRCC1=(0<<1)|(0); //AHB(Memory), inc
rDIDST1=(unsigned)0x59000010; //Destination 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); // HWSRC SPI0 TX
rDMASKTRIG1=(0<<2)|(1<<1)|(0); //run, DMA1 channel on, no-sw trigger
// printf("Check TC1=%x\n",rDSTAT1);
// printf("**DMA1 setting end**\n");
}
void Test_Spi0_S_Rx_DMA3_Set(void)
{
int i;
rx_ptr[0]=(unsigned char *) DMA3_RxBUFFER1; // Rx1 Address Mapping
for(i=0;i<spirx_count+11;i++)
*(rx_ptr[0]+i)=0x0; // Zero Initialize
rx_dma3Done=0;
pISR_DMA3 = (unsigned)Dma3Rx_Int;
rINTMSK&=~(BIT_DMA3);
rDISRC3=(unsigned)0x59000020; //Address of SPRDATB0 Register
rDISRCC3=(1<<1)|(1); //APB(SPI), fix
rDIDST3=(unsigned)rx_ptr[0]; //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+1);
rDMAREQSEL3=(1<<1)|(1<<0);
rDMASKTRIG3=(0<<2)|(1<<1)|(0); //run, DMA1 channel on, no-sw trigger
}
void Test_SPI0_M_DMA_FIFO(void)// SPI0=Master
{
int i;
SPI_Port_Init(0); // SPI0=Master, SPI1=Slave
printf("[One Board SPI0(Master Tx), Another Board SPI0(Slave Rx) DMA test]\n");
printf("First Slave is ready? Press any key, Start\n");
getchar();
rSPCON0=(1<<11)|(1<<10); // FIFO Clear
while((rSPCON0>>10)&0x3 == 3); // Wait for FIFO clear
SPI_Baud_Rate_Set(SPI_CHANNEL0,25000000);
Test_Spi0_M_Tx_DMA1_FIFO_Set();//Master DMA1 setting
Master_nSS_Con(0); // Activate nSS
rSPPIN0=(1<<3)|(1<<0); //Feedback Enable, Keep
rSPFIC0=(2<<8); // TX FIFO DMA Ctl(Tx Fifo Empty)
rSPCON0=(1<<8)|(0<<7)|(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//DMA,en-SCK,master,low,A,normal
while(tx_dma1Done==0) {
if(Uart_GetKey())
break;
}
// while(!(TXFIFOEMPTY0)); // Wait for FIFO Empty State
printf("Check TC1=%x, TC3=%x\n",rDSTAT1,rDSTAT3);
printf("tx_dma1Done=%x, rx_dma3Done=%x\n",tx_dma1Done,rx_dma3Done);
// while(!(rSPSTA0&0x1)) {// Tx is done
// if(Uart_GetKey())
// break;
// }
Master_nSS_Con(1);
rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
for(i=0; i<spitx_count*4; i++) {
printf("0x%04x : ",i);
printf("0x%02x\n",*tx_ptr[0]);
tx_ptr[0]++;
if(Uart_GetKey()) getchar();
}
SPI_Port_Return();
}
void Test_Spi0_M_Tx_DMA1_FIFO_Set(void)
{
int i;
tx_ptr[0]=(unsigned char *) DMA1_TxBUFFER0; //Tx0 Address Mapping
for(i=0; i<spitx_count*4; i++) {
// *(tx_ptr[0]+i)=i; // Tx Data Initialize
if(i&0x1) *(tx_ptr[0]+i)=0x55;
else *(tx_ptr[0]+i)=0xaa;
}
tx_dma1Done=0; // DMA is not done
pISR_DMA1 = (unsigned)Dma1Tx_Int; // DMA1 ISR Address Mapping
rINTMSK&=~(BIT_DMA1); // Interrupt Mask Disable, Interrupt Enable
rDISRC1=(unsigned)tx_ptr[0]; //Source Address of Memory
rDISRCC1=(0<<1)|(0); //AHB(Memory), inc
rDIDST1=(unsigned)0x59000018; //Destination Address of SPTXFIFO0 Register
rDIDSTC1=(1<<1)|(1); //APB(SPI), fix
rDCON1=(0<<31)|(0<<30)|(1<<29)|(1<<28)|(0<<27)|(1<<22)|(0<<20)|(spitx_count); // Demand mode, Burst Transfer
rDMAREQSEL1=(0<<1)|(1<<0); // HWSRC SPI0 TX
rDMASKTRIG1=(0<<2)|(1<<1)|(0); //run, DMA1 channel on, no-sw trigger
}
void Test_SPI0_S_DMA_FIFO(void)// SPI0=Master, SPI1=Slave
{
int i;
SPI_Port_Init(1);
printf("[One Board SPI0(Master Tx), Another Board SPI0(Slave Rx) DMA test]\n");
rSPCON0=(1<<11)|(1<<10); // FIFO Clear
while((rSPCON0>>10)&0x3 == 3); // Wait for FIFO clear
SPI_Baud_Rate_Set(SPI_CHANNEL0,25000000);
Test_Spi0_S_Rx_DMA3_FIFO_Set();//Slave DMA3setting
rSPPIN0=(1<<1)|(1<<0);//CS inactive, Keep
rSPFIC0=(2<<10); // RX FIFO DMA Ctl(Rx Fifo Almost Empty)
rSPCON0=(1<<14)|(1<<9)|(1<<7)|(0<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//DMA,dis-SCK,slave,low,A,normal
while(rx_dma3Done==0) {
if(Uart_GetKey())
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -